HAL库(Hardware Abstraction Layer)全称就是Hardware Abstraction Layer(抽象印象层),是STMicroelectronics推出的一套面向STM32系列微控制器的软件库。HAL库提供了一组API,用于简化底层硬件的访问和控制,使开发者能够更容易地编写嵌入式应用程序。HAL库提供了丰富的功能,包括GPIO控制、定时器、中断、UART、SPI、I2C等外设的驱动函数。开发者可以通过调用这些函数来实现对硬件的配置和操作。HAL库的优势在于它提供了一种独立于硬件平台的编程接口。无论使用哪种型号的STM32微控制器,开发者都可以使用相同的API进行开发,减少了学习和移植的成本。同时,HAL库还提供了一套易于使用的代码生成工具,可以根据用户的需求自动生成初始化代码,进一步简化了开发流程。
一、开发环境搭建
1.安装JDK
由于STM32CubeMX是Java实现的,需要安装jdk。通过链接进入jdk官网:
进入之后,点击Java archive
点击Java SE,选择8u202 and earlier这个版本
按自己电脑操作系统选择,这里下载的是Windows x64的jdk环境
(注:在点击下载之后,会弹出一个Oracle账户登录,没有注册需要先注册)
下载完成后,找到文件,双击安装
2.安装STM32CubeMX
(1)通过下方链接进入官网下载STM32CubeMX:
STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics
(2)通过百度网盘链接下载
链接:https://pan.baidu.com/s/1vZ7JCZawY2WB9XlJYsZ2yQ
提取码:by06
右键选择管理员身份运行
开始安装
勾选同意选项 ,点击Next
勾选已阅读,点击Next
自行选择下载目录,点击Next
点击确定
后面都点击Next
安装完成,点击Done
(3)安装固件库
选择help,点击Manage...
找到STM32F1, 下载1.8.5版本固件库
二、实现LED流水灯,用GPIO端口完成2只LED灯的周期闪烁。
1.创建项目
(1)新建file,创建新项目
(2)点击搜索并选择芯片STM32F103C8T6
(3)双击创建
(4)选择SYS
(5)选择RCC
(6)选择GPIO,点击输出设置GPIO_Output,此处我选择PA15,PB0,PC13三个端口
(8)Clock Configuration设置
(9)Project Manager设置
(10)各板块完成设置后使用keil打开
2.keil中修改main.c代码
(1)在while(1)中输入代码,然后点击编译生成Hex文件,进行烧录
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 灯1亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET); // 灯2亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); // 灯2灭
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 灯3亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 灯3灭
(2)点击编译生成hex文件
3.烧录运行结果
二、采用中断控制LED亮灭
用GPIO端某一管脚接2个开关(用杜邦线模拟代替)。采用中断模式编程,当2分开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作。
1.在STM32CubeMX中创建项目
SYS和RCC的配置不变,GPIO端口配置和中断配置作如下修改:
2.keil中修改main.c代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin){
case GPIO_PIN_0:
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
break;
case GPIO_PIN_1:
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_6);
break;
}
}