最近使用h743做串口空闲中断+dma的配置,发现网上的资料参差不齐,有的很繁杂。自己配置出来之后对其做一个记录,方便之后查阅。
CUBEMX配置
选择时钟源
配置时钟
①②选好之后,在③处输入你想要配置 时钟总频按回车系统会自动配置
串口配置
io口配置
工程使用的是usart3,选用PC10和PC11两个IO口;
使用推挽输出,配置上拉
DMA配置
RX的DMA选用连续转换,TX用单次转换就好了。DMA通道自己选用,本工程使用的2-0和2-1;
usart配置
使用默认配置即可,波特率自己选择
485使能引脚选择
此处选择默认输出电平是,按照自己的485芯片选择接收电平。我使用的低电平接收信号,因此此处为默认低电平;
生成代码
代码编写
DMA接收
在usart.c中,找到usart3的初始化函数,使用“HAL_UARTEx_ReceiveToIdle_DMA”函数去完成DMA接收,这个函数的描述呢如下,函数自身就有空闲检测功能,可以代替上面的打开空闲中断以及DMA接收;为了方便,工程直接使用的该函数。有大佬也可指出二者具体的不同,笔者功力不深理解不太到位
接收回调函数
看到优快云上大部分文章都还在是usart中断中手动去读标志位,读数据,然后清除标志位,很不理解在HAL库生成的公用中断中已经有清除标志位以及读标志位的代码了,直接调用中断回调函数即可
在中断中停止DMA接收,如果不停止DMA接收,下一次接收到的数据会接在上一次的后面进行:先接收一个10字节数据,然后再接收一个3字节数据就能看到第二次接收的数据在接收数组的第11个元素开始而非第一个元素,关闭DMA可以确保每次接收到的数据从数组的第一个元素开始放置。
将接收标志位置1,将接收缓冲区复制到数据处理数组中,然后清空接收缓冲区;
在回调函数中尽可能得少放置执行代码。
数据处理
在main函数中,当接收标志为1的时候,u3_cs为高电平,然后是使用DMA发送发送缓冲区中的值;
发送回调函数
在发送回调函数中做一些处理工作,然后重新打开DMA接收;
注意
1.以上为本项目中的配置,为了更直观的对整体流程有个印象,工作者不可能接收完成之后,等数据处理完成发送之后再次去打开dma接收,在哪里去打开DMA接收就要看使劲情况了
2.以上为默认MPU配置,即不对MPU做任何修改的配置,如果对MPU进行了配置,还需添加如下代码才能读到DMA值。
具体到哪个地址,看自己配置的MPU块区,以及STM32H743的内存地址分区。