写一个用stm32f401按键带锁存地控制led灯亮灭的代码
时间: 2023-09-28 18:06:13 浏览: 210
以下是一个使用STM32F401微控制器的按键带锁存地控制LED灯亮灭的示例代码:
```c
#include "stm32f4xx_ll_bus.h"
#include "stm32f4xx_ll_gpio.h"
void GPIO_Init(void);
void EXTI_Init(void);
void Delay(uint32_t delay);
int main(void) {
GPIO_Init();
EXTI_Init();
while (1) {
// 主循环代码
}
}
void GPIO_Init(void) {
// 使能GPIOA和GPIOC时钟
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC);
// 配置GPIOA的引脚为输入模式(按键)
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_0, LL_GPIO_MODE_INPUT);
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_0, LL_GPIO_PULL_UP);
// 配置GPIOC的引脚为输出模式(LED灯)
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_OUTPUT);
}
void EXTI_Init(void) {
// 使能SYSCFG时钟
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
// 配置外部中断线0和对应的GPIO引脚
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTA, LL_SYSCFG_EXTI_LINE0);
// 配置外部中断线0的触发方式为上升沿触发
LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_0);
// 使能外部中断线0
LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_0);
// 使能中断向量
NVIC_SetPriority(EXTI0_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0));
NVIC_EnableIRQ(EXTI0_IRQn);
}
void Delay(uint32_t delay) {
for (uint32_t i = 0; i < delay; i++);
}
void EXTI0_IRQHandler(void) {
// 清除中断标志位
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_0);
// 检测按键状态
if (LL_GPIO_IsInputPinSet(GPIOA, LL_GPIO_PIN_0)) {
// 按键被按下,切换LED灯状态
LL_GPIO_TogglePin(GPIOC, LL_GPIO_PIN_13);
// 延时一段时间,避免按键抖动
Delay(100000);
}
}
```
在上述示例代码中,我们使用GPIOA的Pin 0引脚作为输入引脚,用于连接按键。使用GPIOC的Pin 13引脚作为输出引脚,用于连接LED灯。我们使用外部中断来检测按键的状态变化,并在按键被按下时切换LED灯的状态。
在 `EXTI_Init()` 函数中,我们首先使能了SYSCFG时钟,并配置了外部中断线0和对应的GPIO引脚。然后,我们将外部中断线0的触发方式配置为上升沿触发,并使能了外部中断线0。最后,我们设置了中断优先级,并使能了对应的中断。
在 `EXTI0_IRQHandler()` 中断服务函数中,我们首先清除了中断标志位。然后,我们检测按键的状态,如果按键被按下,我们切换LED灯的状态,并延时一段时间(这里使用简单的循环延时)以避免按键抖动。
请注意,上述示例中的参数值仅供参考,实际应用中需要根据具体需求进行适当的修改和配置。
阅读全文