在正常情况下,使用普通的串口中断,可以实现正常的串口收发,但如果收发频率过高,则会导致CPU频繁进入中断,导致资源占用过高
这种情况下可以用DMA:DMA在硬件ROM和IO设备间开辟直接传输数据的通道,不需要CPU主控芯片控制,也不需要类似中断处理那种保留现场&恢复现场的操作。这大大减小了CPU的负担。
使用场景DMA用在只需要传输数据,不需要处理数据的地方,有三种传输方式:
- 外设→存储器(例:从串口RDR寄存器写入某数据buf)
- 存储器→外设(例:从某数据buf写入串口TDR寄存器)
- 存储器→存储器(例:复制某特别大的数据buf)
- 串口空闲中断,对应事件标志为IDLE
- 检测到空闲线路时,该位由硬件置 1。如果 USART_CR1 寄存器中 IDLEIE = 1,则会生成中断
- 该位由软件序列清零(读入 USART_SR 寄存器,然后读入 USART_DR 寄存器)
利用串口空闲中断,可以用如下流程实现DMA控制的任意长数据接收:
- 0、开启串口DMA接收
- 1、串口收到数据,DMA不断传输数据到存储buf
- 2、一帧数据发送完毕,串口暂时空闲,触发串口空闲中断
- 3、在中断服务函数中,可以计算刚才收到了多少个字节的数据
- 4、解码存储buf,清除标志位,开始下一帧接收



