当前位置: 首页 > news >正文

[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. 总结

http://www.cnnetsun.cn/news/136299.html

相关文章:

  • ChromePass密码找回工具:轻松获取Chrome保存的所有密码
  • BookmarkHub:告别浏览器书签混乱的智能同步神器
  • 51、保障系统安全:从漏洞扫描到灾难恢复的全面指南
  • DearPyGUI:为什么这款Python GUI框架正在重新定义界面开发?
  • Matlab模拟OAM螺旋谱展开,包括光束本征态、各类湍流、衍射、干涉下的OAM谱分布
  • 【核工业Agent故障处理全攻略】:揭秘高危场景下的7大应急响应策略
  • AI视频字幕生成工具:5步配置与实战应用全攻略
  • 如何快速上手SM3-PHP:5分钟掌握PHP国密加密的完整指南
  • 重构智慧书-第19条:事情刚开始时,不要让人抱过高期望。
  • 塔防无敌塔防小游戏Linux部署演示
  • leetcode 3652(定长滑动窗口/前缀和)
  • Vim插件管理器VAM:零基础小白也能轻松驾驭的终极神器
  • 30、Linux迁移案例:企业与政府的开源实践
  • 模块化多电平换流器(MMC)仿真分析:双闭环控制与最近电平逼近调制
  • Nacos3.1.1部署(Docker)
  • 【稀缺资料】20年经验专家解密:云边 Agent 延迟优化的3层架构设计
  • 跨领域Agent协同架构设计,5个真实工业场景中的落地实践案例
  • 半导体设备通信开发实战:基于secsgem的工业自动化解决方案
  • 【Java毕设全套源码+文档】基于springboot的钢材销售管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 26、Unix系统管理与实用技巧
  • [HZNUCTF 2023 preliminary]ppppop
  • 2025年国内主流的德国SAP系统官方授权实施代理商有哪些?
  • 服务器性能优化实战:从资源瓶颈定位到极致调优(附租赁服务器适配指南)
  • 三相异步电动机交流调速系统:原理、应用与优化控制策略
  • 3、数据科学命令行入门指南
  • Wireshark抓包模式选择:5个关键场景与实战技巧
  • 10、数据探索与可视化全攻略
  • 小学生学C++编程 (自定义函数(二))
  • GPT-5.2国内稳定接入实战:中转调用方案全解析(适配中小团队Python栈)
  • macOS存储空间告急?iSCSI Initiator终极解决方案助你突破存储瓶颈