news 2026/2/14 20:40:59

[HAL库分析—USART]

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[HAL库分析—USART]

文章目录

  • 前言
  • 1. USART
    • 1.1. 配置串口
      • 1.1.1. 配置通讯协议
      • 1.1.2. 配置串口中断
    • 1.2. 发送数据
    • 1.3. 读取数据
  • 2. 寄存器编程实验
  • 3. 总结

前言

  1. 开发板为:野火指南者,基于STM32F103VET6
  2. 分析的例程为:指南者\1-程序源码_教程文档\2-[野火]《STM32 HAL库开发实战指南》(HAL库源码)\20-USART—串口通信\USART1回显

1. USART

1.1. 配置串口

1.1.1. 配置通讯协议

通过HAL库配置USART的关键函数数据结构如下:

HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDef*huart)

🫵源码位置:STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c352行

HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDef*huart){/* Check the UART handle allocation */if(huart==NULL){returnHAL_ERROR;}/* Check the parameters */if(huart->Init.HwFlowCtl!=UART_HWCONTROL_NONE){/* The hardware flow control is available only for USART1, USART2 and USART3 */assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));}else{assert_param(IS_UART_INSTANCE(huart->Instance));}assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));#ifdefined(USART_CR1_OVER8)assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));#endif/* USART_CR1_OVER8 */if(huart->gState==HAL_UART_STATE_RESET){/* Allocate lock resource and initialize it */huart->Lock=HAL_UNLOCKED;#if(USE_HAL_UART_REGISTER_CALLBACKS==1)UART_InitCallbacksToDefault(huart);if(huart->MspInitCallback==NULL){huart->MspInitCallback=HAL_UART_MspInit;}/* Init the low level hardware */huart->MspInitCallback(huart);#else/* Init the low level hardware : GPIO, CLOCK */HAL_UART_MspInit(huart);#endif/* (USE_HAL_UART_REGISTER_CALLBACKS) */}huart->gState=HAL_UART_STATE_BUSY;/* Disable the peripheral */__HAL_UART_DISABLE(huart);/* Set the UART Communication parameters */UART_SetConfig(huart);/* In asynchronous mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/CLEAR_BIT(huart->Instance->CR2,(USART_CR2_LINEN|USART_CR2_CLKEN));CLEAR_BIT(huart->Instance->CR3,(USART_CR3_SCEN|USART_CR3_HDSEL|USART_CR3_IREN));/* Enable the peripheral */__HAL_UART_ENABLE(huart);/* Initialize the UART state */huart->ErrorCode=HAL_UART_ERROR_NONE;huart->gState=HAL_UART_STATE_READY;huart->RxState=HAL_UART_STATE_READY;returnHAL_OK;}

🫵假设我们传入的参数如下所示

// DEBUG_USART = ((USART_TypeDef *)USART1_BASE)// USART1_BASE = (APB2PERIPH_BASE + 0x00003800UL)// = ((PERIPH_BASE + 0x00010000UL) + 0x00003800UL)// = ((PERIPH_BASE + 0x00010000UL) + 0x00003800UL)// = ((0x40000000UL+ 0x00010000UL) + 0x00003800UL)// = 0x40013800ULUartHandle.Instance=DEBUG_USART;// DEBUG_USART_BAUDRATE = 115200UartHandle.Init.BaudRate=DEBUG_USART_BAUDRATE;// UART_WORDLENGTH_8B = 0x00000000UUartHandle.Init.WordLength=UART_WORDLENGTH_8B;// UART_STOPBITS_1 = 0x00000000UUartHandle.Init.StopBits=UART_STOPBITS_1;// UART_PARITY_NONE = 0x00000000UUartHandle.Init.Parity=UART_PARITY_NONE;// UART_HWCONTROL_NONE = 0x00000000UUartHandle.Init.HwFlowCtl=UART_HWCONTROL_NONE;// UART_MODE_TX_RX = ((uint32_t)(USART_CR1_TE | USART_CR1_RE))// = (USART_CR1_RE_Msk | USART_CR1_RE_Msk)// = ((0x1UL << USART_CR1_RE_Pos) | (0x1UL << USART_CR1_RE_Pos))// = ((0x1UL << 3U) | (0x1UL << 2U))UartHandle.Init.Mode=UART_MODE_TX_RX;HAL_UART_Init(&UartHandle);

🫵真正操作寄存器的代码为如下几行

在这里插入代码片

1.1.2. 配置串口中断

通过HAL库配置USART中断的关键函数数据结构如下:
🫵源码位置:STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_uart.h538行

#define__HAL_UART_ENABLE_IT(__HANDLE__,__INTERRUPT__)((((__INTERRUPT__)>>28U)==UART_CR1_REG_INDEX)?((__HANDLE__)->Instance->CR1|=((__INTERRUPT__)&UART_IT_MASK)):\(((__INTERRUPT__)>>28U)==UART_CR2_REG_INDEX)?((__HANDLE__)->Instance->CR2|=((__INTERRUPT__)&UART_IT_MASK)):\((__HANDLE__)->Instance->CR3|=((__INTERRUPT__)&UART_IT_MASK)))

