常州建网站公司,厦门网站建设公司排行榜,中国建设厅官网,深圳市市场监督管理局官网【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器
注#xff1a;本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时#xff0c;可输入或输出数字信号 例如: 检测按键输入信号#xff08;Read_Pin#xff09;输出信号#xff08;W…【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器
注本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时可输入或输出数字信号 例如: 检测按键输入信号Read_Pin输出信号Write_Pin 输出信号点亮或熄灭LED 硬件特点
GPIO引脚内部结构图
GPIO状态
输入浮空状态上拉下拉电阻均不使用复位时状态输入上拉状态只使用上拉电阻-引脚外部无输入时读到的电平为高电平输入下拉状态只使用下拉电阻-引脚外部无输入时读到的电平为低电平模拟状态不使用任何内部的上拉下拉电阻-用于ADC输入/DAC输出引脚开漏输出Output Open Drain推挽输出输出1时引脚为高电平输出0时引脚为低电平 若要增强引脚的输出驱动能力则可使用上拉-如GPIO输出高电平点亮LED复用功能推挽复用功能开漏
涉及到的函数 重要函数
HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)按键控制LED
LED部分原理图 按键部分原理图 实现功能 按下KEY0时使LED1的输出翻转 按下KEY1时使LED2的输出翻转 按下KEY2时使LED1与LED2的状态都翻转 MCU图形化配置
连接按键的引脚选择GPIO_Input 连接LED的引脚选择GPIO_Output 并设置相应的用户标签
KEY0,KEY1,KEY2配置为上拉Pull-upPF9,PF10设置为推挽输出Output Push Pull调试引脚设为串行调试引脚WSD 在RCC里将HSE改为晶振 在时钟树界面将HSE改为8MHz主锁相环选择HSE作为时钟源设置HCLK为168 代码部分
编写驱动程序
keyled.c
#include keyled.h
//编写函数扫描被按下的按键
KEYS ScanPressedKey(uint32_t timeout)
{uint32_t tickstart HAL_GetTick();const uint32_t btnDelay 20;//延时时间while (1){
#ifdef KeyRight_Pinif (HAL_GPIO_ReadPin(Key0_GPIO_Port, Key0_Pin) GPIO_PIN_RESET){HAL_Delay(btnDelay);//延时消除前抖动if (HAL_GPIO_ReadPin(Key0_GPIO_Port, Key0_Pin) GPIO_PIN_RESET)return KEY_0;}
#endif
#ifdef KeyDown_Pinif (HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin) GPIO_PIN_RESET){HAL_Delay(btnDelay);if (HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin) GPIO_PIN_RESET)return KEY_1;}
#endif
#ifdef KeyLeft_Pinif (HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin) GPIO_PIN_RESET){HAL_Delay(btnDelay);if (HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin) GPIO_PIN_RESET)return KEY_2;}
#endif
#ifdef KeyUp_Pinif (HAL_GPIO_ReadPin(KeyUp_GPIO_Port, KeyUp_Pin) GPIO_PIN_SET){HAL_Delay(btnDelay);if (HAL_GPIO_ReadPin(KeyUp_GPIO_Port, KeyUp_Pin) GPIO_PIN_SET)return KEY_UP;}
#endifif (timeout ! KEY_WAIT_ALWAYS) {if ((HAL_GetTick() - tickstart) timeout)break;}}return KEY_NONE;
}//若没有按键被按下超时后跳出循环keyled.h
#include main.h
//创建枚举类型
typedef enum {KEY_NONE 0,KEY_1,KEY_2,KEY_UP,KEY_NONE
} KEYS;
//定义参数-表示一直等待按键按下
#define KEY_WAIT_ALWAYS 0KEYS ScanPressedKey(uint32_t timeout);
//LED1的宏定义函数
#ifdef LED1_Pin#define LED1_Toggle() HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin)//实现翻转#define LED1_OFF() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET)//实现打开#define LED1_ON() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)//实现关闭
#endif
//LED2的宏定义函数
#ifdef LED2_Pin#define LED2_Toggle() HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin)#define LED2_OFF() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET)#define LED2_ON() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET)
#endif
//蜂鸣器的宏定义函数
#ifdef Buzzer_Pin#define Buzzer_Toggle() HAL_GPIO_TogglePin(Buzzer_GPIO_Port, Buzzer_Pin)#define Buzzer_ON() HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_SET)#define Buzzer_OFF() HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_RESET)
#endif应用驱动程序 编写主程序 while (1){KEYS curKeyScanPressedKey(KEY_WAIT_ALWAYS);switch (curKey){case KEY_0:LED1_Toggle();break;case KEY_1:LED2_Toggle();break;case KEY_2:LED1_Toggle();LED2_Toggle();break;case KEY_UP:Buzzer_Toggle();break;default:break;}HAL_Delay(200);//消除按键弹起时的的抖动影响按键控制蜂鸣器
有源蜂鸣器原理图 有源蜂鸣器是指自带了震荡电路的蜂鸣器这种蜂鸣器一接上电就会自己震荡发声。而如 果是无源蜂鸣器则需要外加一定频率2~5Khz的驱动信号才会发声。 图中 Q4 是用来扩流R65 则是一个下拉电阻避免 MCU 复位的时候蜂鸣器可能发声的 现象。BEEP 信号直接连接在 MCU 的 PF8 上面PF8 可以做 PWM 输出可使用 PWM 来控制蜂鸣器实现“唱歌”。 实现功能: 按下KEY_UP按键时蜂鸣器输出翻转 MCU图形化配置
连接蜂鸣器的引脚选择GPIO_Output 并设置相应的用户标签
KEY_UP配置为下拉Pull-downPF8设置为下拉推挽输出Output Push Pull将初始状态改为High防止一复位蜂鸣器就响最大输出频率-若为无源蜂鸣器则改为High有源滤波器都可
成果演示 上键翻转蜂鸣器状态 KEY0翻转红灯KEY1翻转绿灯 KEY2同时翻转两个灯状态