STM32 HAL库开发指南
简介#
STM32 HAL(Hardware Abstraction Layer)库是ST官方提供的硬件抽象层库,简化了STM32微控制器的开发流程。本文总结了一些常用的开发经验和技巧。
开发环境#
-
安装 STM32CubeIDE
- 下载地址:ST官网 ↗
- 或使用 STM32CubeMX + VS Code + PlatformIO
-
配置开发环境
- 安装必要的驱动(ST-Link, USB转串口等)
- 配置代码生成选项
- 设置调试参数
-
创建新项目
- 选择芯片型号
- 配置时钟树
- 启用需要的外设
常用外设配置#
GPIO 配置#
// GPIO 初始化示例
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置引脚
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}cUART 配置#
// UART 初始化示例
UART_HandleTypeDef huart2;
void UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
}
// 发送数据
HAL_UART_Transmit(&huart2, (uint8_t*)data, len, HAL_MAX_DELAY);
// 接收数据(中断方式)
HAL_UART_Receive_IT(&huart2, rx_buffer, BUFFER_SIZE);cTIM 定时器配置#
// 定时器初始化示例
TIM_HandleTypeDef htim2;
void TIM_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8399; // 84MHz / 8400 = 10kHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 9999; // 10kHz / 10000 = 1Hz
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
// 启动定时器中断
HAL_TIM_Base_Start_IT(&htim2);
}
// 定时器中断回调
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
// 定时任务
}
}c调试技巧#
// printf 重定向到串口
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}c常见问题#
-
时钟配置错误
- 使用 STM32CubeMX 配置时钟树
- 检查 HSE/HSI 是否正确启用
-
中断不触发
- 检查 NVIC 是否使能
- 确认中断优先级设置
-
DMA 传输失败
- 检查 DMA 流和通道配置
- 确认缓冲区地址对齐