黄石市网站建设_网站建设公司_网站开发_seo优化
2025/12/18 18:51:42 网站建设 项目流程

文章目录

  • 前言
  • 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. 总结

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询