使用LL库开发STM32:UART进阶使用(DMA循环接收 + UART空闲中断)

目的

在前面文章 《使用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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值