四、STM32 HAL库API完全指南:从功能分类到实战示例

[复制链接]
发表于 2025-9-9 16:27:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
STM32 HAL库API完全指南:从功能分类到实战示例

一、HAL库API的总体架构

STM32 HAL库(Hardware Abstraction Layer)作为STMicroelectronics推出的同一驱动框架,提供了覆盖全部STM32外设的尺度化API。HAL库的API设计遵照严酷的分层架构和命名规范,旨在简化开发流程并进步代码可移植性。
HAL库API主要分为以下几大类:

  • 外设初始化与配置
  • 数据传输与通信
  • 停止与DMA管理
  • 状态监控监控与错误处理
  • 定时器与PWM控制
  • ADC/DAC与模拟功能
  • 低功耗与电源管理
  • 系统服务与辅助功能
二、外设初始化与配置类API

这类API负责外设的初始化、反初始化以及底层硬件配置
  1. /* 通用初始化函数 */
  2. HAL_StatusTypeDef HAL_<外设>_Init(<外设>_HandleTypeDef *h<外设>);
  3. HAL_StatusTypeDef HAL_<外设>_DeInit(<外设>_HandleTypeDef *h<外设>);
  4. /* MSP底层配置函数(用户需实现) */
  5. void HAL_<外设>_MspInit(<外设>_HandleTypeDef* h<外设>);
  6. void HAL_<外设>_MspDeInit(<外设>_HandleTypeDef* h<外设>);
  7. /* 参数配置函数 */
  8. HAL_StatusTypeDef HAL_<外设>_Config(<外设>_HandleTypeDef *h<外设>, <配置结构体>* config);
  9. HAL_StatusTypeDef HAL_<外设>_GetConfig(<外设>_HandleTypeDef *h<外设>, <配置结构体>* config);
复制代码
典型示例
  1. // UART初始化
  2. HAL_UART_Init(&huart2);
  3. // SPI配置
  4. SPI_InitTypeDef spiConfig = {0};
  5. spiConfig.Mode = SPI_MODE_MASTER;
  6. spiConfig.Direction = SPI_DIRECTION_2LINES;
  7. // ...其他配置
  8. HAL_SPI_Config(&hspi1, &spiConfig);
复制代码
三、数据传输与通信类API

这类API支持各种通信协议的数据收发,包括轮询、停止和DMA三种模式:
  1. /* 轮询模式 */
  2. HAL_StatusTypeDef HAL_<外设>_Transmit(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  3. HAL_StatusTypeDef HAL_<外设>_Receive(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  4. /* 中断模式 */
  5. HAL_StatusTypeDef HAL_<外设>_Transmit_IT(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size);
  6. HAL_StatusTypeDef HAL_<外设>_Receive_IT(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size);
  7. /* DMA模式 */
  8. HAL_StatusTypeDef HAL_<外设>_Transmit_DMA(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size);
  9. HAL_StatusTypeDef HAL_<外设>_Receive_DMA(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size);
  10. /* 双向通信(如SPI全双工) */
  11. HAL_StatusTypeDef HAL_<外设>_TransmitReceive(<外设>_HandleTypeDef *h<外设>, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);
  12. HAL_StatusTypeDef HAL_<外设>_TransmitReceive_IT(<外设>_HandleTypeDef *h<外设>, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size);
  13. HAL_StatusTypeDef HAL_<外设>_TransmitReceive_DMA(<外设>_HandleTypeDef *h<外设>, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size);
复制代码
典型示例
  1. // UART轮询发送
  2. HAL_UART_Transmit(&huart2, "Hello World!", 12, 1000);
  3. // SPI中断接收
  4. HAL_SPI_Receive_IT(&hspi1, rxBuffer, 32);
  5. // I2C DMA发送
  6. HAL_I2C_Master_Transmit_DMA(&hi2c1, 0x50, txBuffer, 16);
复制代码
四、停止与DMA管理类API

这类API用于配置和处理外设停止及DMA操作:
  1. /* 中断处理函数 */
  2. void HAL_<外设>_IRQHandler(<外设>_HandleTypeDef *h<外设>);
  3. /* 中断回调函数(用户需重写) */
  4. __weak void HAL_<外设>_TxCpltCallback(<外设>_HandleTypeDef *h<外设>);
  5. __weak void HAL_<外设>_RxCpltCallback(<外设>_HandleTypeDef *h<外设>);
  6. __weak void HAL_<外设>_TxRxCpltCallback(<外设>_HandleTypeDef *h<外设>);
  7. __weak void HAL_<外设>_ErrorCallback(<外设>_HandleTypeDef *h<外设>);
  8. /* DMA相关函数 */
  9. HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);
  10. HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
  11. HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
  12. HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma);
  13. HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma);
复制代码
典型示例
  1. // UART中断处理函数(在stm32xxxx_it.c中)
  2. void USART2_IRQHandler(void)
  3. {
  4.   HAL_UART_IRQHandler(&huart2);
  5. }
  6. // 重写UART接收完成回调
  7. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  8. {
  9.   if (huart->Instance == USART2) {
  10.     // 处理接收到的数据
  11.     process_uart_data(rxBuffer, rxSize);
  12.   }
  13. }
复制代码
五、状态监控监控与错误处理类API

这类API用于查抄外设状态、获取错误码及扫除标志位:
  1. /* 获取外设状态 */
  2. HAL_StatusTypeDef HAL_<外设>_GetState(<外设>_HandleTypeDef *h<外设>);
  3. /* 获取错误码 */
  4. uint32_t HAL_<外设>_GetError(<外设>_HandleTypeDef *h<外设>);
  5. /* 标志位操作 */
  6. FlagStatus HAL_<外设>_GetFlagStatus(<外设>_HandleTypeDef *h<外设>, uint32_t Flag);
  7. void HAL_<外设>_ClearFlag(<外设>_HandleTypeDef *h<外设>, uint32_t Flag);
