找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7338|回复: 10
打印 上一主题 下一主题
收起左侧

STM32串口不定长数据接受程序 用中断实现

[复制链接]
跳转到指定楼层
楼主
ID:155845 发表于 2017-8-5 23:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
回想起自己当时才接触串口需要接受未知数据时,在网上听人说可以使用空闲中断,到处去找资料,胡乱配置碰了很多壁。而现在看见时不时还有人在问进不去空闲中断,我就把我自己的一些经验和配置分享给大家参考一下,希望能帮到大家。

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

单片机源程序如下:
  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)


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:303363 发表于 2018-4-7 22:07 | 只看该作者
你这不带DMA啊,心疼我的20块钱。。。。。。
回复

使用道具 举报

板凳
ID:300551 发表于 2018-4-8 12:40 | 只看该作者
代码编译报错
回复

使用道具 举报

地板
ID:370386 发表于 2018-7-19 10:45 | 只看该作者
这个有问题
回复

使用道具 举报

5#
ID:155845 发表于 2019-1-14 23:40 | 只看该作者

我刚看了自己的源文件没有问题啊,不知道你们是什么问题,主函数我没有写接受的数据进行怎样的处理,只是放在了数组中
回复

使用道具 举报

6#
ID:155845 发表于 2019-1-14 23:41 | 只看该作者

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

使用道具 举报

7#
ID:155845 发表于 2019-1-14 23:42 | 只看该作者
wangshaosh 发表于 2018-4-7 22:07
你这不带DMA啊,心疼我的20块钱。。。。。。

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

使用道具 举报

8#
ID:468401 发表于 2019-1-15 11:15 | 只看该作者
good good
回复

使用道具 举报

9#
ID:223999 发表于 2019-1-16 09:16 | 只看该作者
看看行不行
回复

使用道具 举报

10#
ID:509812 发表于 2019-4-11 19:11 | 只看该作者
学习了
回复

使用道具 举报

11#
ID:629338 发表于 2019-10-24 11:35 | 只看该作者
为什么我的程序会一直触发IDLE中断啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表