要想控制LED的亮灭,首先根据硬件原理图得知控制LED的引脚为哪些。随后在STM32中配置相应引脚为输出,相关其他通用配置完成后在Keil中编写相应亮灭方法代码。代码编译通过,最后将程序烧录进硬件设备,调试并观察现象。
以stm32f103vet6为例,实现LED单个依次点亮,8个LED灯从2端依次点亮再从中心依次熄灭步骤如下:
1.配置STM32CubeMx工程
新建一个project
选择自己需要的型号,这里以stm32f103vet6为例
配置引脚的SYS
配置引脚的RCC
查看自己硬件的原理图,查阅LED对应的引脚。
如下LED流水灯的引脚为PC4、PC5、PB0、PB1、PD5、PD6、PD7、PB4。遂在STM32Cube中设置引脚PC4、PC5、PB0、PB1、PD5、PD6、PD7、PB4为GPIO_Output。
为方便使用逐一将其重命名为LED1、LED2、LED3、LED4、LED5、LED6、LED7、LED8
进行时钟配置
进行工程管理配置(合理安排自己工程文件夹位置,另可为自己的工程取一个有意义的英文名称)
点击生成代码
可点击Open Project打开新生成的工程,至此STM32工程配置完毕,此后将进入Keil
2.Keil相关
可先进行编译一下
打开自己工程文件夹存放的位置,新建一个文件夹,可命名为led
新建文件
新建的文件中写入
#ifndef__LED_H__
#define__LED_H__
#include"main.h"
#endif
保存
选择将其命名为led.h保存至事先准备好的led文件夹中
打开main.c文件,在/*USER CODE BEGIN Includes*/后写入
#include"led.h"
因路径问题(未发现此文件)此处报错,遂添加该路径
点击Project→Options for Target
点击C/C++,点击Include Paths后的...
添加新路径
点击...
选择led文件夹
点击OK
添加路径后将不再报错
点亮LED及其流水灯核心代码
新建文件
保存至led文件夹为led.c
在led.c文件中写入
#include"led.h"
将led.c文件添加进工程目录,右击Application/User/Core→点击Add Existing Files...→选择led.c文件,点击Add
在led.h文件中定义函数
voidLEDShunxuOnOff(void);//实现LED的单个依次点亮
在led.c中写入函数具体功能
LEDShunxuOnOff( )实现LED的单个依次点亮,此为超基础版,可使用define简化
voidLEDShunxuOnOff(void)
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_RESET);HAL_Delay(200);
}
在mian.c文件中的while函数的中写入上方编辑的函数
编译程序,若无错误,则可进行烧写
连接硬件下载程序
调试观察现象
另 LEDLiangDuanOnOff( )函数实现8个LED灯从2端依次点亮,从中心依次熄灭。操作与上同理,同样此为最基础版,可简化。
voidLEDLiangDuanOnOff(void)
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_SET);HAL_Delay(200);
HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_RESET);HAL_Delay(200);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_RESET);HAL_Delay(200);
}