USART1_IRQHandler 函数的理解

发布者:心灵飞翔最新更新时间:2024-08-12 来源: cnblogs关键字:函数 手机看文章 扫描二维码
随时随地手机看文章

 1 void USART1_IRQHandler(void) //串口 1 中断服务程序

 2 {

 3   u8 Res;

 4   #if SYSTEM_SUPPORT_OS //如果 SYSTEM_SUPPORT_OS 为真,则需要支持 OS

 5   OSIntEnter();

 6   #endif

 7   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

 8   //接收中断(接收到的数据必须是 0x0d 0x0a 结尾)

 9   {

10     Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据

11     if((USART_RX_STA&0x8000)==0)//接收未完成15     {

16       if(USART_RX_STA&0x4000)//接收到了 0x0d

17       {

18         if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

19         else USART_RX_STA|=0x8000; //接收完成了

20       }

21       else //还没收到 0X0D

22       { 

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

24         else

25         {

26           USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

27           USART_RX_STA++;

28           if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;

29           //接收数据错误,重新开始接收

30         } 

31       }

32     }

33   }

34 #if SYSTEM_SUPPORT_OS //如果 SYSTEM_SUPPORT_OS 为真,则需要支持 OS

35 OSIntExit();

36 #endif

37 }


下面这段话来自原子的stm32开发指南-库函数版本V1.3 129页。

当接收到从电脑发过来的数据,把接收到的数据保存在 USART_RX_BUF 中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(回车的表示由 2 个字节组成:0X0D 和 0X0A)的第一个字节 0X0D 时,计数器将不再增加,等待0X0A 的到来,而如果 0X0A 没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到 0X0A,则标记 USART_RX_STA 的第 15 位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到 0X0D,那么在接收数据超过 USART_REC_LEN 的时候,则会丢弃前面的数据,重新接收。

 

 计算机向串口发送一串字符,一般不止一个,例如发送”abcdefg回车“。那么串口中断函数会执行9次,回车要执行两次串口中断。当串口中断函数第一次执行时,USART1->DR里面装的是字符a,下面以串口第一次执行来分析这个串口中断函数。

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)这是判断读数据寄存器是否空,因为接受到了a,所以不是空的,这个判断成立。

Res =USART_ReceiveData(USART1);//(USART1->DR); 既然接受到了字符a,那么就要把他读取出来

  if((USART_RX_STA&0x8000)==0) 因为现在接受的是第一个字符,所以接收肯定没有完成,USART_RX_STA还是它的初始化值,于是第15位还是0,这个判断语句成立。于是要执行下面这句话  

if(USART_RX_STA&0x4000)   USART_RX_STA的第14位仍然是0,所以这个判断不成立,所以会执行下面这句话   

 if(Res==0x0d) 当然这个判断也不成立,所以要执行下面这句话

USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;计算出接收的是第几个字符,然后装到缓存里面

USART_RX_STA++;加1表明已经接收好了几个数据原文链接:https://blog.csdn.net/qq_36226810/article/details/82787905


 


个人理解:相当于数组存储数值,当作缓冲


关键字:函数 引用地址:USART1_IRQHandler 函数的理解

上一篇:串口程序的理解
下一篇:STM32串口的理解

推荐阅读最新更新时间:2026-03-20 15:14

