|
发表于 2022-10-18 17:52:35
|
显示全部楼层
void USART2_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
{
Res = USART2->SR;
Res = USART2->DR;
DMA_Cmd(DMA1_Stream5, DISABLE); //关闭DMA,防止处理其间有数据
U2_RX_LEN = 1024 - DMA_GetCurrDataCounter(DMA1_Stream5); //一帧数据长度,DMA计算是递减的,所以要用最大值去减
DMA_ClearFlag(DMA1_Stream5,DMA_FLAG_TCIF5 | DMA_FLAG_FEIF5 | DMA_FLAG_DMEIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_HTIF5);//情掉所有标志
DMA1_Stream5->NDTR = 1024; //更新新的1024长度,建议主板设置4096,尽量大点,要加,否则DMA关掉之后就没有长度和目标地址XHC
DMA1_Stream5->M0AR = (u32)USART2_RX_BUF; //更新DMA的目标地址,一定要加XHC
DMA_Cmd(DMA1_Stream5, ENABLE); //打开DMA,
}
USART_ClearITPendingBit(USART2, USART_IT_ORE_RX | USART_IT_RXNE | USART_IT_IDLE);
}
虽然是标准库,但是我这个是没问题的。 |
|