stm32串口接收数据HAL
时间: 2025-02-11 14:11:48 浏览: 25
STM32 HAL UART 接收数据示例代码
对于STM32微控制器系列,利用HAL库实现UART接口的数据接收是一项常见需求。下面提供一段基于HAL库的C语言代码片段用于初始化并配置UART外设以接收数据。
初始化UART通信端口
#include "stm32f4xx_hal.h"
UART_HandleTypeDef huart1;
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600; // 设置波特率
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
这段代码展示了如何设置USART1实例及其参数,包括但不限于波特率、字长、停止位等,并调用HAL_UART_Init()
函数完成硬件资源分配和寄存器配置[^1]。
实现非阻塞方式下的单字符读取功能
为了能够灵活处理接收到的数据而不影响其他任务执行,在这里采用中断驱动的方式来进行异步I/O操作:
uint8_t receivedChar;
// 中断服务程序ISR定义
void USART1_IRQHandler(void)
{
/* ENTER_CRITICAL_SECTION(); */
HAL_UART_IRQHandler(&huart1);
/* LEAVE_CRITICAL_SECTION(); */
}
// 配置NVIC优先级组分以及使能对应IRQ通道
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
/* Configure TX Pin as alternate function push-pull */
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Configure RX Pin as input floating */
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Enable USART1 clock */
__HAL_RCC_USART1_CLK_ENABLE();
/* Enable and set USART1 Interrupt to a lower priority level */
HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
// 定义回调函数用于实际业务逻辑处理
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1){
printf("Received char:%c\n",receivedChar);
// 继续准备下次接收
HAL_UART_Receive_IT(&huart1,&receivedChar,1);
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
// 开始等待第一个字符到来触发中断
HAL_UART_Receive_IT(&huart1,&receivedChar,1);
while (1){}
}
上述代码实现了通过外部中断机制捕获到新到达的数据帧后自动唤醒CPU进行相应动作的功能;同时每次成功获取一个字节之后都会重新启动新一轮监听过程以便持续工作下去。
相关推荐


















