【STM32】HAL库LED点灯
一. 实验目的:
- 了解并掌握HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务
二. 实验内容:
一. 1、重做上一个LED流水灯作业,用GPIO端口完成2只LED灯的周期闪烁。
2、接上,再用GPIO端某一管脚接2个开关(用杜邦线模拟代替)。采用中断模式编程,当2分开关接高电平时,
对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作。
二. 在没有示波器条件下,使用Keil的软件仿真逻辑分析仪功能观察LED管脚的时序波形,分析上面作业按键中断时,LED灯的波形变化情况。
二. 具体实验过程:
(1)HAL库介绍
HAL库(Hardware Abstraction Layer)是STMicroelectronics提供的一种高级库,旨在简化STM32系列单片机的开发过程。它封装了底层的复杂性,提供了更高级别的API,使得开发变得更加简单和快速。HAL库的主要优点包括:
1.简化开发流程:
开发人员不需要深入了解底层硬件细节,只需要调用HAL库提供的API函数即可实现底层硬件控制,从而可以更专注于应用程序本身的开发。
2.提高代码复用性:
由于HAL库提供了标准化的接口,可以方便地在不同的STM32系列芯片之间共享代码。
3.增强可移植性:
HAL库的这些特点使得代码更容易在不同的硬件平台上移植。
然而,HAL库也有其缺点,如增加代码复杂度和系统资源占用。此外,与STM32标准库相比,HAL库在资源利用率方面通常不如标准库,因为标准库提供了更底层的接口,开发者可以更好地控制资源的利用。
总的来说,选择使用STM32标准库还是HAL库取决于项目的需求和开发者的背景。对于需要快速开发、简化开发流程的项目,HAL库是一个很好的选择。而对于需要更高灵活性和资源利用率的项目,标准库可能更适合。
(2)具体操作流程
第一步,到官网或者相关分析网站下载cubeMX,这里不多赘述。
1.安装jdk
由于STM32CubeMX是Java实现的,需要安装jdk环境。
jdk官网下载链接:
https://www.oracle.com/java/technologies/javase-downloads.html
2.安装STM32CubeMX
下载地址:
https://www.st.com/en/development-tools/stm32cubemx.html
第二步,打开cubeMX
进入cubeMX中,选择新建项目
选择使用芯片,这里使用的是stm32f108c6
配置RCC、SYS、以及我们用来控制led亮灭的GPIO口
点击创建项目
然后我们会发现文件里会生成一个已经配置好了的keil文件
打开文件即可开始编写代码。
为了进一步简化操作,我们也可以选择在已配置好的keil文件中加入一些我们已经写好的调用相关部件的函数。
1.实现LED流水灯
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // ֆ1
HAL_Delay(1000); // ғʱ1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // ֆ1İ
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // ֆ2
HAL_Delay(1000); // ғʱ1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // ֆ2İ
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // ֆ3
HAL_Delay(1000); // ғʱ1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // ֆ3İ
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
2.实现GPIO控制流水灯
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
static GPIO_PinState Receive;
if(1==1)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
HAL_Delay(1000);
}
else{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
成果展示
hal库操作流水灯
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/14286a2a2c7f46c0a58c9ec71097ba5e.png)
三. 总结:
本次实验中学习了通过cubeMX软件来使用hal库配置单片机的运行环境和函数,通过使用hal库的方式,极大的简化了使用keil设计stm32程序的过程,省去了查阅相关寄存器的过程,使我受益匪浅。