复制代码
典型示例
  1. // 检查UART是否就绪
  2. if (HAL_UART_GetState(&huart2) == HAL_UART_STATE_READY) {
  3.   // 可以进行数据传输
  4. }
  5. // 获取SPI错误码
  6. uint32_t error = HAL_SPI_GetError(&hspi1);
  7. if (error != HAL_ERROR_NONE) {
  8.   // 处理错误
  9. }
复制代码
六、定时器与PWM控制类API

这类API用于定时器配置、PWM输出及定时功能:
  1. /* 定时器基础功能 */
  2. HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);
  3. HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
  4. HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
  5. HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim);
  6. HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);
  7. /* PWM输出功能 */
  8. HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);
  9. HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
  10. HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
  11. HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
  12. HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
  13. HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel);
  14. /* 输入捕获功能 */
  15. HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim);
  16. HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
  17. HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
  18. HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
  19. HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
复制代码
典型示例
  1. // 启动定时器中断(用于周期性任务)
  2. HAL_TIM_Base_Start_IT(&htim3);
  3. // 启动PWM输出(用于电机控制)
  4. HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  5. // 修改PWM占空比
  6. TIM_OC_InitTypeDef sConfigOC = {0};
  7. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  8. sConfigOC.Pulse = 500; // 修改占空比值
  9. HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
复制代码
七、ADC/DAC与模拟功能类API

这类API用于模拟数字转换和数字模拟转换:
  1. /* ADC功能 */
  2. HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc);
  3. HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc);
  4. HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc);
  5. HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc);
  6. HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc);
  7. uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc);
  8. /* DAC功能 */
  9. HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef *hdac);
  10. HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);
  11. HAL_StatusTypeDef HAL_DAC_Start_IT(DAC_HandleTypeDef *hdac, uint32_t Channel);
  12. HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel);
  13. HAL_StatusTypeDef HAL_DAC_Stop_IT(DAC_HandleTypeDef *hdac, uint32_t Channel);
  14. HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
  15. uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef *hdac, uint32_t Channel);
复制代码
典型示例
  1. // 启动ADC并读取值
  2. HAL_ADC_Start(&hadc1);
  3. uint32_t adcValue = HAL_ADC_GetValue(&hadc1);
  4. // 启动DAC输出
  5. HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
  6. HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048); // 输出1.65V (3.3V的一半)
复制代码
八、低功耗与电源管理类API

这类API用于配置STM32的各种低功耗模式:
  1. /* 睡眠模式 */
  2. void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t STOPEntry);
  3. /* 停止模式 */
  4. void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry);
  5. void HAL_PWR_ExitSTOPMode(void);
  6. /* 待机模式 */
  7. void HAL_PWR_EnterSTANDBYMode(void);
  8. /* 低功耗配置 */
  9. void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx);
  10. void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx);
  11. void HAL_PWR_EnableBkUpAccess(void);
  12. void HAL_PWR_DisableBkUpAccess(void);
复制代码
典型示例
  1. // 配置唤醒引脚并进入停止模式
  2. HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
  3. HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  4. // 进入待机模式(仅外部复位或WKUP引脚可唤醒)
  5. HAL_PWR_EnterSTANDBYMode();
复制代码
九、系统服务与辅助功能类API

这类API提供系统级功能和辅助工具:
  1. /* 系统时钟配置 */
  2. HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);
  3. HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency);
  4. /* 中断控制 */
  5. void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);
  6. void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
  7. void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);
  8. /* GPIO操作 */
  9. void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
  10. void HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
  11. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);
  12. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin, GPIO_PinState PinState);
  13. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);
  14. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);
  15. /* 延时功能 */
  16. __weak void HAL_Delay(uint32_t Delay);
  17. /* 看门狗功能 */
  18. HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);
  19. HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);
  20. HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);
  21. HAL_StatusTypeDef HAL_WWDG_SetCounter(WWDG_HandleTypeDef *hwwdg, uint32_t Counter);
复制代码
典型示例
  1. // 配置系统时钟
  2. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  3. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  4. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  5. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  6. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  7. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  8. // ...其他配置
  9. HAL_RCC_OscConfig(&RCC_OscInitStruct);
  10. // GPIO操作
  11. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 点亮LED
  12. HAL_Delay(500); // 延时500ms
  13. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 熄灭LED
  14. // 喂狗操作(独立看门狗)
  15. HAL_IWDG_Refresh(&hiwdg);
复制代码
十、HAL库API利用最佳实践


  • 遵照初始化流程

    • 利用STM32CubeMX生成底子初始化代码
    • 按照"系统时钟→外设→应用"的顺序初始化

  • 公道选择通信模式

    • 简单场景利用轮询模式
    • 及时性要求高的场景利用停止模式
    • 大数据量传输利用DMA模式

  • 精确处理停止

    • 在停止处理函数中调用HAL_<外设>_IRQHandler()
    • 重写相应的回调函数处理变乱
    • 保持停止处理代码简便

  • 错误处理

    • 查抄API返回值,处理大概的错误
    • 利用HAL_<外设>_GetError()获取详细错误信息

  • 低功耗设计

    • 根据应用需求选择符合的低功耗模式
    • 注意唤醒源配置和唤醒后的系统恢复

把握这些API分类和利用本领,开发者可以高效地利用HAL库完成各种STM32项目开发,从简单的GPIO控制到复杂的多外设协同工作。HAL库的尺度化设计使得代码更具可读性、可维护性和可移植性,是STM32开发的首选方案。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表