本帖最后由 circle_head 于 2017-4-28 16:31 编辑
转载+自己的理解 附件内容是 DMA的配置 + 串口的配置 不是工程文件
STM32中,一般使用串口中断接收串口数据,但是用这种方法的话,就要频繁进入串口中断,然后处理,效率就比较低。于是就想到用DMA来接收串口数据,这个STM32也是支持
的。但是关键的一点,怎么知道数据接收完毕了呢?如果接收的数据长度固定,那就好办,直接设置DMA的接收数据个数就行了。但是如果长度不固定了,那应该怎么办了?
这个时候,就要用到STM32在串口中提供的另一个好用的东西了,就是串口空闲中断。在STM32的串口控制器中,设置了有串口空闲中断,即如果串口空闲,又开启了串口空闲中断
的话,就触发串口空闲中断,然后程序就会跳到串口中断去执行。有了这个,是不是可以判断什么时候串口数据接收完毕了呢?因为串口数据接收完毕后,串口总线肯定是会空闲的嘛,
那这个中断肯定是会触发的了。 需要注意的是:要RXNE位被置位后,串口总线空闲才会触发的
使用过程中只需在主函数中
1、定义接收数组
u8 RxBuff[Data_Leng];
2、配置DMA
MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)RxBuff, DMA_DIR_PeripheralSRC, 30); //DMA1 通道5 ,外设串口1,存储器为RxBuff,DMA传输方向,DMA长度
3、配置串口
uart_init(9600);
接收完成数据后 就可以在中断中解析数据 执行相应的操作了。
关于中断函数中 清除空闲标志位 解释如图1 状态寄存器 所示
关于中断函数中 先Disable DMA通道 然后设置DMA传输数目 最后Enable DMA通道的做法 解释如图2 DMA通道 所示
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
程序是没问题的我测过的 接收的数据有间隔就会进中断的, 这个间隔多少时间会产生中断我也没测过。
一周热门 更多>