STM32串口中断接收方式详细比较

(End)STM32H7串口空闲中断接收+DMA调试(HAL库) 一、工具介绍 由于项目开发原因要用到STM32H7系列的微控制器,为了缩短项目开发周期和提高效率,采用了ST官方的STM32CubeIDE进行开发,这个集成开发环境的特点主要有:1.从硬件电路设计开始为硬件工程师提供的各个管脚IO功能的映射及功能,方便硬件电路的设置与布局;2.可视化的硬件配置使得已经掌握单片机编程的使用者更加高效开发,只需注重于项目或系统自身功能部分的实现即可。 但不得顺带提一下该开发平台的不友好性:区别于STM32官方的std标准库,可视化配置采用了ST自主封装的HAL库(或者有的称为L 阅读详情

串口调试,以前也调过,只是没这么深入的琢磨过,最近又在弄,感觉串口很基本,也很有学问,要是出现BUG可能导致系统奔溃。。。现在贴出来,欢迎拍砖指正!!!


本例程通过PC机的串口调试助手将数据发送至STM32,STM32通过SP3232芯片采用中断接收方式完成,然后接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。
 
实例一:
void USART1_IRQHandler(u8 GetData)

{ 

u8 BackData;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生

{  

USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志.

     GetData = UART1_GetByte(BackData);   //也行GetData=USART1->DR;   

USART1_SendByte(GetData);      //发送数据

 

GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED闪烁,接收成功发送完成

delay(1000);

GPIO_ResetBits(GPIOE, GPIO_Pin_8 ); 

} 

}  
这是最基本的,将数据接收完成后又发送出去,接收和发送在中断函数里执行,main函数里无其他要处理的。
优点:简单,适合很少量数据传输。
缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。


实例二: 

void USART2_IRQHandler()  

{ 

if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

{  

USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志

Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2);

Uart2_Rx_Num++; 

}


if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5))  //判断最后接收的数据是否为设定值,确定数据正确性

Uart2_Sta=1;

if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

{

USART_ClearFlag(USART2,USART_FLAG_ORE);  //读SR

USART_ReceiveData(USART2); //读DR  

}     

}
   

if( Uart2_Sta ) 

{

for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++) 

USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //发送数据


Uart2_Rx_Num = 0; //初始化

Uart2_Tx_Num = 0;

Uart2_Sta = 0;

}
这是加了数据头和数据尾的接收方式,数据头和尾的个数可增加,此处只用于调试之用。中断函数用于接收数据以及判断数据的头尾,第二个函数在main函数里按照查询方式执行。
优点:较简单,采用缓存区接收,对提高数据的正确行有一定的改善 。
缺点:要是第一次数据接收错误,回不到初始化状态,必须复位操作 。

 实例三:
vvoid USART2_IRQHandler() 
 { 
     if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生 
     { 
        USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志. 
        Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2); 
        Uart2_Rx++; 
        Uart2_Rx &= 0x3F; //判断是否计数到最大
      } 
      if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出 
      { 
          USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR 
          USART_ReceiveData(USART2); //读DR 
       } 
}

  
if( Uart2_Tx != Uart2_Rx ) 
{ 
    USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据 
    Uart2_Tx++; 
    Uart2_Tx &= 0x3F; //判断是否计数到最大
}  
 采用FIFO方式接收数据,由0x3F可知此处最大接收量为64个,可变,中断函数只负责收,另一函数在main函数里执行,FIFO方式发送。
优点:发送和接收都很自由,中断占用时间少,有利于MCU处理其它。
缺点:对数据的正确性没有判断,一概全部接收。

实例四: 
 void USART2_IRQHandler() 
 { 
     if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生 
     { 
        USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志
        Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2); 
        Uart2_Rx++; 
        Uart2_Rx &= 0xFF; 
     } 
     if(Uart2_Buffer[Uart2_Rx-1] == 0x5A) //头 
        Uart2_Tx = Uart2_Rx-1; 
     if((Uart2_Buffer[Uart2_Tx] == 0x5A)&&(Uart2_Buffer[Uart2_Rx-1] == 0xA5)) //检测到头的情况下检测到尾 
     { 
            Uart2_Len = Uart2_Rx-1- Uart2_Tx; //长度 
            Uart2_Sta=1; //标志位 
     } 
     if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出 
     { 
            USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR 
            USART_ReceiveData(USART2); //读DR 
     } 
 } 


if( Uart2_Sta ) 
{ 
        for(tx2=0;tx2 <= Uart2_Len;tx2++,Uart2_Tx++) 
                USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据 
        Uart2_Rx = 0; //初始化 
        Uart2_Tx = 0; 
        Uart2_Sta = 0; 
}