🫵假设我们传入的参数如下所示

// DEBUG_USART = ((USART_TypeDef *)USART1_BASE)// USART1_BASE = (APB2PERIPH_BASE + 0x00003800UL)// = ((PERIPH_BASE + 0x00010000UL) + 0x00003800UL)// = ((PERIPH_BASE + 0x00010000UL) + 0x00003800UL)// = ((0x40000000UL+ 0x00010000UL) + 0x00003800UL)// = 0x40013800ULUartHandle.Instance=DEBUG_USART;// DEBUG_USART_BAUDRATE = 115200UartHandle.Init.BaudRate=DEBUG_USART_BAUDRATE;// UART_WORDLENGTH_8B = 0x00000000UUartHandle.Init.WordLength=UART_WORDLENGTH_8B;// UART_STOPBITS_1 = 0x00000000UUartHandle.Init.StopBits=UART_STOPBITS_1;// UART_PARITY_NONE = 0x00000000UUartHandle.Init.Parity=UART_PARITY_NONE;// UART_HWCONTROL_NONE = 0x00000000UUartHandle.Init.HwFlowCtl=UART_HWCONTROL_NONE;// UART_MODE_TX_RX = ((uint32_t)(USART_CR1_TE | USART_CR1_RE))// = (USART_CR1_RE_Msk | USART_CR1_RE_Msk)// = ((0x1UL << USART_CR1_RE_Pos) | (0x1UL << USART_CR1_RE_Pos))// = ((0x1UL << 3U) | (0x1UL << 2U))UartHandle.Init.Mode=UART_MODE_TX_RX;// UART_IT_RXNE = ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_RXNEIE))// = ((uint32_t)(1U << 28U | (0x1UL << USART_CR1_RXNEIE_Pos)))// = ((uint32_t)(1U << 28U | (0x1UL << 5U)))__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);

1.2. 发送数据

1.3. 读取数据

2. 寄存器编程实验

3. 总结

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 14:09:47

淘宝直播弹幕监控系统搭建指南:从零开始的数据采集方案

淘宝直播弹幕监控系统搭建指南&#xff1a;从零开始的数据采集方案 【免费下载链接】taobao-live-crawler A crawler on taobao live barrages. 项目地址: https://gitcode.com/gh_mirrors/ta/taobao-live-crawler 在直播电商蓬勃发展的今天&#xff0c;如何精准把握直播…

作者头像 李华
网站建设 2026/2/3 11:12:44

【仓储效率跃升300%的秘密武器】:深度解析物流Agent的空间决策算法

第一章&#xff1a;仓储效率跃升的认知革命在智能制造与数字供应链快速演进的今天&#xff0c;仓储管理已从传统的“货物存放地”转变为驱动运营效率的核心枢纽。这一转变的背后&#xff0c;是一场关于数据认知、流程重构与技术集成的深刻革命。现代仓储系统不再依赖人工经验调…

作者头像 李华
网站建设 2026/2/5 8:48:20

从 Android 回调到 C 接口:函数指针 + void* self 的一次彻底理解

一、为什么学 C 回调会觉得“抽象”&#xff1f; 很多 Android / Java 开发者在第一次接触 C 回调时&#xff0c;都会被下面这种代码劝退&#xff1a; typedef struct {void (*open)(void* self);void (*close)(void* self); } Ops; 看起来既不像函数&#xff0c;也不像类&a…

作者头像 李华
网站建设 2026/2/10 23:43:07

网站健康度核心:失效链接的系统性诊断与修复完整方案

失效链接是指您网站上的超链接&#xff0c;导致网页不存在或无法访问&#xff0c;点击时常常返回404错误。 失效链接会让无法访问所需内容的访客感到沮丧&#xff0c;也会损害你的SEO&#xff0c;因为搜索引擎无法有效爬取页面并传递链接权益。 下面我们将更详细地解释什么是失…

作者头像 李华
网站建设 2026/2/12 12:14:32

【护理Agent效率革命】:基于20年临床经验的7种提醒频率场景适配方案

第一章&#xff1a;护理Agent提醒频率的核心价值与挑战在智能护理系统中&#xff0c;护理Agent的提醒频率直接影响用户体验与健康干预效果。过高频率可能导致信息疲劳与用户抵触&#xff0c;而过低则可能错过关键护理时机。因此&#xff0c;设定合理的提醒策略是实现高效人机协…

作者头像 李华
网站建设 2026/2/8 15:59:54

Reactor Core 性能测试完全指南:JMH实战与优化策略

Reactor Core 性能测试完全指南&#xff1a;JMH实战与优化策略 【免费下载链接】reactor-core Non-Blocking Reactive Foundation for the JVM 项目地址: https://gitcode.com/gh_mirrors/re/reactor-core 在现代高并发应用开发中&#xff0c;性能优化是每个开发者必须面…

作者头像 李华