目录

USART1_IRQHandler 中断服务函数代码

介绍 函数USART_GetITStatus 每个状态描述

USART_RX_STA 接收状态标记的思考

USART1_IRQHandler 中断服务函数代码

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0,   接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记 //上面一段注释很重要
void USART1_IRQHandler(void)                    //串口1中断服务程序
{u8 Res;
#if SYSTEM_SUPPORT_OS       //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntEnter();
#endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾) {Res =USART_ReceiveData(USART1);//(USART1->DR);  //读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始else USART_RX_STA|=0x8000;  //接收完成了 }else //还没收到0X0D{   if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   }      }}          } 

介绍 函数USART_GetITStatus 每个状态描述

USART_RX_STA 接收状态标记的思考

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态:

bit15 bit14 bit13~0
接收完成标志  接收到0x0d 接收到的有效字节数

u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节,可以自行定义
//bit15,    接收完成标志
//bit14,    接收到0x0d
//bit13~0,    接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记

USART_RX_STA 的作用就是一个接收状态标记

..

用单步调试的思想来假设一下串口接收时候,接收数据的状态。假设接收的数据为12345。
 在第一次进入串口中断处理函数,我们先判断是否接是因为USART1接收到了数据产生的中断
   ① if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET) // RXNE //接收中断

②Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据                                                                  
  首先,USART1接受到的一位数据 1  存入变量Res里,这时候会继续判断是否还有数据需要接收,还有 2345 没有接收
   ③if((USART_RX_STA&0x8000)==0) //接收未完成

USART_RX_STA&0x8000 赋值为0后进入内层if语句里

USART_RX_STA 这个变量的值仍然为0,和0x8000相与以后为0,那么执行该if语句的内层函数。

进入④if(USART_RX_STA&0x4000)  进行条件判断  //接收到了0x0d

注意://0x0d是回车的ASCLL码,0x0a是换行的ASCLL码

这里判断USART_RX_STA的第14位是否为1,假设接收到了回车,即0x0d那么USART_RX_STA的第14位会置1。

但是 USART_RX_STA和0x400相与为0,该判断语句就为假,执行下面的else语句。

⑤if(Res==0x0d)USART_RX_STA|=0x4000;

此时还是没有收到0x0d 即回车,继续执行下一个else语句

⑥   else{
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                    USART_RX_STA++;
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;  //接收数据错误,重新开始接收      
                }

if(Res!=0x0a)USART_RX_STA=0;  //接收错误,重新开始
                else USART_RX_STA|=0x8000;    //接收完成了

USART_RX_STA的bit0~bit13代表的是接收到的有效数据个数,这里USART_RX_STA值仍为0,USART_RX_STA & 0X3FFF = 0 ,然后USART_RX_BUF[USART_RX_STA&0X3FFF]=Res,意思就是将Res里的数据存放到USART_RX_BUF[0]里了,并且USART_RX_STA自增1。

此时USART_RX_STA = 1这样在接收到下一个数据后USART_RX_STA&0X3FFF = 1

将后面的数据存入到了USART_RX_BUF[1]里,

直到我们接收到了0x0d(Res = 0x0d)。

第一篇学习笔记,还请大家多多指教!!!

正点原子STM32-串口中断服务函数USART1_IRQHandler关于USART_RX_STA的学习笔记相关推荐

  1. stm32之配置串口中断服务函数

    在学习51单片机的时候,配置串口中断服务函数,只需要查看串口中断的中断号,然后在编写中断服务函数的时候,在函数名后面加上中断号.而在stm32中,中断的数量较多,对于中断的管理也会稍微复杂一点,而且中 ...

  2. 单片机编程小错记录1:漏写串口中断服务函数

    问题描述: 原本单独测试没问题的定时器程序,但在加上串口程序后出现了问题,发现定时器貌似没有在正常工作...... 问题发现: 程序如下: 该程序主要想实现的功能是: 1.串口在初始化时发送" ...

  3. c语言 串口中断服务函数,GCC-AVR 编写中断服务函数的注意事项

    //注意:本文使用的GCC-AVR版本为WinAVR20100110 中断不是C语言的一部分,中断的实现是由编译器实现的.所以,不同版本的编译器的中断的写法有很大的不同:即便同样是WinAVR,不同版 ...

  4. stm32 中断服务函数是如何进入的

    今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口. 以串口中断服务函数void USART1_IRQ ...

  5. stm32中断服务函数

    在stm32中中断服务函数的命名是固定的,在stm32f4xx.it中编写 比如我写的uart中断服务函数 void DEBUG_USART_IRQHandler(void) {uint8_t ucT ...

  6. STM32串口中断不能进入

    问题 如题,STM32配置的串口中断不能进入,DEBUG时串口中断服务函数也不能打断点 背景 配置串口函数以及串口中断服务函数是写在一个.cpp文件中 解决 在中断服务函数前面加上 extern &q ...

  7. stm32f103——中断——UART中断服务函数

    在程序中,CPU对外界突发事件进行处理的方式又两种: 1>轮询系统:(在main中,使用while循环,进行循环判断外界事物是否发生)         while(1){            ...

  8. STM32 关于外部中断线、中断源和中断服务函数的问题

    STM32 关于外部中断线.中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0.PB0...PG0共用的EXTI0中断线,PA1.PB1...PG1共用的EXTI1中断线,也就是 编程里面 ...

  9. stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)

    rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口.当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发.系统复位 ...

最新文章

  1. WCF之服务实例管理
  2. python读取红外图
  3. 【Java例题】7.6文件题3-文本文件统计
  4. java空值转datetime,关于java1.8中LocalDateTime实现日期,字符串互转小坑。
  5. 极简写作语言-Markdown
  6. 【有三说深度学习】深度学习前夕
  7. Google新作Synthesizer:我们还不够了解自注意力
  8. 误执行了rm -fr /*之后,除了跑路还能怎么办?!
  9. RabbitMQ系列教程之三:发布\/订阅(Publish\/Subscribe)
  10. BZOJ 1071组队
  11. jQuery框架学习第四天:使用jQuery操作元素的属性与样式
  12. Tablestore Timestream:为海量时序数据存储设计的全新数据模型...
  13. C++中常用到的容器
  14. vue自学入门-2(vue创建项目)
  15. 28 岁字节程序员退休,财务自由
  16. MySQL select
  17. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_2_对象的序列化流_ObjectOutputStream...
  18. Eclipse Debug功能的使用教程
  19. DAS-DVS分布式光纤振动传感-发展现状与未来趋势分析(华为光纤传感新产品Huawei OptiXsense EF3000)
  20. 模糊逻辑(Fuzzy Logic)

热门文章

  1. ibdp课程体系中要选择经济课吗?
  2. 2022年全网最详细的Fiddler抓包总结
  3. 应用层Fiddler抓包工具
  4. 洗礼灵魂,修炼python(41)--巩固篇—从游戏《绝地求生-大逃杀》中回顾面向对象编程...
  5. 减少用户投诉,就选中国移动二次号查询
  6. 【ST开发板评测】Nucleo-F411RE开箱报告
  7. Python大作业之就诊卡管理信息系统[原创]
  8. Java实现水电费计费项目
  9. 周训练计划之(全套的静态拉伸动作图解)
  10. 解决ERROR 1129 (HY000): Host ‘xxx‘ is blocked because of many