一、流水灯
1.1介绍
开发板:ISKBoard
CPU:STM32L431RCT6
处理器:Arm® Cortex®-M4 处理器
左端接入了3.3V电源,要使LED发光则需要分别在PC9(红)、PC6(绿)、PB2(蓝)引脚接入低电平,如果要让它熄灭,就需要接入高电平,因此我们可以根据输出电平来控制LED灯的亮灭。
1.2 配置
①配置使能CPU外部晶振(RCC)
②配置CPU时钟树
从原理图可得知,CPU使用的是8MHz晶振
③配置GPIO管脚
配置三色LED的管脚,设置默认电平为高电平(初始状态为熄灭),模式选择推挽输出(Output Push Pull),并给每个管脚依据灯颜色命名,方便使用。
1.3程序修改
代码添加必须在USER CODE BEGIN和USER CODE END之间,否则重新生成代码后会删除添加不规范的代码。
1.3.1 修改gpio.c代码
在gpio.c添加LED的控制函数
① turn_led:控制LED亮灭的功能,参数which取值为枚举中的LED,指定控制的LED,参数status为控制LED的亮/灭,取值为宏定义的OFF/ON;
② blink_led:控制LED的闪烁功能,参数which同turn_led,参数interval为闪烁的间隔时间,单位为毫秒。
/* USER CODE BEGIN 2 */
typedef struct gpio_s
{
GPIO_TypeDef *group;//引脚的类别,如GPIOA、GPIOB
uint16_t pin;//引脚号
}gpio_t;
gpio_t leds[LedMax] =
{
{RedLed_GPIO_Port, RedLed_Pin},
{GreenLed_GPIO_Port, GreenLed_Pin},
{BlueLed_GPIO_Port, BlueLed_Pin},
};
void turn_led(int which,int status)//点亮LED灯
{
GPIO_PinState level;//定义引脚的状态
if(which >= LedMax)
return ;
level = OFF == status ? GPIO_PIN_SET : GPIO_PIN_RESET;
HAL_GPIO_WritePin(leds[which].group,leds[which].pin,level);
}
void blink_led(int which,uint32_t interval)//使LED灯闪烁
{
turn_led(which,ON);
HAL_Delay(interval);
turn_led(which,OFF);
HAL_Delay(interval);
}
/* USER CODE END 2 */
1.3.2 修改gpio.h
对在gpio.c中使用的函数进行声明,以及进行枚举和宏定义。
/* USER CODE BEGIN Prototypes */
enum
{
RedLed,
GreenLed,
BlueLed,
LedMax,
};
#define OFF 0
#define ON 1
extern void turn_led(int which,int status);
extern void blink_led(int which,uint32_t interval);
/* USER CODE END Prototypes */
1.3.2 修改main.c
直接在main.c中调用blink_led()分别使三色LED闪烁。
/* USER CODE BEGIN WHILE */
while (1)
{
blink_led(BlueLed, 500);
blink_led(RedLed, 500);
blink_led(GreenLed, 500);
/* USER CODE END WHILE */
1.4 效果实现
最终实现的效果为蓝、红、绿三个LED灯依次闪烁。