标题HAL库STM32f407ZGT6实现串口空闲中断联合DMA中断接收数据,DMA非中断模式发送数据
我用的MCU是STM32F407ZGT6, 用的是MCU的UASRT1
首先用CubeMX配置基本的驱动代码,配置步骤参考文章链接:
https://blog.csdn.net/CSDN_Xu_xue/article/details/104403532
https://blog.csdn.net/weixin_43864631/article/details/125855290
用KEIL打开cubemx生成的工程中的 Application/User/Core 文件夹下的 stm32f4xx_it.c 文件,把DMA发送完成中断函数注释掉:
再打开 Application/User/Core 文件夹下的dma.c 文件,把 DMA发送完成中断 的中断配置注释掉,即不开启发送完成中断;
在 Application/User/Core 文件夹下的usart.c 文件中添加用来存放接收数据的数组,再加上DMA要发送的数据的长度的变量dat_len;
在 Application/User/Core 文件夹下的usart.h 文件中定义接收数据的数组的大小(最大是65535);
在 Application/User/Core 文件夹下的usart.c 文件中添加空闲中断DMA函数HAL_UARTEx_ReceiveToIdle_DMA(); 并且关闭DMA传输一半中断;
( 为什么你的库没有HAL_UARTEx_ReceiveToIdle_DMA()函数,参考这个链接: https://blog.csdn.net/weixin_46251230/article/details/126729795 )
为什么关闭传输一半中断,我是参考的这个链接:
( 链接找不到了 )
在 Application/User/Core 文件夹下的usart.c 文件中添加空闲中断回调函数HAL_UARTEx_RxEventCallback();
此外可以在main函数里面加入led翻转指示系统正常运行:
经过测试,发送很少数据时很快就会回传至上位机,发送很多,比如 12363 字节,就要等几秒,可能是因为串口就只有一根线,发送数据量越大,就越慢
可修改接受数组rx_buffer[arr_size]的arr_size大小来接收更多的数据,但是要在65535之内。
我参考的文章链接:
提出了使用hal库的HAL_UARTEx_ReceiveToIdle_DMA()函数,以及关闭DMA半字节中断
提出了使用hal库的HAL_UARTEx_ReceiveToIdle_DMA()函数,以及它的空闲中断回调函数
这篇文章对于DMA传输完成以及空闲中断的描述写的很好,我看了好几遍才懂
如果大家有什么地方有疑惑,喜欢可以批评指正!
keil5工程链接:
链接 https://pan.baidu.com/s/1CwIdCz-qc2BYDKCjxzoRhg?pwd=k3sx
提取码:k3sx