news 2026/4/23 15:32:24

[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/4/22 17:47:32

FSearch完整指南:Linux系统快速文件搜索终极解决方案

FSearch完整指南&#xff1a;Linux系统快速文件搜索终极解决方案 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 还在为Linux系统中查找特定文件而烦恼吗&#xff1f;…

作者头像 李华
网站建设 2026/4/18 9:46:04

c++打印代码分析

格式大概std::cout<<"字符串";&#xff08;大家要注意我在下面省略了 #include <iostream>,还有就是每行命令写完记得要加上;&#xff09; std::cout<<"1"<<"2"; 相当于 std::cout<<"1"; std::cout…

作者头像 李华
网站建设 2026/4/23 13:59:29

DEV和UAT区别

好的&#xff0c;这是一个在软件开发和部署中非常核心的概念。简单来说&#xff0c;Dev环境是给开发人员用的“作坊”&#xff0c;而UAT环境是给最终用户或业务方用的“样板间”。 它们同属于软件发布流程中的不同阶段环境&#xff0c;核心区别在于目的、使用者、数据和质量要求…

作者头像 李华
网站建设 2026/4/22 20:09:57

【批量文件夹修改时间批量修改工具】

&#x1f4cc; 摘要 本文介绍了如何使用 Windows PowerShell 的快捷方式&#xff08;WinX&#xff09;以管理员权限打开&#xff0c;通过 cd 命令导航到文件夹&#xff0c;并使用 Get-ChildItem -recurse 获取所有文件的最后修改时间并重置它们。 注意事项&#xff01; 1、文件…

作者头像 李华
网站建设 2026/4/14 18:51:32

LangGraph4J:Java开发者构建智能工作流的最佳实践指南

LangGraph4J&#xff1a;Java开发者构建智能工作流的最佳实践指南 【免费下载链接】langgraph4j &#x1f680; LangGraph for Java. A library for building stateful, multi-actor applications with LLMs, built for work jointly with langchain4j 项目地址: https://git…

作者头像 李华
网站建设 2026/4/23 14:17:57

JavaScript如何利用JQuery实现大文件上传的进度回传?

大文件传输解决方案设计方案 作为福建某软件公司的技术负责人&#xff0c;针对大文件传输需求&#xff0c;我提出以下技术方案&#xff1a; 一、需求分析与技术挑战 核心需求&#xff1a; 支持50G大文件传输文件/文件夹上传下载&#xff08;保留层级结构&#xff09;断点续传…

作者头像 李华