标题: STM32串口不定长数据接受程序 用中断实现 [打印本页]

作者: splendid    时间: 2017-8-5 23:33
标题: STM32串口不定长数据接受程序 用中断实现
回想起自己当时才接触串口需要接受未知数据时,在网上听人说可以使用空闲中断,到处去找资料,胡乱配置碰了很多壁。而现在看见时不时还有人在问进不去空闲中断,我就把我自己的一些经验和配置分享给大家参考一下,希望能帮到大家。

空闲中断出现问题,一个是可能没有同时打开接受中断和空闲中断,再则就是清除空闲中断标志位没弄对。

单片机源程序如下:
  1. #include "usart.h"
  2. uint8_t drbuf[100];//数据存储数组
  3. uint32_t rxcounter=0;//数据的位数
  4. uint32_t rxflag=0;//接受完成标志变量
  5. //配置PRINTF()
  6. #if 1
  7. #pragma import(__use_no_semihosting)                             
  8. struct __FILE
  9. {
  10.         int handle;
  11. };

  12. FILE __stdout;      
  13. //定义_sys_exit()以避免使用半主机模式   
  14. _sys_exit(int x)
  15. {
  16.         x = x;
  17. }
  18. //重定义fputc函数
  19. int fputc(int ch, FILE *f)
  20. {        
  21.         while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
  22.         USART1->DR = (u8) ch;    //  可以更改串口,更改printf的输出串口
  23.         return ch;
  24. }
  25. #endif

  26. void usart1_init(uint32_t BaudRate)
  27. {
  28.         GPIO_InitTypeDef GPIO_InitSTRUTURE;
  29.         USART_InitTypeDef USART_InitSTRUCTURE;
  30.         NVIC_InitTypeDef NVIC_InitSTRUCTURE;
  31.        
  32.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  33.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  34.        
  35.         GPIO_InitSTRUTURE.GPIO_Mode=GPIO_Mode_AF;
  36.         GPIO_InitSTRUTURE.GPIO_OType=GPIO_OType_PP;
  37.         GPIO_InitSTRUTURE.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
  38.         GPIO_InitSTRUTURE.GPIO_PuPd=GPIO_PuPd_UP;
  39.         GPIO_InitSTRUTURE.GPIO_Speed=GPIO_Speed_50MHz;
  40.         GPIO_Init(GPIOA,&GPIO_InitSTRUTURE);
  41.        
  42.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//映射千万不要忘了
  43.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
  44.        
  45.         USART_InitSTRUCTURE.USART_BaudRate=BaudRate;
  46.         USART_InitSTRUCTURE.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  47.         USART_InitSTRUCTURE.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
  48.         USART_InitSTRUCTURE.USART_Parity=USART_Parity_No;
  49.         USART_InitSTRUCTURE.USART_StopBits=USART_StopBits_1;
  50.         USART_InitSTRUCTURE.USART_WordLength=USART_WordLength_8b;
  51.         USART_Init(USART1,&USART_InitSTRUCTURE);
  52.        
  53.         USART_Cmd(USART1,ENABLE);//上面都是按部就班的配置
  54.        
  55.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打开接受中断
  56.         USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);//打开空闲中断
  57.        
  58.         NVIC_InitSTRUCTURE.NVIC_IRQChannel=USART1_IRQn;
  59.         NVIC_InitSTRUCTURE.NVIC_IRQChannelCmd=ENABLE;
  60.         NVIC_InitSTRUCTURE.NVIC_IRQChannelPreemptionPriority=0X01;//抢占优先级为1,一般不需要抢占很高
  61.         NVIC_InitSTRUCTURE.NVIC_IRQChannelSubPriority=0X01;//响应优先级为1
  62.         NVIC_Init(&NVIC_InitSTRUCTURE);

  63. }

  64. void USART1_IRQHandler()
  65. {
  66.         uint8_t clear,i=0;
  67.         if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  68.         {
  69.                 drbuf[rxcounter++]=USART1->DR;//
  70.         }
  71.         else if(USART_GetITStatus(USART1,USART_IT_IDLE)!=RESET)//
  72.                 {
  73.                         clear=USART1->DR;//先读取接受数据寄存器
  74.                         clear=USART1->SR;//再读取发送数据寄存器解可以清除空闲中断标志位
  75.                         rxflag=1;
  76.                 }
  77.        
  78. }

复制代码

所有资料51hei提供下载:
stm32f407zet6 串口1接受不定长.rar (396.89 KB, 下载次数: 59)



作者: wangshaosh    时间: 2018-4-7 22:07
你这不带DMA啊,心疼我的20块钱。。。。。。
作者: wutuobangs    时间: 2018-4-8 12:40
代码编译报错
作者: 小欧阳    时间: 2018-7-19 10:45
这个有问题
作者: splendid    时间: 2019-1-14 23:40
小欧阳 发表于 2018-7-19 10:45
这个有问题

我刚看了自己的源文件没有问题啊,不知道你们是什么问题,主函数我没有写接受的数据进行怎样的处理,只是放在了数组中
作者: splendid    时间: 2019-1-14 23:41
wutuobangs 发表于 2018-4-8 12:40
代码编译报错

我刚刚将我的源程序编译了一遍没有问题啊,不知道你是什么问题,截个图我看看?

作者: splendid    时间: 2019-1-14 23:42
wangshaosh 发表于 2018-4-7 22:07
你这不带DMA啊,心疼我的20块钱。。。。。。

尴尬,这是空闲中断接受的,DMA的我没有上传

作者: guangmx    时间: 2019-1-15 11:15
good good
作者: pm1981    时间: 2019-1-16 09:16
看看行不行
作者: 天下雨薇    时间: 2019-4-11 19:11
学习了
作者: 雾里赏花    时间: 2019-10-24 11:35
为什么我的程序会一直触发IDLE中断啊?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1