STM32中中断标志位与中断挂起位详解:TIM_ClearFlag与TIM_ClearITPendingBit函数应用指南
1. 中断标志位(Interrupt Flag) 作用: 中断标志位位于外设寄存器中(如定时器的TIMx_SR、GPIO的EXTI_PR等),用于指示某个特定事件是否发生(例如定时器溢出、GPIO引脚电平变化)。该标志位由硬件自动置位,但通常需要软件手动清除。 对上一段文字解释:TIMx_SR:定时器(Timer)的 状态寄存器(Status Register)、EXTI_PR:(External Interrupt Pending Register)是外部中断/事件控制器(EXTI)的挂起寄存器(Pending Register),用于标识外部中断请求是否已触发但未被处理】 关键点: 事件触发:当外设检测到事件(如定时器
[单片机]
51单片机的函数信号发生器设计
设计要求 1. 以MCS-51系列单片机为控制器件,用C语言进行程序开发,结合外围电子电路,设计一款函数信号发生器系统; 2. 能够产生正弦波、方波、三角波和锯齿波4种波形; 3. 扩展键盘输入电路,用于切换波形类型、设定频率大小和步进值; 4. LCD1602显示电路实时显示当前波形类型、频率值等信息; 5. 波形频率值调节范围:10~100Hz; 6. 频率步进值调节范围:0.1~10Hz; 系统概述 本文基于51单片机设计的函数信号发生器系统,能够产生正弦波、方波、三角波和锯齿波4种波形,且波形频率可调,调节幅度为10~100Hz。 系统由5V供电模块、AT89C51单片机最小系统、DAC0832模数转换电路、LM358放大
[单片机]
STM32性能飞跃:函数内存RAM执行提速秘籍!
在嵌入式开发中,优化系统的执行效率是每个工程师都需要关注的核心问题。STM32等基于ARM Cortex-M的微控制器通常将程序代码存储在闪存(Flash)中,从闪存中读取并执行。虽然这种方式在大多数情况下已经足够,但在一些关键应用场景中,程序执行的速度和响应时间可能成为瓶颈。如何突破这个瓶颈,提高系统性能?今天,我们将揭开一个STM32优化性能的秘密武器——将函数放入RAM中执行! 为什么将函数放入RAM中执行? STM32的闪存读取速度虽不慢,但与RAM相比,速度差距明显。RAM的访问速度要比闪存快得多,尤其是在频繁读取或者执行大量数据时,RAM能够提供更高的带宽和更低的延迟。因此,将一些关键函数或者中断处理函数放入RAM
[单片机]
STM32性能飞跃:<font color='red'>函数</font>内存RAM执行提速秘籍!
16_freeRTOS 任务控制函数
osThreadCreate 任务创建函数 osThreadTerminate osThreadTerminate(任务对象) 任务结束函数 task1 只打印了一次 获取任务ID printf( id = %dn , osThreadGetId()); printf( id = %dn , myTask2Handle); 两个打印内容相同,都是id 任务阻塞 osThreadYield(); 如果两个任务没有osDelay(1000);用来延时那么只会执行一个任务,这时加上osThreadYield();就可以让两个任务轮流执行,但是本人试验失败,也只运行一个任务 查看任务优先级 osThreadGetPri
[单片机]
16_freeRTOS 任务控制<font color='red'>函数</font>
04_串口打印print函数
int fputc(int ch, FILE *f){ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000); return ch; }
[单片机]
04_串口打印print<font color='red'>函数</font>
GCC内置的原子操作函数
GCC 提供了一些内置的原子操作函数,用于在多线程或并发编程中执行原子操作。这些函数通常用于确保在多线程环境中对共享资源进行安全访问。下面是一些常用的 GCC 内置原子操作函数: 1.__atomic_fetch_add(type *ptr, type val, int memmodel): 原子地将 val 添加到 *ptr 指向的变量中,并返回添加前的值。 type 是变量的类型,可以是 int, long, long long 等。 memmodel 是内存模型,通常用 __ATOMIC_SEQ_CST 表示顺序一致性内存模型。 示例: __atomic_fetch_add(&my_var, 1, __ATOMIC_
[单片机]
总是遇到进制与字符之间的问题?为你分享常用转换工具函数
1、字符串转十六进制 代码实现: 2、十六进制转字符串 代码实现: 或者 效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2” 3、字符串转十进制 代码实现: 第一种,如果带负号 这个就是atoi函数的实现: 效果:字符串:”-123” 转为 -123 第二种,如果不带负号: 效果:字符串:”123” 转为 123 第三种:包含转为浮点数: 效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456 4、十进制转字符串 代码实现: 如果只是单个十进制转字符串,使用sprintf函数就可以了。 如果是十进制数组: 效果:十进制数组13 14转为字符串“13
[单片机]
【IMX6ULL学习笔记】十五、设备树DTS操作函数
一、设备树常用 OF 操作函数 设备树描述了设备的详细信息,这些信息包括数字类型的、字符串类型的、数组类型的,我们在编写驱动的时候需要获取到这些信息。Linux 内核给我们提供了一系列的函数来获取设备树中的节点或者属性信息,这一系列的函数都有一个统一的前缀“of_”,也被叫做 OF 函数。这些 OF 函数原型都定义在 include/linux/of.h 文件中。 1.1、查找节点的 OF 函数 设备都是以节点的形式“挂”到设备树上的,因此要想获取这个设备的其他属性信息,必须先获取到这个设备的节点。Linux 内核使用 device_node 结构体来描述一个节点,此结构体定义在文件 include/linux/of.h 中,
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved