后来航顺代理帮忙解决了一下,比较几个重要的地方,我粘贴上来,共后面的人使用:
这里是关于串口的设置里面比较重要的地方:
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);
USART_Cmd(USART1, ENABLE);
这里是关于中断处理的问题:
uint16_t Cnt = 0;
void USART1_IRQHandler(void)
{
/* 使用了DMA的情况下, 能产生RXNE中断, 但在中断中是读不到RXNE标志的, 因为DMA已经将数据搬走了 */
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART1->DR;
}
else if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); /* 使能总线空闲中断 */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* 使能接收中断 */
Cnt = BUFF_SIZE_MAX - DMA_GetCurrDataCounter(DMA1_Channel5);
DMA_Cmd(DMA1_Channel5, DISABLE);
RxBuff[Cnt] = '\0';
RxOverFlag = 1;
DMA_Reset(DMA1_Channel5);
}
else
{
/* 在RXNE中断中没有检测到RXNE标志, 1. 清除IDLE标志 */
USART1->SR;
USART1->DR;
/* 2. 关闭RXNE中断使能IDLE中断 */
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); /* 禁用接收中断 */
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); /* 使能总线空闲中断 */
}
}
上面的代码已经解决了主要问题,供参考
|