STM32 HAL UART 使用关键思路(无代码,但是很关键)

2023-05-16

1.到底使用哪种方式,或者说有哪几种方式?

STM32 中的 UART 允许使用不同的发送 ( TX) 和接收 ( RX) 模式进行配置,有什么区别和优势?:

  • 轮询模式(简单来说就是无 DMA,无 IRQ,在循环里不断的读取)
    • 原理:不断地轮询状态位看看是否传输/接收到任何字符,然后可以快速的读取
    • 好处1: 易于实现,只需很少的代码行。
    • 坏处1:如果mcu的频率不够快地读取寄存器,在较为复杂的应用程序中很容易错过接收到的数据。
    • 坏处2:仅适用于比较低的波特率,9600或更低,否则可能丢失数据。
  • 中断模式(简单地说就是收到一个触发一次中断,不使用 DMA)
    • 原理: UART 触发中断,然后跳转到中断处理每个接收到的字节
    • 好处1:嵌入式应用中常用的方法
    • 好处2:适用于常见的波特率,115200最高~921600波特率
    • 坏处1:中断服务程序为每个接收到的字符执行
    • 坏处2:如果在高速时波特率的每个字符都触发中断,就有可能降低系统性能
  • DMA模式
    • 原理:DMA 用于在硬件级别将数据从 USART RX 数据寄存器传输到用户内存。此时不需要设计函数获取,当需要处理时再处理接收到的数据;
    • 原理:从 USART 外设到内存的传输是在硬件级别完成的,无需 CPU 交互
    • 好处1:可以很容易地与操作系统一起工作
    • 好处2:针对最高波特率> 1Mbps和低功耗应用进行了优化
    • 好处3:如果出现大量数据突发,增加数据缓冲区大小可以改善功能
    • 坏处1: DMA 硬件必须事先知道要传输的字节数(可接收不定长,但是,要有范围)
    • 坏处2:如果通信失败,DMA 可能不会通知应用程序所有已传输的字节

2.HAL库的函数为什么直接调用有时可以有时不行? 

1.HAL的函数库只提供基本的使用流程,但是并不能符合所有的要求。

2.尤其是上述的三种方式中的最后两种,需要使用中断进行操作,这时候每个人的需求就不一样了。有些需要空闲,有些需要收取到数据等等,

3,HAL库的基本函数并没有包含所有的想法,有时候需要使用__HAL开启中断宏进行补充。附上宏函数名称:

__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);

3.我怎么知道有哪些中断?

1.看手册,推荐

2.看调试窗口的简介

3.看svd文件,在HAL的包下面,但是不推荐。

4.我怎么知道用哪些中断?

根据不同的方法,然后收取思路有一个清晰的认识,就知道用哪些中断,可以参考网络上的教程,但是切记,请勿照抄。

5.我遇到问题,但是找不到答案,怎么办?

1.Keil中可以在debug中查看外设寄存器

2.Clion中可以在debug中加载svd之后查看外设中的寄存器

3.在行为操作后打断点,然后查看外设寄存器中的中断部分。一般的问题就会浮现。

4.思考当前的操作是否会出现当前的中断问题。

5.代码精简,然后进行测试。

6.跟踪HAL库,查看库的流程(重要)

6.我的UART为什么卡死了?为什么发一条卡死了?为什么发长了卡死了?为什么1个字节卡死了?为什么启动就卡死了?

排查流程:

  •         打开外设寄存器
  •         看ORE
  •         看RXNEIE
  •         看IDLEIE
  • 不要在中断函数里处理数据!!!!!!!!!!!!!!!!!!!

7.我的UART为什么无法进入中断?为什么接收不到数字? 

排查流程:

  •  打开外设寄存器CR1
  •  看UE
  •  看RE
  • 看TE
  • 看是不是用了print 函数?
  • 看看是不是自己定义了中断函数?

8.看了上述寄存器但是不知道到底有没有问题? 

  1. 百度/google
  2. 手册
  3. 理解流程之后才能知道到底有没有问题。

9.为啥一发数就跑飞了 

  • 看看初始化
  • 看看代码
  • 看看是不是内存引用失效等等
  • rtos有没有使用互斥量防止串口共用?

10.我用RTOS为啥接收有问题

1.不要在中断函数里处理数据!!!!!!!!!!!!!!!!!!!

2.合理使用信号量,队列,邮箱等方法。

3.部分rtos需要使用特殊的函数通知任务,请参考rtos手册

4.合理使用与调度相关的临界区、调度锁等,否则任务不调度,没人处理你的数据。

11.为啥我收到的数奇奇怪怪??

1.看看数据处理方式,考虑一下完整的数据读取。

2.看看buf的容量,有没有被覆盖

3.看看有没有其他地方的内存溢出,覆盖了你的buf区域

4.打开内存查看器一直看,大概就知道问题所在。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 HAL UART 使用关键思路(无代码,但是很关键) 的相关文章

