平台是F103
先说下我的理解:
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?
|