初级会员

- 积分
- 136
- 金钱
- 136
- 注册时间
- 2020-1-15
- 在线时间
- 39 小时
|
1金钱
先说下我的理解:
DMA收:
利用的中断是串口总线空闲中断。
DMA在后台(理解上的后台)搬运数据到缓存,当触发总线空闲中断,在中断中取出缓存的数据,这样就实现了按帧处理串口数据,也叫不定长度接收。
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1, rec_buff, BUFF_SIZE_REC);
整个架构是:
1.设置串口中断+DMA接收。
2.对端发送完成后,串口空闲会触发IDLE中断,进入中断后,从缓存取数据
3.在IDLE中断函数中,重设中断,重新开启DMA收。
---------------------------------------------------------------------------------------------------------------------------------
DMA发:
利用的中断是DMA的TC(发送完成)中断
相对于HAL_UART_Transmit的发送堵塞,发送完函数返回不同的是,DMA发送返回快
相当于是把缓存地址告诉DMA,DMA自行发送,发送完成后进入TC中断。
HAL_UART_Transmit_DMA
上述这个函数内部开启了UART_IT_TC
整个架构是:
1.设置DMA TC中断,在需要发送的时候调用DMA发送。
2.DMA发送完成,会进入DMA TC中断,表示发送完成。
3.在中断中重设DMA发送。
请问一下:
1.我上述的理解对吗?
2.为什么接收是用串口的IDLE中断,而发送是用的DMA的TC中断?有没有适用于DMA的接受中断?(我在手册上没有看到合适的寄存器,真的没有嘛?)
3.idle中断进入的标志是对端发送停止吗?我方持续发送,是否会影响这个IDLE?
|
最佳答案
查看完整内容[请看2#楼]
1.是对的
2.DMA接收数据时,在不确定接收数据量的情况下用串口空闲中断比较好。如果确定接收的数据量大小,不用空闲中断也行
3.idle中断进入的标志是串口RX引脚检测到了一个空闲帧,且使能了IDLE中断的前提下,就进入ILED中断服务函数
|