C 语言使用 HAL 库开发

ST公司先后推出了两套主要库:标准外设库(Standard Peripherals Library)和HAL库(Hardware Abstraction Layer)。标准外设库是STM32最早发布的固件库,对STM32芯片进行了完整的封装,包含所有外设的性能特征,每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。因为发布比较早,教程比较多,目前仍有不少开发者使用。标准外设库是针对某一系列STM32芯片而设计的,没有可移植性,目前该库已将停止了更新、研发,最近几年发布的新STM32芯片已经不再支持。

HAL库是ST公司这几年极力推荐的官方库,目前支持STM32全系产品,可以说HAL库就是用来取代之前的标准外设库的。相比标准外设库,HAL库具有更高的抽象整合水平,API集中关注外设的公共函数功能,使得可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。此外还有LL库(Low Layer),相比其它固件库更接近硬件层,一般和HAL库结合使用,可以看作是HAL库的补充。

本章涉及的代码位于100ASK_STM32F103开发板资料的“5_程序源码\0_单片机开发模式的发展\2_C语 言使用HAL库开发\”。HAL库和标准库的使用区别不大,也无需知道外设寄存器地址,主函数如代码段 6.5.1 所示。

代码段 6.5.1 C 语言使用 HAL 库开发(main.c)

#include "main.h"
#include "driver_led.h"
int main(void) {
// 初始化 HAL 库函数必须要调用此函数
HAL_Init();
// 系统时钟即 AHB/APB 时钟配置
SystemClock_Config();
// 初始化 LED
LedGpioInit();
// 点亮 LED 灯
while(1) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(1000); } }
  • 6~9行:使用HAL的一些初始化操作;
  • 11~12行:调用编写的“LedGpioInit()”函数,初始化需要的GPIO,该函数定义在“driver_led.c”里,如代码段 6.5.2 所示;
  • 15~21行:通过调用HAL提供的“HAL_GPIO_WritePin”函数控制引脚输出的电平高低;HAL库还提供延时函数“HAL_Delay()”,用户不用再自己编写延时函数;

代码段 6.5.2 GPIO 初始化(driver_led.c)

#include "driver_led.h"
/*
* 函数名:void LedGpioInit(void)
* 输入参数:无
* 输出参数:无
* 返回值:无
* 函数作用:初始化 LED 的引脚,配置为上拉推挽输出
*/
void LedGpioInit(void) {
// 定义 GPIO 的结构体变量
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能 LED 的 GPIO 对应的时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0; // 选择 LED 的引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 设置为推挽输出模式
GPIO_InitStruct.Pull = GPIO_PULLUP; // 默认上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;// 引脚反转速度设置为快
// 初始化引脚配置
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); }
  • 15行:使用HAL库提供的“__HAL_RCC_GPIOB_CLK_ENABLE()”使能GPIO B端口时钟;
  • 13~23行:将GPIO属性封装为结构体,通过设置结构体成员的属性,完成对GPIO的设置;

以上代码就实现了对开发板三色灯的红色灯交替闪烁效果,读者可以打开配套资料的“5_程序源码\0_单片机编程模式的发展\ 4_C语言使用HAL库开发\ Project\ Led_Hal.uvprojx”工程,编译、下载,体验效果。

使用HAL库的体验和标准库差不多,但HAL兼顾了其它ST芯片,用户可以无缝过渡到ST其它芯片的使用。各开发模式之间的差异如表 6.5.1 所示。

C 语言使用 HAL 库开发_c语言


【总结】

本章开始讲解了一些STM32结构的基础知识,这些知识对STM32的整体理解会有很大帮助,读者应多理解。

随后介绍的四种开发模式,读者重点理解C语言操作寄存器开发和使用HAL库开发。后续的实验会以HAL库为主,但读者也应理解HAL库的本质也是操作寄存器,因此理解如何操作寄存器,对以后学习、调试,都会有帮助。


百问网技术论坛:
http://bbs.100ask.net/