UAER问题+修复小bug

核心结论(死记这两句)

  1. . :结构体 变量 直接用,取成员
  2. ->:结构体 指针 专用,取成员

1. 符号 . (点)

使用场景 :你定义的是结构体普通变量
直接访问它的成员,和地址无关

cs 复制代码
// 定义一个结构体变量(STM32常用)
TIM_HandleTypeDef htim2;  

// 用 . 访问成员
htim2.Instance = TIM2;   
htim2.Init.Prescaler = 0;

2. 符号 -> (箭头)

使用场景 :你定义的是结构体指针
作用:指针指向的结构体对象的成员
等价于 (*指针).成员

cs 复制代码
// 定义结构体指针
TIM_HandleTypeDef *p_tim = &htim2;  

// 用 -> 访问成员(指针专用)
p_tim->Instance = TIM2; 
// 等价于 (*p_tim).Instance = TIM2;

纠正小误区

❌ 说:->是需要指向结构体成员的地址
✅ 正确说法:
-> 是结构体指针 用来访问成员的符号,不是取地址
取地址用的是 &,和 -> 没关系!


终极口诀(STM32通用)

变量用点 . ,指针用箭头 ->


举个代码里的例子

cs 复制代码
// 这是结构体变量 → 用 .
WS2812_HandleTypeDef ws2812;
ws2812.tim = &htim2;

// 这是结构体指针 → 用 ->
WS2812_HandleTypeDef *p_ws = &ws2812;
p_ws->tim = &htim2;

我们不让他累加,收到什么就发送什么。

这样子看起来挺正常的。

如果我们吧这个数值修改为10,就发现bug了。

还可能有的问题。

我们需要修改这里,来使得我们的接收DMA进入循环模式。我们不要让程序来启动DMA,要用硬件来启动DMA。

开启硬件DMA之后,我们就可以看到,就不需要我们手动开启DMA了。

只需要我们再接收时候,开启一次DMA就可以了。以后都由硬件帮我们启动DMA。我们现在第一次设置的字节是100,当我们接收的数据超过100之后,硬件就会帮我们启动DMA。

这个函数还是用来处理三种中断。

我们也可以导入我们的工程。

记得晶振要配置为72Mhz。

有点小问题,但是我们应该可以以后用到时候,进行一下处理,我们先看一看增加串口3的通信。

打开这个USART3。

异步串口。

添加DMA,接收的话,用循环DMA。

发送的话正常就可以了。

要开启全局中断。

可以看到串口1和串口3都被初始化了。

我们增加串口 3 的结构体。

我们跳转一下定义,发现有这个句柄就可以。

我们再默认任务里面,打开串口 3。

我们还需要再数组放入我们的句柄。

编译发现一个错误,我们来解决一下。所的是串口3未定义,我们需要声明一下。

就和串口1一样的进行声明。

还有变量也要声明。

然后再发送完成,添加接收的函数。

之后所有的判断是huart1的代码,都要加一份huart3。

DMA的初始化。

然后因为,串口3是一个结构体,他不是指针,所以我们改为这个。

之后编译发现没有错误和警告。

我们可以看到,发送什么就可以收到什么。

相关推荐
星幻元宇VR2 小时前
VR校园安全学习机:让安全意识从“心”出发
科技·学习·安全·vr·虚拟现实
烤麻辣烫2 小时前
算法--二分搜索
java·开发语言·学习·算法·intellij-idea
kyriewen112 小时前
Next.js:让你的React应用从“裸奔”到“穿衣服”
开发语言·前端·javascript·react.js·设计模式·ecmascript
代码丰2 小时前
Github高赞项目50K learn-claude-code 的学习笔记总结
笔记·学习·github
MXN_小南学前端2 小时前
基于 Vue3 + ECharts 的数据大屏实例(提供gitHub仓库地址)
前端·javascript·echarts
嵌入式的飞鱼2 小时前
SD NAND vs eMMC:嵌入式存储方案怎么选?
嵌入式硬件·mcu·sd nand
三品吉他手会点灯2 小时前
C语言学习笔记 - 18.C编程预备计算机专业知识 - 什么是变量
c语言·开发语言·笔记·学习
宁雨桥2 小时前
for of,for in以及传统for循环的区别与不同场景下的使用选择
前端·javascript
被放养的研究生2 小时前
WPS 通配符神技:一键上标参考文献 + 中英文自动加空格
笔记·排版·wps·通配符