目的
在前面文章 《使用LL库开发STM32:UART基础使用》 中介绍了使用LL库开发UART的一些基本操作。实际使用中直接这么使用还是不太方便的,也会遇到很多问题,这篇文章就稍稍说一些更进一步的使用方法。
注1:在STM32开发时因为默认分配的堆内存不大,我个人比起使用malloc或是new方法申请内存,更多的喜欢把数据放在静态区域;(这样编译的时候也可以看到内存占用情况)
注2:本文中有些功能使用C++作为演示,实际使用中也可以自行改为纯C代码实现;
发送处理
STM32中UART发送数据最好用的方式就是通过DMA发送数据了,这种方式下只要指定要发送的数据的地址和数据长度,DMA就会依次自动将数据传输到UART上发送出去。但这个方式方便归方便,但稍稍还是会存在一点点问题的,所以需要进一步处理。相关内容可以参考 《使用HAL库开发STM32:UART进阶使用》 这篇文章中 《发送处理》 章节。
另外HAL库中UART通过DMA发送数据只需要一个函数就能搞定,但在LL库中每次重新发送数据就需要好几个函数同时操作了,主要步骤如下:
- 清除DMA传输完成中断;
- 失能DMA流或通道数据传输;
- 设置要传输的数据地址与数据长度;
- 使能DMA流或通道数据传输;
为了方便使用我对此进行了简单的封装,可以在本篇文章末尾的链接查看代码、例程、说明。(参考 lib_hal_uart 中 Lib_LL_UartTx 类)
数据接收与解析
和发送相比UART接收到真正使用更加麻烦点,因为接收的时候会有更多不确定性,数据长度不定、数据传输出错等等各种问题。一般的串口通讯中会制定一些带有校验功能的协议,只有接收到符合协议的数据才进行响应。一般的来说数据接收可以按下面方式处理:
在STM32单片机中我一般使用 DMA循环接收 + UART空闲中断
的方式来处理这块业务:
- 声明一个静态数组作为数据缓存,DMA循环将收到的数据放到该缓存中;
- 然后启用UART的空闲中断,当每次进入空闲中断时对接到的数据进行解析处理;
- 如果接收到符合需求的数据则调用相应的回调函数进行处理;
对于这块操作我也进行了简单的封装,下面是个演示(可以点击查看大图),该演示中数据解析部分处理了对 Modbus-Rtu 协议格式的数据解析:
- 初始化配置
- 使用代码
- 使用演示
上面演示中的代码、例程、说明都可以在本篇文章末尾的链接查看。
总结
串口是蛮常用的功能,为了使使用时更顺手花时间整点工具还是值得的。这篇文章主要是提供了一种思路。
上面的工具与例程在这里:
https://github.com/NaisuXu/STM32-tool-library-based-on-HAL-and-LL