stm32f40移植ucos2.92,使用DMA进行串口1通信,通过串口空闲中断,让DMA发送量复位,但程序运行是进入串口空闲中断,怎么修改代码
时间: 2024-03-22 09:42:15 浏览: 55
如果您在使用DMA进行串口1通信时,程序运行时进入了串口空闲中断,那么可能是由于DMA传输完成后触发了串口空闲中断,但此时DMA传输量已经复位,导致程序出现异常。为了解决这个问题,您可以尝试如下修改代码:
1. 在串口空闲中断处理函数中,添加对DMA传输量的判断。如果DMA传输量为0,说明DMA传输已经完成,此时不需要执行任何操作。否则,需要重新设置DMA传输量,并启动DMA传输。例如:
```c
void USART1_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) {
USART_ClearITPendingBit(USART1, USART_IT_IDLE);
/* 获取DMA传输量 */
uint16_t len = DMA_GetCurrDataCounter(DMA2_Stream7);
if (len > 0) {
/* 清空DMA传输量 */
DMA_Cmd(DMA2_Stream7, DISABLE);
DMA_SetCurrDataCounter(DMA2_Stream7, len);
DMA_Cmd(DMA2_Stream7, ENABLE);
}
}
}
```
2. 在启动DMA传输时,需要先将DMA传输量设置为发送数据的长度,并启动DMA传输。例如:
```c
void USART1_DMA_Send(char *data, uint16_t len) {
/* 设置DMA传输量 */
DMA_Cmd(DMA2_Stream7, DISABLE);
DMA_SetCurrDataCounter(DMA2_Stream7, len);
/* 配置DMA传输 */
DMA_MemoryTargetConfig(DMA2_Stream7, (uint32_t)data, DMA_Memory_0);
DMA_Cmd(DMA2_Stream7, ENABLE);
/* 等待DMA传输完成 */
while (DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) == RESET);
DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
}
```
需要注意的是,在使用DMA进行串口通信时,需要根据实际情况设置DMA的传输模式、传输方向、数据长度等参数,并在启动DMA传输前先将传输量设置为发送数据的长度。同时,为了避免DMA数据传输出现异常,建议在启动DMA传输前先禁止DMA传输,然后再重新配置DMA传输参数并启动传输。
阅读全文