串口+DMA:固件库踩坑日记
1.如何告知DMA相应通道连接的外设
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);表明是USART1的RXNE事件唤起DMA1_Chanal5开启转运
2.DMA单次和多次模式的选择
单次模式和循环模式的选择:
单次模式优点:
- 可以知道每次传输了多少
- 设定最大传输长度不超过缓冲区无须担心越界问题
- 无须担心覆盖问题
单次模式缺点:
- 每次串口的IDLE中断都需要重新设置DMA的计数值(存储器地址自动恢复)
循环模式优点:
- 无需每次传输完成再关闭DMA,重设 计数值
- 配合半传输中断和传输完成中断+二级缓冲区,可以实现稳定的数据接收
循环模式缺点:
传输速度过快,处理速度慢时,会出现先接收数据被覆盖
3.存储器到存储器模式/外设到存储器模式的区别
- M2M模式一旦启动DMA,不停地转运,无需额外触发条件,直到计数值为0,如果同时设置了循环模式,会出现跑不停的现象。
- 外设到存储器模式,需要触发条件,比如USART1_Rx对应DMA1_Chanal5,当RXNE被置位,触发DMA相应通道转运。
4.USART_ClearITPendingBit(x,USART_IT_IDLE)无法清除IDLE标志位
USART_ClearITPendingBit()函数只是手动清除SR寄存器,此前DMA转运过DR寄存器数值,但是顺序是反的!
所以清除IDLE标志位的方法只有:
uint8_t clear;
clear = USART1->SR; // 清除空闲中断
clear = USART1->DR; // 清除空闲中断