码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • STM32基于HAL库的串口接受中断和空闲中断


    前言

    在通信方面。UART由于全双工通信,可以同时接受数据和发送数据而被广泛使用。

    而接受数据则又有很多种方法

    比如:

    <1>根据结束符判断,数据是字符串形式,所以一般串口接受的接受符就是"\r\n"  换成16进制ascil码显示就是 0X0D   0X0A (对应\r\n)

     <2>定时器中断,设计"喂狗信号量"也就是串口空闲的时间,在串口接受后的定时器里不断递减,减到零则判断接受完毕,接受数据则喂狗刷新递减时间。(这也是单片机常见的串口接受思路)

    参考我51的工程:

    单片机串口中断以及消息收发处理——对接受信息进行判断实现控制_昊月光华的博客-CSDN博客_单片机串口中断怎么触发

     <3>STM32有很多种方式,前两种在某些情况都很可以用。

    但是第一种只适用于判断结束符。在我最近做射频模块(RF)串口发送的数据(一种16进制的格式,没有\r\n的结束符)就受限了,另外第二种需要搭配定时器。而本次写作介绍的串口接受中断和空闲中断则让我感到满意  YYDS!!!

    理解

    串口接受中断 :

    使能串口接受中断RXEN后,串口接受一个数据包 ,一帧 (通常 8位数据位,一位结束位)则进入中断。

    以定时器2为例

    使能

    __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);

     实际处理函数

    USART2_IRQHandler(void)

     在HAL库里这个函数是不能被重定义,在stm32f1xx_it.c里 加__weak 表示弱定义可被重写

    __weak void USART2_IRQHandler(void)

    串口空闲中断:

      在使能IDLE  ,在串口接受完一帧数据后,在一个字节的时间内串口保持空闲则触发串口空闲中断  

    再次进入  USART2_IRQHandler(void)   

    使能 

     __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);

    和串口接受数据的中断处理函数一样。 像是上面第二种方法的改进,因为第二种方法不知道定时多长时间,因为数据发送间隔大小不知道,只能估摸着一个值来通过衰减的“喂狗信号量”来判断。同样,如果数据太大且不停的发送则也不会空闲。

    值得注意的是,串口接受完后空闲必须清除空闲标志位。通过读串口DR寄存器里的值来清除IDLE标志位,否则程序一直触发空闲中断。

    比如串口中断处理代码(以串口三为例) 注意(用__weak修饰hal库stm32f1x_it.c里的以此重写)

    1. void USART3_IRQHandler(void){
    2. uint8_t temp;
    3. if(huart3.Instance->SR & UART_FLAG_RXNE){
    4. Rx_uart3_signal=2;
    5. temp=huart3.Instance->DR;
    6. Rx_uart3_buf[Rx_uart3_cnt++]=temp;
    7. }
    8. else if(huart3.Instance->SR & UART_FLAG_IDLE){
    9. temp=huart3.Instance->DR;
    10. Rx_uart3_signal=0;
    11. }
    12. }

    通过Rx_uart3_signal=0判断一次接受完毕,在while中打印数据。给我的效果个感觉都非常不错,是第二种方法以硬件的方式(stm32自带的空闲中断)而不是定时器实现了数据包的接受。

    参考

    STM32串口之空闲中断_csdn_dx的博客-CSDN博客_串口空闲中断

  • 相关阅读:
    Splunk UBA audit log 发送到 Splunk ES
    springcloud面试题及答案
    MATLAB实现函数拟合
    显示命令行控制台(cmd.exe)的几种方式——Qt、C++
    Spring实例化源码解析之Bean的实例化(十二)
    python jieba 词性标注 中文词性分类 nlp jieba.posseg
    【Elastic-2】SpringBoot整合ELK、SpringBoot写ES
    合伙保密协议
    华为centos7服务器中安装python3.10.13 脚本方式安装或手动安装
    【C语言】哈夫曼树,再来一次解剖
  • 原文地址:https://blog.csdn.net/PHILICS7/article/details/126004324
  • 最新文章
  • 花了一晚上AI Coding, 在不熟悉的领域,使用AI帮同事解决了跳槽的小问题
    一首《谦比希铜矿之歌》厂歌火爆全网,背后是AI的数学本质
    园友特惠| 1Panel 企业版 & AI 一体机限量放售,最高直降 5100!
    C# 内存安全性的重大演进:重新定义 unsafe 关键字
    为了随时随地控制 AI Agent,我做了一个 Web Terminal
    AAVE V3 v3.7 版本更新:Isolation Mode 被移除,清算流程精度修复
    Agent 架构设计与能力构建
    从 Responses API 到 Chat Completions:一个模型网关的设计复盘
    上位机程序发布打包成安装包---Inno Setup
    【EF Core】继承策略——TPT
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号