正点原子STM32-串口中断服务函数USART1_IRQHandler关于USART_RX_STA的学习笔记
目录
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的学习笔记相关推荐
- stm32之配置串口中断服务函数
在学习51单片机的时候,配置串口中断服务函数,只需要查看串口中断的中断号,然后在编写中断服务函数的时候,在函数名后面加上中断号.而在stm32中,中断的数量较多,对于中断的管理也会稍微复杂一点,而且中 ...
- 单片机编程小错记录1:漏写串口中断服务函数
问题描述: 原本单独测试没问题的定时器程序,但在加上串口程序后出现了问题,发现定时器貌似没有在正常工作...... 问题发现: 程序如下: 该程序主要想实现的功能是: 1.串口在初始化时发送" ...
- c语言 串口中断服务函数,GCC-AVR 编写中断服务函数的注意事项
//注意:本文使用的GCC-AVR版本为WinAVR20100110 中断不是C语言的一部分,中断的实现是由编译器实现的.所以,不同版本的编译器的中断的写法有很大的不同:即便同样是WinAVR,不同版 ...
- stm32 中断服务函数是如何进入的
今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口. 以串口中断服务函数void USART1_IRQ ...
- stm32中断服务函数
在stm32中中断服务函数的命名是固定的,在stm32f4xx.it中编写 比如我写的uart中断服务函数 void DEBUG_USART_IRQHandler(void) {uint8_t ucT ...
- STM32串口中断不能进入
问题 如题,STM32配置的串口中断不能进入,DEBUG时串口中断服务函数也不能打断点 背景 配置串口函数以及串口中断服务函数是写在一个.cpp文件中 解决 在中断服务函数前面加上 extern &q ...
- stm32f103——中断——UART中断服务函数
在程序中,CPU对外界突发事件进行处理的方式又两种: 1>轮询系统:(在main中,使用while循环,进行循环判断外界事物是否发生) while(1){ ...
- STM32 关于外部中断线、中断源和中断服务函数的问题
STM32 关于外部中断线.中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0.PB0...PG0共用的EXTI0中断线,PA1.PB1...PG1共用的EXTI1中断线,也就是 编程里面 ...
- stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)
rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口.当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发.系统复位 ...
最新文章
- WCF之服务实例管理
- python读取红外图
- 【Java例题】7.6文件题3-文本文件统计
- java空值转datetime,关于java1.8中LocalDateTime实现日期,字符串互转小坑。
- 极简写作语言-Markdown
- 【有三说深度学习】深度学习前夕
- Google新作Synthesizer:我们还不够了解自注意力
- 误执行了rm -fr /*之后,除了跑路还能怎么办?!
- RabbitMQ系列教程之三:发布\/订阅(Publish\/Subscribe)
- BZOJ 1071组队
- jQuery框架学习第四天:使用jQuery操作元素的属性与样式
- Tablestore Timestream:为海量时序数据存储设计的全新数据模型...
- C++中常用到的容器
- vue自学入门-2(vue创建项目)
- 28 岁字节程序员退休,财务自由
- MySQL select
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_2_对象的序列化流_ObjectOutputStream...
- Eclipse Debug功能的使用教程
- DAS-DVS分布式光纤振动传感-发展现状与未来趋势分析(华为光纤传感新产品Huawei OptiXsense EF3000)
- 模糊逻辑(Fuzzy Logic)
热门文章
- ibdp课程体系中要选择经济课吗?
- 2022年全网最详细的Fiddler抓包总结
- 应用层Fiddler抓包工具
- 洗礼灵魂,修炼python(41)--巩固篇—从游戏《绝地求生-大逃杀》中回顾面向对象编程...
- 减少用户投诉,就选中国移动二次号查询
- 【ST开发板评测】Nucleo-F411RE开箱报告
- Python大作业之就诊卡管理信息系统[原创]
- Java实现水电费计费项目
- 周训练计划之(全套的静态拉伸动作图解)
- 解决ERROR 1129 (HY000): Host ‘xxx‘ is blocked because of many