STM32
直播中

jfsky

16年用户 510经验值
私信 关注
[问答]

调试STM32的串口接收时发现例程中只能接收一个字节怎么解决?

调试STM32的串口接收时发现例程中只能接收一个字节怎么解决?

回帖(1)

郭佳

2021-12-9 10:48:07

最近调试STM32的串口接收时发现例程中只能接收一个字节
例程如下:

1 //初始化串口1 2  void uart_init(u32 bound){ 3     //GPIO端口设置 4     GPIO_InitTypeDef GPIO_InitStructure; 5     USART_InitTypeDef USART_InitStructure; 6     NVIC_InitTypeDef NVIC_InitStructure; 7       8     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟 9      USART_DeInit(USART1);  //复位串口110      //USART1_TX   PA.911     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.912     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;13     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出14     GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA915    16     //USART1_RX      PA.1017     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;18     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入19     GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA1020 21    //Usart1 NVIC 配置22 23     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;24     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级325     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级326     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能27     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器28   29    //USART 初始化设置30 31     USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;32     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式33     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位34     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位35     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制36     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式37 38     USART_Init(USART1, &USART_InitStructure); //初始化串口39     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断40     USART_Cmd(USART1, ENABLE);                    //使能串口 41 42 }43 void USART1_IRQHandler(void)                    //串口1中断服务程序44     {45     u8 Res;46     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)47         {48         //USART_ClearITPendingBit(USART1,USART_IT_RXNE);49         Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据50         USART_RX_BUF[buf_index++]=Res;51         52         } 53 54 } 55 56 57
这是较为普遍的源码例程的写法,用原子的版本改的。这本身没问题,但是,一旦运行,就会发现,只能接收一个字节,后面的都会丢失,调了1天没找到原因,一搜索发现很多类似的情况。
后来正准备改用DMA时偶然找到问题所在,就是这句:
24     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级325     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3 改为
24     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;25     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 后问题解决。
注意,不要在中断中执行发送接收过程,存在中断嵌套的问题,会造成只执行一次的现象。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分