一、CubeMX 点亮 LED 灯
1.1 CubeMX 中操作
1、打开 CubeMX → file → new project 新建一个工程→ 搜索框里输入芯片型号→双击选择芯片对应封装等待
2、根据上面深蓝/浅蓝的导航对 IO 口进行配置:
(1)Pinout & Configuration(引脚和配置):板子上连接 LED 的 IO 口是 PB5,点击 PB5,设置为GPIO output。
(2)Clock Configuration(时钟配置):使用外部时钟的最快频率。
(3)Project Manager(项目管理)
根据竖边的导航 :
① Project
- 给项目取名、设置工程路径。
- 选择 IDE: MDK-ARM V5
②Code Generator
一定要将 Generated fies 中的第一个给勾上。
(译为:以每个外围设备的一对“.c/.h”文件的形式生成外围设备初始化)
③Advanced Settings
无操作,默认第一个勾上。
3、点击最上面蓝条 GENERATE CODE ,生成代码。
4、close 关闭弹窗。
1.2编写核心代码
1、代码地址:C:\Users\chenlDesktopltest\CubeMX\test1\MDK-ARM\test.uvprojx-μVision
2、用 CubeMX 对 GPIO 的设置都放在了 gpio.c 文件下, CubeMX 已经自动生成了这部分初始化代码。
3、想要点亮 LED 的话,需要在 main.c 里进行编写。以下代码是实现 3 个 LED 每 500ms 的闪烁。
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET);
HAL_Delay(500);
/* USER CODE END WHILE */
注意:
- 必须在 CODE BEGIN 和CODE END 之间编写代码,在调试后修改才不会丢失。
- 注意一下括号中的 3 部分。
- 注意同时写 3 个引脚的方式。
二、按键点亮 LED 灯 500ms 后熄灭
2.1任务分析
- 按下按键:Input 的过程\平时是高电平,用来检测低电平,就是上拉输入
- 点亮 LED 灯 :Output 的过程\平时是低电平,用来检测高电平,就是下拉输出
- 500ms : 延时的过程
- 熄灭 :Output 的过程
2.2 CubeMX 中操作
1、打开 CubeMX → file → new project 新建一个工程→ 搜索框里输入芯片型号→双击选择芯片对应封装等待
2、根据上面深蓝/浅蓝的导航对 IO 口进行配置:
(1)Pinout & Configuration(引脚和配置):控制 LED 的 IO :PE4、PE5、PE6 配置成输出,控制开关的 IO :PE0、PE1、PE2 配置成输入。
在下图 1 中点击 2 配置上面的内容,还需要点击 3,选中 4 中的 GPIO 输出进行进一步配置,如 5所示。
(2)Clock Configuration(时钟配置):使用外部时钟的最快频率。
后面的内容与上面 1.1 中一模一样。
2.3编写核心代码
1、实现 3 个按键分别控制点亮 3 个 LED灯 500ms 后熄灭代码地址:C:\Users\chenlDesktopltest\CubeMX\test2\MDK-ARM\test2.uvprojx-μVision
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)==GPIO_PIN_RESET){ /* if 判断 */
while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)== GPIO_PIN_RESET ); /* 松手检测 */
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET);/* 点亮 */
HAL_Delay(500);/* 延时 */
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);/* 熄灭 */
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1)==GPIO_PIN_RESET){
while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1)== GPIO_PIN_RESET );
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==GPIO_PIN_RESET){
while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)== GPIO_PIN_RESET );
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_RESET);
}
/* USER CODE END WHILE */
注意:
- 自己的项目中按键模块使用了一款芯片,可以有自己的模式配置,这里没有用到,后续有机会探究。
- 这里的 3 个按键和 3 个 LED 灯必须写成 3 个 if ,不能像 1.2 中的一样,写成一个部分。
按键控制LED灯
三、使用User Lable提高代码的重用性
3.1引入
在以上的代码中,如果 3 个按键不是用于 LED 灯的点亮,而是改成分别用于电机的正转、反转、停转或者其他复用功能,就需要非常繁琐的修改代码,这说明代码的重用性很低,这就需要用 User Label (用户标签)来提升代码的重用性。
User Label (用户标签):在 main.h 中生成 define 语句。
3.2 CubeMX 中操作
将 LED 灯添加标签:LED1,LED2,LED3。
将按键灯添加标签:KEY1,KEY2,KEY3。
操作完毕后,再次打开文件已经更新。
再次打开 Keil 中 main.h 文件,可以看见私有定义:
修改 main.c 文件如下:
说明:
GPIOE 变成对应的 XXXn_GPIO_Port ,GPIO_PIN_n 变成对应的 XXXn_Pin。
(其中,XXX 为 KEY 或者 LED,n=1,2,3)
你可能会疑惑,改变后的代码在功能上没有任何的变化,那为什么还要改变呢?
请你设想,如果我现在需要用按键 2,3,4 来点亮灯 1,2,3 了,不再是按键 1,2,3 了,按照之前的代码就需要再 CubeMX 中先释放之前的引脚,重新配置引脚,再修改代码中所有含引脚序号的位置,但是使用现在这个代码,我只要在图 3.1 中修改对应的按键 1,2,3,4 的 User Lable 即可。
这个例子不太明显,不能真正体现 User Lable ,大家在后续更复杂的工程可能更有体会,现在了解即可。
调试学习是根据以下视频进行学习,感谢每一位讲课的好老师,如有侵权,敬请联系。
STM32系列视频(CubeMX+MDK5+HAL库+库函数一站式学习)_哔哩哔哩_bilibili