随机推荐

  • 使用 JWT 让你的 RESTful API 更安全

    传统的 cookie session 机制可以保证的接口安全 xff0c 在没有通过认证的情况下会跳转至登入界面或者调用失败 在如今 RESTful 化的 API 接口下 xff0c cookie session 已经不能很好发挥其余热保护
  • CAN报文解析—案例

    1 CAN报文定义 CAN报文是指发送单元向接受单元传送数据的帧 我们通常所说的CAN报文是指在CAN线 xff08 内部CAN 整车CAN 充电CAN xff09 上利用ECU和CAN卡接收到的十六进制报文 2 CAN协议中CAN报文种类
  • 单片机中,intrins.h头文件中各函数详解:空指令_nop_(),移位函数_crol_、_cror_

    intrins h 在 C51单片机编程中 xff0c 我们经常使用到 nop 延时一个机器周期 如果晶振是12M xff0c 则延时1 us xff0c 该空函数在头文件intrins h中 头文件 INTRINS H 中的函数使用很方便
  • Linux 下模拟Http 的get or post请求(curl和wget两种方法)

    一 get请求 xff1a 1 使用curl命令 xff1a curl 34 http www baidu com 34 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl i 34 http www baidu co
  • QT入门基础认知(三个常用类、三种对话框类型、信号和槽)

    1 简单介绍 xff1a 1 1 三个常用类 xff08 Qwidget类 QDialog类 QMainwindow类 xff09 Qwidget类 xff1a 继承与QObject类和QPaintdevice类 xff0c 所有用户界面对
  • socket函数的domain、type、protocol解析

    socket 函数的 domain type protocol 解析 lxg 64 2015 04 09 内核中的 socket 概览 图一 xff1a socket 概览 内核中套接字是一层一层进行抽象展示的 xff0c 把共性的东西抽取
  • code的用法

    今天写程序的时候用了const xff0c 想到之前遇到的code的用法 xff0c 那是第一次遇到code的那样的用法 xff0c 查了一下 xff0c 解释如下 xff1a 在单片机使用C语言进行编程的时候 xff0c 经常使用到cod
  • Linux的system()和popen()差异

    Linux的system 和popen 差异 1 system 和popen 简介 在linux中我们可以通过system 来执行一个shell命令 xff0c popen 也是执行shell命令并且通过管道和shell命令进行通信 sys
  • HTTP的303、307状态码

    之前在 http权威指南 中看到了HTTP的307状态码 xff0c 当时因为没有找到可以实验的网站所以没有比较深的印象 xff0c 今天在排查一个问题的时候恰巧遇到了HTTP 1 1 307 TemporaryRedirect xff0c
  • 如果获得页面跳转的最终URL

    最近做一个小功能 xff0c 就是获取一个页面经过跳转后的最终页面URL xff0c 这里的跳转方式包含但不仅限于HTTP 301 302 js meta refresh 下面是我想到的三种可能的解决方式 xff0c 可能会有更优的方法 x
  • pykafka的NoBrokersAvailableError原因

    今天在使用pykafka的时候遇到一个问题 xff0c 我的kafka和zookeeper运行在一台机器上面 xff0c 然后应用程序跑在另外一台机器上面 当我调用pykafka中的KafkaClient zookeeper host 61
  • pyspark的pickle.PicklingError

    今天在用pyspark的时候在一个类中调用rdd的map的时候报错 xff0c 代码如下 xff1a rdd 61 df filter size df emission gt span class hljs number 50 span r
  • 一行代码引发的"血案"

    昨天在使用pykafka的时候又遇到了之前我遇到过的PartitionOwnedError ConsumerStoppedException异常 xff0c 关于这个异常我之前写过一篇分析的文章 链接在这里 xff0c 我自认为之前应该是把
  • X-Pack的machine learning

    如何使用X Pack的machine learning 最近在使用X Pack中的机器学习功能 xff0c 主要的就是利用非监督的时间序列模型 xff0c 用来检测流量的变化 xff0c 关于X Pack这块的文章好像可以参考的比较少 xf
  • C++自己写的HTTP类

    发起HTTP请求 define NORMAL CONNECT INTERNET FLAG KEEP CONNECTION define SECURE CONNECT NORMAL CONNECT INTERNET FLAG SECURE d
  • 知识总结--checksum校验和算法

    在项目开发过程中 xff0c 经常会使用到checksum检验和 xff0c 但是在不同的协议对接过程中发现checksum算法还是有差异的 本文的目的是对常用的checksum算法进行总结 xff0c 并不断完善和补充 xff0c 以备后
  • 让你编码嗨到停不下来的8个VSCode插件

    经作者授权后翻译成中文 xff0c 原文链接 xff1a https levelup gitconnected com 7 vs code extensions that make you want to keep coding forev
  • 51单片机数组的定义方法(code与data的作用)

    数组前不加 code 或 data xff0c 则默认将数组存放在程序存储器中 xff1b code 指定数据是存储在代码区 xff0c 数据是在编程的时候跟代码一起写入代码存储器 xff0c 运行过程中不能改变 xff1b xdata 指
  • Python+Requests对图片验证码的处理

    Requests对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入 xff0c 而且每次登录时图片验证码都是随机的 xff1b 当通过request做接口登录的时候要对图片验证码进行识别出图片中的字段 xff0c 然后再登录接
  • STM32 HAL UART 使用关键思路(无代码,但是很关键)

    1 到底使用哪种方式 xff0c 或者说有哪几种方式 xff1f STM32 中的 UART 允许使用不同的发送 TX 和接收 RX 模式进行配置 xff0c 有什么区别和优势 xff1f xff1a 轮询模式 xff08 简单来说就是无