按键切换灯的频率
1.CubeMX配置工程
这里使用的是stm32最小系统核心板和自己搭建的小电路实现的。
这里使用的是有源蜂鸣器(按键有提示音)
CubeMX新建工程,选择芯片,配置时钟树,外部晶振以及调试接口。具体设置可参考使用cubemx配置stm32(二)__核心配置
然后配置GPIO口,电路图看到按键按下时接地为低电平,不按下应该为高电平,所以选择内部上拉
上图配置完BEEP和KEY,再配置LED1 LED2
配置完成后生成代码
2.在main.c中添加代码,完成工程的编写
定义全局变量,和函数,在main函数的while中循环调用,两个函数通过一个全局变量 flg 联系起来
CubeMX生成的代码有“/* USER CODE BEGIN WHILE / ” “ / USER CODE END WHILE */”在BEGIN,END之间加入的代码不会在重新配置时被覆盖掉
找到 USER CODE BEGIN 0 ,在后面写上三个函数的具体定义
代码如下:
uint8_t flg=0;
uint8_t style=0;
static void KEY_Task(void);
static void BEEP_Task(void);
static void LED_Task(void);
void KEY_Task(void)
{
static uint32_t count=0;
static uint8_t step=0;
switch(step)
{
case 0:
{
if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==GPIO_PIN_RESET)
{
count++;
if(count>=10000)
{
count=0;
step=1;
}
}
else
{
count=0;
}
}
break;
case 1:
{
if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==GPIO_PIN_SET)
{
style++;
style=style%3;
step=0;
flg =1;
}
}
break;
}
}
void BEEP_Task(void)
{
static uint32_t count=0;
static uint8_t step=0;
if(flg)
{
switch(step)
{
case 0:
{
HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET); //打开蜂鸣器
step=1;
}
break;
case 1:
{
count++;
if(count>=150000)
{
count=0;
HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET); //关闭蜂鸣器
step=0;
flg=0;
}
}
break;
}
}
}
void LED_Task(void)
{
static uint32_t count=0;
static uint8_t step=0;
switch(style)
{
case 0:
{
switch(step)
{
case 0:
{
count++;
if(count>=50000)
{
count=0;
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //灭LED1
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET); //灭LED2
step=1;
}
}
break;
case 1:
{
count++;
if(count>=50000)
{
count=0;
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //亮LED1
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET); //亮LED2
step=0;
}
}
break;
}
}
break;
case 1:
{
switch(step)
{
case 0:
{
count++;
if(count>=150000)
{
count=0;
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //灭LED1
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET); //灭LED2
step=1;
}
}
break;
case 1:
{
count++;
if(count>=150000)
{
count=0;
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //亮LED1
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET); //亮LED2
step=0;
}
}
break;
}
}
break;
case 2:
{
switch(step)
{
case 0:
{
count++;
if(count>=450000)
{
count=0;
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //灭LED1
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET); //灭LED2
step=1;
}
}
break;
case 1:
{
count++;
if(count>=450000)
{
count=0;
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //亮LED1
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET); //亮LED2
step=0;
}
}
break;
}
}
break;
}
}
KEY_Task();
BEEP_Task();
LED_Task();