首页 » 科学 » stm32 卡去世在串口接收中断中处理方法:(卡去世原因是串口自带BUG)_串口_标记

stm32 卡去世在串口接收中断中处理方法:(卡去世原因是串口自带BUG)_串口_标记

admin 2025-01-22 14:06:02 0

扫一扫用手机浏览

文章目录 [+]

通过调试创造,中断一贯进入这个地方

if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) != RESET) { USART_ReceiveData(USART1); USART_ClearFlag(USART1,USART_FLAG_ORE); }

网上对此的解释很多,但都是指出了问题点,没有办理该问题。
实在我理解中该问题的缘故原由很大略,在你使能串口中断USART_ITConfig(USART1 , USART_IT_IDLE, ENABLE);

stm32 卡去世在串口接收中断中处理方法:(卡去世原因是串口自带BUG)_串口_标记 stm32 卡去世在串口接收中断中处理方法:(卡去世原因是串口自带BUG)_串口_标记 科学

USART_ITConfig(USART1, USART_IT_RXNE , ENABLE);时,

stm32 卡去世在串口接收中断中处理方法:(卡去世原因是串口自带BUG)_串口_标记 stm32 卡去世在串口接收中断中处理方法:(卡去世原因是串口自带BUG)_串口_标记 科学
(图片来自网络侵删)

同时会半开启USART_FLAG_ORE中断,这种情形便是BUG,涌现溢出会进入中断函数,但是却打消不掉标志位,由于你没有调用开启函数开启该中断。

以是办理办法便是我们必须在开启中断同时,开启缺点中断

USART_ITConfig(USART1, USART_IT_ERR, ENABLE);

这个配置设置后就可以利用前面的打消标志位的函数了,不然打消标志位会失落效。
同时由于开启了该中断会导致其他缺点标志位相应中断我们也须要打消标志位。
以精确的处理的代码如下:

void USART1_IRQHandler(void) //串口1中断做事程序 //{ // uint8_t Clear = Clear; //if (USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET) {USART_ReceiveData(USART1); USART_ClearFlag(USART1, USART_FLAG_FE);} //if(USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET) { USART_ReceiveData(USART1); USART_ClearFlag(USART1, USART_FLAG_PE); } // // if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) != RESET) // { //USART_ReceiveData(USART1);USART_ClearFlag(USART1,USART_FLAG_ORE); // } // if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) // { // Clear=USART1->SR; // Clear=USART1->DR; // int IOT_Uart_Rec_Cnt = blen-DMA_GetCurrDataCounter(DMA1_Channel5); //USART2_IRQHandler DMA_Cmd(DMA1_Channel5, DISABLE );//关闭DMA // if(IOT_Uart_Rec_Cnt>0) // { // PushUartMsg1(IOT_Uart_Rec_Cnt); // } // USART_ClearITPendingBit(USART1,USART_IT_IDLE); // DMA_SetCurrDataCounter(DMA1_Channel5,blen);//重新计数 // DMA_Cmd(DMA1_Channel5, ENABLE); // } //} //

串口1的配置代码我也贴一下。

#define buff 10#define blen 350typedef struct {char DMA_Buffer[blen];char RxBuffer[buff][blen];char read;char write;char cnt;}uart_stack;uart_stack uart1 = {0}; void UART1_init(void)//调试{ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;DMA_InitTypeDef DMA_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_USART1, ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);USART_DeInit(USART1); //复位串口1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; / Enable the USART1 Interrupt / NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn ;//todo NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Init(USART1 , &USART_InitStructure); USART_ITConfig(USART1 , USART_IT_IDLE, ENABLE); USART_ITConfig(USART1, USART_IT_ERR, ENABLE); USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); USART_Cmd(USART1 , ENABLE); //DMA配置 DMA_DeInit(DMA1_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)uart1.DMA_Buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = blen; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_Low; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel5, &DMA_InitStructure); DMA_Cmd(DMA1_Channel5, ENABLE);}

完全代码可进群免费领取!


嵌入式物联网的学习之路非常漫长,不少人由于学习路线不对或者学习内容不足专业而错失落高薪offer。
不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。
点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!
记得点赞、关注、收藏、转发哦!

点击这里找小助理0元领取:扫码进群领资料

相关文章