STM32学习:①流水灯

一、流水灯

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灯依次闪烁。

猜你喜欢

转载自blog.csdn.net/xll102500/article/details/131326598