stm32 串口接收HAL
时间: 2025-01-13 09:44:17 浏览: 20
STM32 HAL UART 接收功能
对于STM32微控制器系列,在使用硬件抽象层(HAL)库进行UART通信时,初始化和配置过程至关重要。下面提供了一个简单的例子来展示如何设置并利用中断方式接收数据。
初始化与配置
为了使能UART外设以及相关GPIO端口,需要调用MX_USARTx_UART_Init()
函数完成基本参数设定,这通常是在项目模板自动生成的部分中定义好的[^1]:
// USARTx clock enable
__HAL_RCC_USARTx_CLK_ENABLE();
/* Configure the GPIO pins */
__HAL_RCC_GPIOA_CLK_ENABLE();
接着要创建一个用于存储接收到的数据缓冲区,并注册回调处理程序以便当有新字符到达时能够触发相应的动作:
#define RXBUFFERSIZE 32
uint8_t aRxBuffer[RXBUFFERSIZE];
static void MX_USARTx_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();
}
}
中断驱动的接收方法
通过启用全局中断和服务例程可以实现在后台自动读取来自串行线路上的信息而不阻塞主线程执行流程。为此需开启特定事件类型的IRQ通道并将对应的ISR链接到实际逻辑里去:
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle){
/* Enable peripheral clocks */
__HAL_RCC_USART1_CLK_ENABLE();
// ...其他必要的初始化...
/* Enable and set UART Interrupt to the lowest priority */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
void USART1_IRQHandler(void){
HAL_UART_IRQHandler(&huart1);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance==USART1){
// Process received data here...
// Restart reception after processing previous bytes.
HAL_UART_Receive_IT(&huart1, (uint8_t*)aRxBuffer, RXBUFFERSIZE);
}
}
最后一步就是在应用程序入口处启动异步接收操作,这样每当缓存满载或是遇到指定条件终止符的时候就会激活之前提到过的回调机制来进行下一步骤的操作了。
int main(void){
// Initialization routines ...
// Start receiving without blocking further execution of program
HAL_UART_Receive_IT(&huart1,(uint8_t *)aRxBuffer,RXBUFFERSIZE);
while (1){
// Main loop tasks go here...
}
}
上述代码片段展示了基于STM32 HAL库实现UART接收的一个典型应用场景。需要注意的是具体细节可能会因所使用的开发板型号不同而有所变化;因此建议查阅官方提供的文档获取最准确的帮助和支持。
相关推荐


















