首先,需要准备如下硬件设备:
- STM32F103C8T6单片机开发板
- 4个LED灯
- 4个220欧姆电阻
- 4个按键
接下来,我将讲解如何连接硬件设备。
- 将4个LED灯连接到STM32单片机的PB0、PB1、PB2、PB3引脚上。
- 将4个220欧姆电阻连接到PB0、PB1、PB2、PB3引脚上,防止电流过大损坏LED灯。
- 将4个按键连接到STM32单片机的PA0、PA1、PA2、PA3引脚上。
连接好硬件设备后,需要编写程序实现LED灯的闪烁,并且根据按键的状态来控制LED灯的亮灭。
首先,需要在程序中定义引脚号和按键状态。我们可以使用宏定义,如下所示:
#define LED0_Pin GPIO_PIN_0 //LED0对应PB0引脚
#define LED0_GPIO_Port GPIOB //LED0对应GPIOB组
#define LED1_Pin GPIO_PIN_1 //LED1对应PB1引脚
#define LED1_GPIO_Port GPIOB //LED1对应GPIOB组
#define LED2_Pin GPIO_PIN_2 //LED2对应PB2引脚
#define LED2_GPIO_Port GPIOB //LED2对应GPIOB组
#define LED3_Pin GPIO_PIN_3 //LED3对应PB3引脚
#define LED3_GPIO_Port GPIOB //LED3对应GPIOB组
#define KEY0_Pin GPIO_PIN_0 //KEY0对应PA0引脚
#define KEY0_GPIO_Port GPIOA //KEY0对应GPIOA组
#define KEY1_Pin GPIO_PIN_1 //KEY1对应PA1引脚
#define KEY1_GPIO_Port GPIOA //KEY1对应GPIOA组
#define KEY2_Pin GPIO_PIN_2 //KEY2对应PA2引脚
#define KEY2_GPIO_Port GPIOA //KEY2对应GPIOA组
#define KEY3_Pin GPIO_PIN_3 //KEY3对应PA3引脚
#define KEY3_GPIO_Port GPIOA //KEY3对应GPIOA组
在定义完引脚号和按键状态后,需要初始化GPIO口和NVIC。可以使用HAL库来实现,如下所示:
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
//配置LED引脚为推挽输出
GPIO_InitStruct.Pin = LED0_Pin | LED1_Pin | LED2_Pin | LED3_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);
//配置按键引脚为上拉输入
GPIO_InitStruct.Pin = KEY0_Pin | KEY1_Pin | KEY2_Pin | KEY3_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(KEY0_GPIO_Port, &GPIO_InitStruct);
//配置中断
HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); //设置中断优先级
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断
HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
HAL_NVIC_SetPriority(EXTI2_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
HAL_NVIC_SetPriority(EXTI3_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}
在GPIO初始化的基础上,还需要写中断服务函数,处理按键事件。可以使用HAL库提供的函数,如下所示:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == KEY0_Pin)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); //切换LED0状态
}
else if (GPIO_Pin == KEY1_Pin)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); //切换LED1状态
}
else if (GPIO_Pin == KEY2_Pin)
{
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //切换LED2状态
}
else if (GPIO_Pin == KEY3_Pin)
{
HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); //切换LED3状态
}
}
最后,我们需要编写主函数,循环实现LED闪烁。可以使用HAL库提供的函数,如下所示:文章来源:https://www.toymoban.com/news/detail-716759.html
int main(void)
{
HAL_Init(); //HAL库初始化
GPIO_Init(); //GPIO初始化
while (1)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); //切换LED0状态
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); //切换LED1状态
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //切换LED2状态
HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); //切换LED3状态
HAL_Delay(500); //延时500ms
}
}
21物联网应用技术2班-韦力 20210320044文章来源地址https://www.toymoban.com/news/detail-716759.html
到了这里,关于stm32按键实现LED的闪烁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!