一、工程配置
1.打开工程模板,没有工程模板的同学可参考主页《点亮led》,根据开发板原理图对按键引脚配置。
![](https://img-blog.csdnimg.cn/c9655bf89f99443ca364890af0d66865.png)
![](https://img-blog.csdnimg.cn/26ed92110ecd4712b8e4581ad13aed3a.png)
![](https://img-blog.csdnimg.cn/4411878d6e674688a115e30cf8739ce1.png)
2.以WK_UP(PA0)和KEY0(PE4)为例,WK_UP一端接VCC,另一端接PA0,即高电平有效,引脚需要配置下拉输入;KEY0一端接GND,另一端接PE4,即低电平有效,引脚需要配置上拉输入。PA0按照图中配置即可,PE4选择上拉。
![](https://img-blog.csdnimg.cn/5af75314a95f47d0a338e4afc3d63052.png)
3.点击右上角GENERATE CODE生成代码,弹出的对话框选择Open Projec打开工程。
二、编写代码
1.在gpio.c文件中已经生成按键初始化代码,直接对引脚进行操作即可。
![](https://img-blog.csdnimg.cn/c555f4a6143e41318afc465da5be07d5.png)
2.HAL库中提供了读取引脚电平的函数GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin),GPIO_PinState为返回引脚状态,参数GPIO_TypeDef* GPIOx表示端口x,GPIO_Pin表示读取的引脚。
三、现象验证
在main函数中添加读取引脚状态的代码,控制led状态,当WK_UP按下时点亮led,当KEY0按下时关闭led。(代码中HAL_Delay为ms延时函数,在按键处理中用于消除按键按下的机械抖动,同学们可以试试代码2和3,通过现象对比代码2和3的区别)
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//111111111111111111111111111111111111111
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);
}
}
else if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
}
}
// //222222222222222222222222222222222222222
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
// {
// HAL_Delay(10);
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
// {
// HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
// }
// }
// else if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
// {
// HAL_Delay(10);
// if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
// {
// HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
// }
// }
//
// //33333333333333333333333333333333333333
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
// {
// HAL_Delay(10);
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
// {
// HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
// }
// while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0));
// }
// else if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
// {
// HAL_Delay(10);
// if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
// {
// HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
// }
// while(!HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4));
// }
}
下期更新如何使用外部中断控制led状态...