STM32 基于HAL库的LED流水灯
引言:
在嵌入式系统开发中,LED流水灯是一个经典的实验项目,它不仅能够展示出微控制器的强大能力,还能为我们带来乐趣和创造力的发挥。而在本次学习中,我们将使用STM32F103C8t6,并基于HAL库(Hardware Abstraction Layer)来实现LED流水灯的效果。
STM32是一种功能强大的微控制器系列,具有高性能和广泛的应用领域。而HAL库则是STMicroelectronics为STM32开发的一套硬件抽象层,它提供了一系列的API函数,可以简化底层硬件操作,并提高开发效率。
让我们一起开始这个有趣而富有挑战性的学习吧!
٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶
文章目录
一、STM32CubeMX安装
1. 基本介绍
STM32CubeMX 是用于 32 位 ARM Cortex STM32 微控制器的图形工具。它允许对 STM32 微控制器和微处理器进行非常简单的配置,生成初始化 C 代码,还可以通过一步一步的操作为 Arm Cortex-M 内核或 Arm Cortex-A core 生成部分 Linux 设备树。它是 STMCube 生态系统的一部分,且可以作为独立应用程序或作为 Eclipse 插件集成在开发环境(STM32CubeIDE)中。
2. 主要特点
-
直观的 STM32 微控制器和微处理器选择
-
丰富易用的图形用户界面,可配置:
-
a. 引脚分配:带自动解决冲突
-
b. Arm Cortex-M Core 外设和中间件功能模式以及相关参数约束:带动态验证
-
c. 时钟树:带动态验证
-
d. 电源测算:有功耗估计结果
-
生成可运行在 IAR、Arm Cortex-M core 的 Keil 和 STM32CubeIDE(GCC编译器)环境下的初始化 C 代码项目工程
-
为 Arm Cortex-A core(STM32微处理器)生成部分 Linux 设备树
-
可借助 STM32PackCreator 开发增强型 STM32Cube 扩展包
-
将 STM32Cube 扩展软件包集成到项目工程中
-
支持多种操作系统:Windows,Linux,MacOS。(必须安装 Java 环境)
3. 软件下载
3.1 Java 官网下载
下载地址: https://www.java.com/zh_CN/download/windows-64bit.jsp(尽量安装最新版 64 位的Java)
下载方法:
- 打开官网下载地址,点击 同意并开始免费下载;
- 无需登陆,直接可以下载。
3.2 CubeMX 官网下载
下载地址: 官网下载地址 --> https://www.st.com/stm32cubemx
下载方法:
-
- 打开官网下载地址,点击 获取软件;
-
-
- 选择对应的版本进行下载。(需要登陆账号,其中 Linux 和 MacOS 的配置文件和 Windows 安装包在同一个文件中)
- 选择对应的版本进行下载。(需要登陆账号,其中 Linux 和 MacOS 的配置文件和 Windows 安装包在同一个文件中)
-
3.3 云盘下载
下载地址:https://pan.baidu.com/s/1-7z6Q0Mlscaw8yiCZzfkug(提取码:5eby)
下载方法:直接下载。(云盘收录了 STM32Cube 系列软件)
4 . 软件安装
4.1 Java 安装
- 打开 jre-8u261-windows-x64.exe 安装包,勾选更改目标文件夹,点击 安装;
-
选择合适的安装目录,点击 下一步;
-
等待自动安装;
-
安装完毕,点击 关闭;
-
在开始菜单中查看到以下文件夹,即代表安装成功。
4.2 CubeMX 安装
- 打开 SetupSTM32CubeMX-6.0.0.exe 文件,如果未安装 Java 环境,将会出现报错;
- 安装 Java 后,打开 SetupSTM32CubeMX-6.0.0.exe 文件,其他系统安装参考 Readme.html,点击 Next;
- 勾选 I accpt,点击 Next;
-
勾选第一个,点击 Next;
(第二个勾选表示参加改善用户体验计划,即上传用户日志数据,若勾选安装后,可在软件 Help > User Preferences > General Settings 里取消)
- 选择合适的安装路径,点击 Next;(若路径未创建,会提示路径将被创建)
- 根据需求勾选,点击 Next;
- 程序自动安装,安装完成后,点击 Next;
- 提示安装成功和一个卸载程序被创建在安装目录的 Uninstaller 文件夹中,点击 Done;
- 打开 STM32CubeMX 软件;
- 若安装的 Java 是 32 位的,将会在每次打开软件时弹窗提醒,只需安装 Java 64 位即可消除弹窗;
- 软件界面如下;
二、CubeMX项目创建
- 首先在File文件下拉框的内部选择新建工程
- 在弹出的对话框中,下拉列表中输入你的芯片名称,并且选择你的芯片类型。
- 然后选择系统的debug模式 (Serial Wire)
- 然后选择芯片的引脚并且设置对应的模式
这里我设置PC15 、PA3、PB0为LED发光的端口
- 接下来,我们来配置中断的端口
我设置 PA15 为中断的端口
- 接下来,我们来设置中断端口的模式配置
这里,我设置为浮空并且下降沿、上升沿都触发
- 开启中断,并且配置优先级
-
设置时钟36M
-
基础配置
- 生成工程
三、项目代码
实现思路:
由于我们需要实现的效果为当开关接高电平时,LED流水灯工作,接低电平时,LED流水灯停止工作。
因此,我们可以设置一个变量,当该变量为1的时候流水灯进行工作,当该变量为 0的时候流水灯不进行工作。
而这个变量的改变,就取决于中断函数的内部,当接高电平的时候在中断函数的内部可以将该变量置一,当接低电平的时候,可以在中断函数内部将该变量置零。
因此,即完成了我们整个过程。
中断函数判别变量的设置
/* USER CODE BEGIN PV */
uint16_t flag = 2; // 默认关闭流水灯
/* USER CODE END PV */
main函数内部的内容.
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(flag == 1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,1);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,0);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,1);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,0);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,0);
HAL_Delay(100);
}
}
中段触发函数的设置.
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
if(GPIO_Pin == GPIO_PIN_15) // 判断是否为对应的中断端口
{
GPIO_PinState pin_State = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15); // 获取对应端口状态
// 端口电平到判断变量的映射
flag = pin_State;
}
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
四、实践结果
实践结果展示
VID_20231023_164651
实践结果解释
当插入高电平的时候,流水灯触发,当插入低电平的时候流水灯功能关闭,因为是浮空输入,所以当插入高电平和在浮空的时候类似,但是在高电平的时候对应流水灯的亮度会提高。
KEIL 调试波形观察
五、总结
本次实验是基于STM32的HAL库实现LED流水灯效果。通过该实验,对STM32的HAL库以及GPIO、外部中断的使用有了更深入的了解
在实验中,通过HAL库提供的函数,我可以方便地对GPIO引脚进行初始化、配置和控制。在本次实验中,我使用了3个GPIO引脚来控制3个LED灯,通过外部中断的触发来控制LED流水灯功能是否打开
通过本次实验,我不仅学会了使用STM32的HAL库来控制GPIO引脚和定时器,还掌握了调试代码的方法和技巧。
总而言之,通过本次实验,我对STM32的HAL库的使用有了更深入的了解,这次实验不仅提高了我的实践能力,还培养了我对细节的关注和解决问题的能力。我相信这些经验将对我今后的学习和工作有所帮助。
最后感谢大佬友情链接:
- https://blog.youkuaiyun.com/Brendon_Tan/article/details/107685563