目录
实现功能
使用按键实现两个led灯的交替闪烁,即第一次按下led0闪烁第二次按下led1闪烁。
一、硬件分析
使用正点原子的f407探索者开发板、st-link v2
1.按键
按键使用f4探索者自带的按钮KEY2。查看原理图,KEY2对应 PE2,且按下时接地,即按下后输入为0,所以在初始化PE2时默认浮空即可。
2.led灯
LED0对应PF9 LED1对应PF10
IO口低电位时发光二极管导通,即低电平有效
对应实体按键位置:
二、实现步骤
说明:cubeide将所有定义的引脚及模式都放在了gpio.c中,而在图形界面定义的标签lable可以在main.h中找到。
在编写习惯上将各个模块的程序区分开,比如这里我将key的程序单独放在了key.c中,在main函数中只要调用一下在key.c中的函数即可。
1.引脚初始化
gpio.c代码(由cubeide自动生成)
#include "gpio.h"
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_0_Pin|LED_1_Pin, GPIO_PIN_RESET);
/*Configure GPIO pins : PEPin PEPin PEPin */
GPIO_InitStruct.Pin = KEY2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*Configure GPIO pins : PFPin PFPin */
GPIO_InitStruct.Pin = LED_0_Pin|LED_1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
2.主要代码
key.c代码如下:
#include "key.h"
uint8_t pbState = 0, pbNewState = 0; //两个变量记录IO口状态
uint8_t ledidx = 0; //led目录
uint32_t temp = 0;
void KEY_Test(void)
{
pbNewState = (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_2) == GPIO_PIN_RESET) ? 1 : 0; //key按下时pbNewState为1,反之为0
if(pbState != pbNewState)
{
if(pbNewState == 1) //pressed
{
ledidx = (ledidx + 1) % 2;
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, SET); // 在按钮按下时灯全灭
}
}
pbState = pbNewState;
if(HAL_GetTick() % 250 == 0) //非阻塞延时,当HAL_GetTick()为250整数倍时执行,相当于延时250毫秒
{
switch (ledidx)
{
case 0:
temp = GPIO_PIN_9;
break;
case 1:
temp = GPIO_PIN_10;
break;
default:
break;
}
HAL_GPIO_TogglePin(GPIOF, temp); //使led闪烁,变量temp用于改变led灯
}
HAL_Delay(1);
}
主要用到的函数:
HAL_GPIO_WritePin(..) 用于给引脚写入0或者1
HAL_GPIO_TogglePin(..) 用于反转引脚电平状态
HAL_Delay() 延时函数,单位ms
HAL_GetTick() 用于获取MCU自复位以来运行的时间,单位ms
这里说明与一下亮灯延时用HAL_GetTick的原因:
HAL_Delay是阻塞式延时,因此在执行delay的时候单片机不会执行其他代码,都在等待delay。但是我们随时需要获取按键对应引脚的高低电平,所以在这个场合下,用非阻塞式的这种“投机取巧”的方式来延时。
实验现象
烧好程序后LED0即红灯闪烁。按下KEY2后红灯熄灭,LED1即绿灯开始闪烁。实验成功