数据采用数据包的形式接收,接收后存放于缓存区,通过判断数据头和数据尾(可变)来判断数据的“包”及有效性,中断函数用于接收数据和判断头尾以及数据包长度,另一函数在main函数里执行,负责发送该段数据。
优点:适合打包传输,稳定性和可靠性很有保证,可随意发送,自动挑选有效数据。
缺点:缓存区数据长度要根据“包裹”长度设定, 要是多次接收后无头无尾,到有头有尾的那一段数据恰好跨越缓存区最前和最后位置时,可能导致本次数据丢失,不过这种情况几乎没有可能。

HAL库中断方式进行串口通信 使用HAL库配置好相关引脚后,在生成的代码里可以很容易的实现中断控制串口通信,但是大量的函数需要自己查找,需要大量练习。 阅读详情

相关推荐

STM32串口通信—串口的接收和发送详解

本文在于记录自己最近做项目过程中遇到的问题和总结,各种情况下串口通信在STM32的实际使用方面占有很大的比重,本文主要对串口的发送和接受做了一个详细的总结和规划,同时也对串口通信做一个简要的总结。本文大致总结了串口的发送和接收。串口的配置,使用查询或者中断来接收数据。串口的使用会很常用到,所以在这里对串口做一个总结,也算是对之前知识的一个回顾和总结,加强印象。

玄奕子的博客 4万+

STM32串口中断接收HAL库超详解析

HAL库实现将接收逻辑全写在中断服务函数里面而不重定义回调函数,并且不会不进中断!

m0_58644391的博客 1万+

基本串口收发(中断接收方式)

本文是关于基本串口收发(中断接收方式)。

STM32H7 串口 空闲中断 DMA 任意长接收 Hal库 IDLE

接着上一篇关于STM32H7串口收发问题,继续说,上一篇里边提供了中断接收方式,最大的缺点就是中断过于频繁,为了解决这个问题那就把DMA搬过来,它不就是专门搬用数据的嘛,不用多可惜。 首先我们需要大致了解,DMA和外设传送数据,例如串口,我们希望,当一帧数据接收完毕了,有个东西告诉主程序,串口接收到了一帧n个字节的数据存在某个地方,接收过程中你丫别打搅我。 DMA就能胜任这个工作,他可以以中断的形式告诉你这些信息。相比中断接收方式,是不是省了很多中断,主程序被打断的次数也就少了。 还是按照上一篇形式大概看一

wait_for_STM32的博客 3892

STM32H7 串口 空闲中断 任意长接收 Hal库 IDLE

