news 2026/6/10 9:14:04

[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/6/6 10:37:01

选择网安培训的本质是选择“赛道

摘要 在长沙选择网络安全培训时&#xff0c;湖南网安基地与其他机构的差距不仅体现在资质和资源上&#xff0c;更在于其独特的“政‑企‑校”生态模式、实战化教学体系以及直达就业的闭环路径。本文将从资质权威性、教学实战性、就业资源壁垒等维度展开分析&#xff0c;结合真…

作者头像 李华
网站建设 2026/6/5 17:50:08

sql注入中过滤分隔符的测试方法

目录 空格、%20、被过滤时的测试方法 一、核心思路&#xff1a;替代空格的常用字符/语法 快速验证方法 二、分场景测试方法 场景1&#xff1a;GET请求参数&#xff08;URL中&#xff09; 步骤1&#xff1a;用/**/替代空格测试基础注入 步骤2&#xff1a;URL编码特殊字符&…

作者头像 李华
网站建设 2026/6/7 18:58:27

【redis-day03-缓存三兄弟及解决方案】

《Redis-day03-商户查询缓存》 0. 今日总结 了解了什么是缓存完成了利用redis实现根据id查询商铺及商铺类型缓存解决了缓存更新导致的数据不一致问题&#xff0c;解决方案如下&#xff1a; 读操作&#xff1a;缓存未命中则查询数据库&#xff0c;并将结果写入缓存&#xff0c;但…

作者头像 李华
网站建设 2026/6/8 14:05:10

【MCP DP-420图Agent故障排查】:资深专家亲授5大高频故障应对策略

第一章&#xff1a;MCP DP-420图Agent故障排查概述在分布式监控系统中&#xff0c;MCP DP-420图Agent作为关键的数据采集组件&#xff0c;承担着从目标节点收集性能指标、日志信息并上报至中心服务的职责。当Agent运行异常时&#xff0c;可能导致监控数据缺失、告警延迟等问题&…

作者头像 李华