UART相关知识总结

推荐一篇博文,文章对UART协议的解析非常棒!:
https://blog.csdn.net/update7/article/details/112852158

Ⅰ、简介

  • UART ==> 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)
  • UART是一个全双工的通信协议。

(1)UART的传输速率

(以下速率描述内容摘自https://blog.csdn.net/ss343fd/article/details/54880037

  • RS232:传输速率一般不超过20Kbps,速率低,抗干扰能力差,RS-232C能传输的最大距离不超过15m(50英尺)。

  • RS422:定义了一种平衡通信接口,将传输速率提高到10Mbps,传输距离延长到4000英尺(速率低于100Kbps时),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准。

  • RS485:增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。最高传输速率10Mbps,抗干扰能力强,可以传距离1.5km。

平衡双绞线的长度与传输速率成反比,在100Kbps速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mbps。

(2)UART与USART的区别

  • USART ⇒ USART:(Universal Synchronous/Asynchronous Receiver/Transmitter
    USART在通信线上,一般有四根管理数据发收的线,分别是TX、RX、CTS、RTS
    USART支持同步模式发收,可以做数据流控。就是通过CTS、RTS两根线进行流控管理。

  • UART ⇒ 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),仅支持异步发送。

(3)硬件接线注意

  • UART需要TX与RX相接,才可以进行数据通信。
  • 传统的TX、RX、GND接法,两个设备需要共地(GND)

Ⅱ、波特率

关于UART两个基本的概念:波特率、数据帧需要了解。
    波特率:单位为bps,意为 bit per second,即是每秒传送的bit的数量。串口常见的波特率为9600,14400,57600、115200等。

    以9600为例,意思为1秒传输了9600bit,那么传输1bit所用的时间为:1 /9600 ≈ 104us。这里计算出来的时间到底有何作用呢,可以理解为特定波特率下,UART的逻辑电平保持的时间长度,比如9600波特率下,发送bit 1,需要维持逻辑高电平104us,发送bit 0,则需要维持低电平104us。下文将会结合时序图进行分析。


Ⅲ、数据帧

    数据帧:UART的帧数据结构通常为,起始位(1bit)、数据位(5-8bit)、奇偶校验位(1bit 可选)、停止位(1/1.5/2 bit),一般UART不需要奇偶校验,发送8bit数据情况下,UART的一帧数据长度为10bit

    这里放一张UART帧数据的图示。(该图从参考博文中引用)
在这里插入图片描述
    图中所发UART数据为0x33 (二进制:0 11001100 1),由于数据是从低位(LSB)开始发送,所以实际上发送的数据为11001100的反序,即00110011 (0x33)。
    可以看到数据帧中,0(起始位1bit) 11001100(8bit数据) 1(停止位1bit) 这里省略了奇偶检验位。

(1)空闲位

    空闲位为1,表示逻辑高电平,当UART处于空闲状态时,一直保持高电平,发送数据结束时,最后恢复为高电平,即逻辑电平为1。

(2)起始位

起始位为0,表示逻辑低电平,占用1bit,当状态由空闲(高电平)->起始位(低电平),表示准备开始发送UART数据。这里就涉及到波特率的问题了,若想在9600波特率下表示起始位,则需要维持低电平时间至少104us左右
在这里插入图片描述

(3)数据位

    数据位一般为5-8bit,最常用的多为7bit、8bit,7bit可以传输一个ASCII码。8bit刚好是1字节数据。
    当起始位开始后,逻辑高电平表示bit 1,逻辑低电平表示bit 0,9600波特率下,电平时间同样需要维持至少104us左右。需要注意的是UART发送数据是采用LSB格式,即低位先发出。图中发送0x33,那么对应的数据格式的二进制为 1100 1100.

(4)奇偶检验位

    一般情况,可以不使用奇偶检验。即是加入奇偶校验位,只能判断数据传输出错并丢弃数据帧,但不可以像TCP协议一样触发重传机制。
    奇偶检验分为奇校验、偶校验。关于奇偶校验的理解,可以参考文章:https://zhuanlan.zhihu.com/p/29693940
    文章中奇偶校验的理解非常易懂:
    奇校验:保持除起始位外,数据中1的个数位奇数。如发送数据0x33(1100 1100),1100 1100中1的个数为4,奇校验为了保持1的总数为奇数,校验位需要再补一个1,从而使数据位与校验位1的总个数为5,为奇数。

(PS:下文两张奇偶校验图示从上述参考博文引入)
图示从上述参考博文中引入
    偶校验:保持除起始位外,数据中1的个数位偶数。同样道理。如发送 0x33 (1100 1100) 。数据位中,1的个数为4,已经是偶数,那么校验位则无需再补充1,填0即可。
图示从上述参考博文引入

(5)停止位

    停止位为逻辑高电平,表示一帧数据已经传输结束。9600波特率下,高电平至少维持104us。停止位有1、1.5、2bit。以这里的理解为高电平保持的时间,即分别是1 x 104us、1.5 x 104us、2 x 104us。

若想连续发送多帧UART数据,则每一帧数据都需要重复上述的过程,直至所有的数据帧发送完毕。


Ⅳ、总结

  1. 需要了解波特率的定义,bit per second,每秒发送的bit数,通过该概念可以算出电平维持时间,1秒/波特率

  2. 传输数据过程,为LSB,低位数据先发。逻辑高电平表示数据bit 1, 逻辑低电平表示数据bit 0.

  3. 空闲位,为高电平。

  4. 启动位,为低电平, 启动过程相当于从高电平(空闲位)切换至低电平,表示启动。

  5. 数据传输位数,5-8bit。

  6. 奇偶校验,非必要。 表示需要维持数据位中1的数量,奇数/偶数。 通过校验位来补全1的数量,为奇数或者偶数。

  7. 停止位有1、1.5、2bit,一般为1bit。

  8. 接线需要TX、RX反接,需要共GND。

  9. 数据帧格式 空闲位 + 起始位 + 5-8bit数据位 + 奇偶(可选) + 1/1.5/2bit的停止位

<think>好的,我现在需要帮助用户获取关于HAL库配置的知识总结和使用指南。首先,我得回忆一下用户提供的引用内容,看看里面有哪些关键点。用户提到了HAL库的优势,比如软硬件分离、可移植性,以及与STM32CubeMX的结合使用。还有关于中断配置、外设初始化和内存管理的部分。 接下来,我需要整理这些信息,确保结构清晰。可能应该从HAL库的基本概念开始,然后介绍配置步骤,比如CubeMX的使用、外设配置、中断处理等。还要注意用户提到的性能优化和常见问题,这部分对实际开发很重要。 另外,用户要求生成相关问题,我需要根据内容提出相关的问题,比如如何用CubeMX生成代码,或者如何调试HAL库的问题。同时,要确保回答符合格式要求,比如数学公式用$...$,代码块用正确语法,引用标识自然添加。 需要注意用户之前的引用中有提到HAL库与标准库的区别,以及使用CubeMX提高效率,这些点需要融入总结中。可能还需要提到HAL库的结构,比如驱动包中的关键文件,如stm32xx_hal.c和头文件。 在整理配置步骤时,要分点说明,比如引脚配置、时钟设置、外设参数等,并结合CubeMX的截图说明会更直观,但用户可能只需要文字描述。中断配置部分需要强调回调函数的使用,这是HAL库处理中断的特点。 最后,确保语言简洁,避免技术术语过多,但又要足够详细,帮助用户理解HAL库的使用方法。检查是否符合用户的所有要求,包括引用标识的正确放置和相关问题的生成。</think>### HAL库配置知识总结及使用指南 #### 一、HAL库核心特点 1. **软硬件分离设计**:HAL库通过抽象硬件层,将外设操作封装为通用API,例如$UART\_HandleTypeDef$结构体统一管理串口配置[^1]。 2. **跨芯片兼容性**:相同外设的API接口在STM32全系列中保持统一,如$HAL\_GPIO\_WritePin()$函数适用于所有GPIO引脚操作。 3. **CubeMX联动开发**:通过图形化界面生成初始化代码,例如自动生成带有时钟树配置的$SystemClock\_Config()$函数[^2]。 #### 二、HAL库配置流程 1. **工程创建** - 使用STM32CubeMX选择芯片型号(如STM32F407IGTx),配置引脚功能时需注意复用功能映射关系。 - RCC时钟配置需满足不等式:$f_{HCLK} \leq 168MHz$(F4系列最大主频)[^4]。 2. **外设参数配置** ```c // 典型UART配置结构体 UART_HandleTypeDef huart1; huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; HAL_UART_Init(&huart1); // 初始化函数 ``` 注意StopBits与WordLength的匹配关系,例如:$WordLength=8b$时,实际传输长度为$8+1$(含停止位)[^3]。 3. **中断配置** - 在NVIC设置中使能中断通道,优先级需满足:$抢占优先级 \leq 15, 子优先级 \leq 15$(4位优先级分组时) - 实现回调函数: ```c void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if(huart->Instance == USART1){ // 处理接收完成事件 } } ``` #### 三、关键开发技巧 1. **外设时钟管理** 所有外设需先使能时钟,代码模式为: ```c __HAL_RCC_USART1_CLK_ENABLE(); // 使能USART1时钟 ``` 对应CubeMX中自动生成RCC配置代码。 2. **DMA优化策略** 使用DMA传输时可提升效率,配置时需注意: - 数据对齐:源地址和目的地址需满足$对齐字节数=2^{DMA_SxCR_{PSIZE}}$ - 传输模式选择:循环模式/CIRCULAR适用于持续数据流 3. **低功耗配置** 睡眠模式下外设时钟自动关闭,唤醒后需调用: ```c HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); ``` #### 四、调试与问题定位 1. **常见错误处理** | 错误类型 | 解决方法 | |-------------------------|------------------------------| | HAL_BUSY | 检查外设状态机是否冲突 | | 时钟配置错误 | 使用CubeMX重新生成时钟树 | | DMA传输中断丢失 | 检查缓冲区地址对齐和长度设置 | 2. **调试工具链** - 使用STM32CubeMonitor实时监测外设状态 - 通过$__HAL_DBGMCU_FREEZE()$函数冻结外设进行调试 #### 五、进阶应用 1. **自定义HAL扩展** - 重写弱函数:如$HAL\_GPIO\_EXTI\_Callback()$实现精确中断响应 - 修改$stm32xx_hal_conf.h$调整库功能模块 2. **多外设协同工作** 定时器PWM与ADC同步触发配置示例: ```c HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); HAL_ADC_Start_IT(&hadc1); HAL_TIM_TriggerCallback(&htim3); // 定时触发ADC采样 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值