这里使用的是stm32最小系统核心板和自己搭建的小电路实现的。
这里使用的是有源蜂鸣器(按键有提示音)
CubeMX新建工程,选择芯片,配置时钟树,外部晶振以及调试接口。具体设置可参考使用cubemx配置stm32(二)__核心配置
然后配置GPIO口,电路图看到按键按下时接地为低电平,不按下应该为高电平,所以选择内部上拉
上图配置完BEEP和KEY,再配置LED1 LED2
配置完成后生成代码
定义全局变量,和函数,在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();