高级会员

- 积分
- 993
- 金钱
- 993
- 注册时间
- 2017-8-11
- 在线时间
- 137 小时
|
分享基于STM32F103ZET6战舰V3的 DMA串口通信实例(包含串口1,串口2和 串口3)
注释很清楚了,下面分享一下DMA的说明
DMA接收简单点来说就是:串口接收到的数据自动缓存到一个数组里,不用MCU去中断干预。
可以理解为拿快递过程: 快递(串口数据)自动放到快递箱(数组缓存)里,短信通知你取快递(MCU接收到标志位)
后续就是主函数里对数据缓存区循环处理
接收数据的流程:
串口接收DMA在初始化的时候就处于开启状态,一直等待数据的到来,在软件上无需做任何事情,只要在初始化配置的时候设置好配置就可以了。
判断数据数据接收完成:
这里判断接收完成是通过串口空闲中断的方式实现,即当串口数据流停止后,就会产生IDLE中断。这个中断里面做如下几件事:
1. 关闭串口接收DMA通道,2点原因:a.防止后面又有数据接收到,产生干扰。b.便于DMA的重新配置赋值,下面第4点。
2. 置位接收完成标志位
3. 处理接收buffer中数据
4. 重新设置DMA下次要接收的数据字节数,注意,这里是给DMA寄存器重新设置接收的计数值,这个数量只能大于或者等于可能接收的字节数,否则当DMA接收计数器递减到0的时候,又会重载这个计数值,重新循环递减计数,所以接收缓冲区的数据则会被覆盖丢失。
5. 开启DMA通道,等待下一次的数据接收,注意,对DMA的相关寄存器配置写入,如第4条的写入计数值,必须要在关闭DMA的条件进行,否则操作无效。
说明一下,STM32的IDLE的中断在串口无数据接收的情况下,是不会一直产生的,产生的条件是这样的,当清除IDLE标志位后,必须有接收到第一个数据后,才开始触发,一断接收的数据断流,没有接收到数据,即产生IDLE中断。IDLE位不会再次被置高直到RXNE位被置起(即又检测到一次空闲总线)。RXNE接收中断可以不用开启,减少进中断的次数。
当MCU通过USART接收外部发来的数据时,在进行第①②③步的时候,主程序可以不用管,DMA直接将接收到的数据写入缓存RxBuffer,程序此时也不会进入接收中断,当数据接收完成之后产生接收空闲中断,在中断服务函数中将接收完成标志位置1,计算出接收缓存中的数据长度,清除中断位,失能DMA防止在处理数据时候接收数据。主程序中检测到接收完成标志被置1,进入数据处理程序,现将接收完成标志位置0,重新设置DMA下次要接收的数据字节数,使能DMA进入接收数据状态。
|
|