关于STM32串口接收中断中只能接收一个字节

eefocus · 电子工程世界·2020-09-16 00:00

1.5k

最近调试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);  //复位串口1

10      //USART1_TX   PA.9

11     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

12     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

13     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

14     GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9

15

16     //USART1_RX      PA.10

17     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

18     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

19     GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10

20

21    //Usart1 NVIC 配置

22

23     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

24     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

25     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3

26     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 ;//抢占优先级3

25     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3


改为


24     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;

25     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;


后问题解决。


注意,不要在中断中执行发送接收过程,存在中断嵌套的问题,会造成只执行一次的现象。


关键字: STM32 串口 接收中断 一个字节 编辑:什么鱼 引用地址: http://news.eeworld.com.cn/mcu/ic510357.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

广告

eefocus · 电子工程世界·2020-09-16 00:00

1.5k
  • STM32
  • PI
  • 用户热评
    打开摩尔芯球APP,查看更多评论

    重大事件及时推送,更流畅的沉浸式阅读体验

    参与评论

    0/200字

    登录后即可发布评论

    发布评论

    请使用浏览器自带的分享按钮,
    将你这篇文章分享出去吧。
    +86
    获取验证码
    登 录

    邮箱登录

    未注册过的用户将直接为你创建摩尔账号