今天主要记录一下STM32H7系列串口的使用,正点原子、野火等各大家都有教程,当然用起来也没有问题。 解决方法后边有红色大字提醒,直接看后边就可以,如果你没有时间想去了解HAL库的接收思想。 ST推的HAL库,在整个接收过程中,是没有用到串口的接收空闲中断,它的处理有三种,分别是轮询,接收完成中断(每一个字节一次),DMA接收。 整个Hal库把接收和发送过程都封装好了,就用最简单的轮询方式看,先看库函数代码: /** * @brief Receive an amount of data in blocking mode. * @note When FIFO mode is enabl

保姆级教程:用GPU-Burn给你的NVIDIA Tesla服务器做个“压力体检”(附温度功耗监控脚本)

本文提供了一份详细的GPU服务器压力测试指南,重点介绍如何使用GPU-Burn工具对NVIDIA Tesla服务器进行全面的性能测试和温度功耗监控。从环境部署、多GPU测试策略到专业级监控指标解析,帮助运维人员构建标准化的GPU健康评估体系,确保AI训练和科学计算等关键业务的稳定性。

weixin_30619101的博客 394

STM32H7系列单片机串口DMA双区空闲中断接收方式(HAL库)

STM32H7系列单片机串口DMA双区空闲中断接收方式(HAL库),接收效率较高

qq_33734309的博客 3423

STM32F103串口接收中断:USART_IT_IDLE和USART_IT_RXNE区别

2:如果是大于1个byte的数据,在不用DMA的情况下,同时使能USART_IT_RXNE,USART_IT_IDLE中断,每收到一个字节在中断中把数据存到缓存中,待收到USART_IT_IDLE中断时,收完整帧数据,然后再解析处理数据。比如:如上图在初始化时,同时开启了两个中断,如果传送8个字节的数据,就会产生8个USART_IT_RXNE,和1个USART_IT_IDLE中断。(如果接收到数据,在1个byte的时间内,没有收到新数据,就认为是数据传送完成,产生空闲USART_IT_IDLE中断)

weixin_66299220的博客 2398

STM32H7 串口 空闲中断 硬件FIFO 任意长接收 Hal库 IDLE

本文主要是说明STM32H7中的串口硬件FIFO和IDEL的配合使用,目的是减少实际应用中的串口中断次数

wait_for_STM32的博客 2667

应急响应之windows日志分析工具logparser使用

windows日志分析工具logparser使用介绍

u013930899的博客 8123

手把手教你为Multisim 14.0创建自定义元件:以SPICE模型导入为例

本文详细介绍了如何在Multisim 14.0中创建自定义元件,重点讲解了SPICE模型的导入与应用。通过系统性的步骤指南,包括元件符号设计、引脚定义、SPICE模型关联及验证测试,帮助工程师高效扩展元件库,满足特定设计需求。文章还提供了故障排除和性能优化的实用技巧,确保自定义元件在实际仿真中的可靠性。

weixin_42531163的博客 282

stm32与计算机串口通信,STM32串口通信协议

好文网为大家准备了关于STM32串口通信协议范文,好文网里面收集了五十多篇关于好STM32串口通信协议好文,希望可以帮助大家。更多关于STM32串口通信协议内容请关注好文网篇一:STM32串口中断接收方式详细比较串口中断接收方式好文网为大家准备了关于通信协议STM32范文,好文网里面收集了五十多篇关于好通信协议STM32好文,希望可以帮助大家。更多关于通信协议STM32内容请关注好文网篇一:数控系...

weixin_29837797的博客 1124

避坑指南:STM32CubeMX配置SDIO4bit模式时为什么卡在HAL_SD_ConfigWideBusOperation?

本文深入分析了使用STM32CubeMX配置SDIO 4位模式时,程序在HAL_SD_ConfigWideBusOperation函数处卡死的常见问题。文章从硬件连接、CubeMX配置、初始化序列及HAL库底层实现等多个维度剖析根源,并提供了从初始化流程优化到增强代码鲁棒性等实战解决方案,帮助开发者彻底解决这一棘手难题。

pca5navigator的博客 824

STM32串口收发处理_stm32串口接收数据处理(1),2024年最新程序员进阶知识点

适用于数据交互不太频繁的场合,因为平凡的串口数据发过来,会导致还没来得及处理的数据被新数据覆盖掉,产生丢帧的情况,这个是在实际项目中是不允许发生的,即使不处理数据,但也不希望丢数据。if ((pWrite - pIndex) > (RecDataLen - 2)) //如果接收的数据快满了,为了防止溢出出现不必要的。//一帧数据接收完成,外部处理的标志量。

2401_84254406的博客 3006

stata 工具变量法【计量经济系列(七)】

stata 工具变量法【计量经济系列(七)】 1. 内生性 2. 工具变量3. 2SLS (二阶段最小二乘法) 4. 弱工具变量5. 工具变量外生性的过度识别检验 6. 豪斯曼检验6.1 传统豪斯曼 6.2 杜宾-吴-豪斯曼检验(DWH)

侯小啾技术博客 2万+

在 MATLAB/Simulink 中构建一个卫星间激光通信链路的完整仿真系统

摘要: 本文通过Simulink详细演示了卫星间激光通信系统的建模过程,重点分析其在10Gbps高速率、2000km距离下的性能。系统设计涵盖PAM-4调制、自由空间信道建模(路径损耗、指向误差、多普勒效应)、APD探测及链路预算计算,并给出典型场景下18.5dB SNR、1e-9误码率的仿真结果。针对激光通信的μrad级指向精度挑战,提出AI辅助跟踪、混合RF/激光等优化策略,为未来太空高速组网提供可扩展的仿真框架。所需工具箱包括Communications Toolbox和Aerospace Toolb

xiaoheshang_123的博客 381

HAL库中断点灯及串口通信

中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。中断分为内中断和外中断。内中断指与当前执行的指令有关,中断信号来自CPU内部,内中断也称异常,例如,当前执行的指令是非法的,则会引发一个中断信号。而外中断指与当前执行的指令无关,中断信号来源于CPU外部,例如时钟中断、I/O中断请求。我们通常所说的中断是狭义上的中断,即外中断。

m0_60483900的博客 980

自抗扰控制(ADRC)理论与工程实践:8.1 自适应ADRC与参数在线整定

自适应自抗扰控制(AADRC)针对传统固定参数ADRC在动态变化系统中的局限性,提出通过在线调整关键参数(如观测器带宽ω₀、控制器带宽ω_c)以适应对象动态变化。主要方法包括基于稳定性理论的自适应律设计和基于性能指标的优化调节,前者保证闭环稳定但设计复杂,后者通过梯度搜索或模糊规则实现性能优化但缺乏严格稳定性证明。当前挑战在于非线性时变系统的稳定性分析、参数变化速率限制及工程实现的计算负担。AADRC拓展了ADRC在变参数系统(如无人机、软体机器人)中的应用,是迈向自主智能控制的关键技术。

技术工作者 214

串口中断接收方式详细比较

串口调试,以前也调过,只是没这么深入的琢磨过,最近又在弄,感觉串口很基本,也很有学问,要是出现BUG可能导致系统奔溃。。。现在贴出来,欢迎拍砖指正!!!   本例程通过PC机的串口调试助手将数据发送至STM32,STM32通过SP3232芯片采用中断接收方式完成,然后接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。    实例一:  void USART1_IRQHandler(u

liyaoyao_yy的专栏 1880

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: STM32控制直流电机笔记(二)——编程注意事项
下一篇: STM32配置多个定时器同时为光电编码模式的注意事项
chen-linux
博客等级 码龄12年 39粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值