基于标准库 PB1,PB2,PB3 按键下降沿触发中断 读取按键长按短按状态值的程序
时间: 2023-11-04 18:16:12 浏览: 123
一种长短按键的程序
好的,以下是基于标准库进行编写的按键中断程序,可以读取按键的长按短按状态值:
```c
#include "stm32f10x.h"
#define KEY_SHORT_PRESS 0
#define KEY_LONG_PRESS 1
uint32_t key_press_time = 0;
uint8_t key_state = KEY_SHORT_PRESS;
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
key_press_time = HAL_GetTick();
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI1_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line1) != RESET) {
key_press_time = HAL_GetTick();
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
void EXTI2_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line2) != RESET) {
key_press_time = HAL_GetTick();
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
void EXTI_Config(void) {
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
EXTI_InitStruct.EXTI_Line = EXTI_Line0 | EXTI_Line1 | EXTI_Line2;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_Init(&NVIC_InitStruct);
}
int main(void) {
EXTI_Config();
while (1) {
if (HAL_GetTick() - key_press_time >= 10 && HAL_GetTick() - key_press_time < 1000) {
key_state = KEY_SHORT_PRESS;
} else if (HAL_GetTick() - key_press_time >= 1000) {
key_state = KEY_LONG_PRESS;
}
}
}
```
这个程序使用了 HAL 库的 HAL_GetTick 函数来计时,每隔 1ms 就会更新系统时钟计数器,记录当前的时间。
按键中断处理函数 EXTI0_IRQHandler、EXTI1_IRQHandler 和 EXTI2_IRQHandler 分别用于处理 PB1、PB2 和 PB3 按键的下降沿触发中断。在中断处理函数中记录当前的时间,使用 HAL_GetTick 函数获取系统时钟计数器的值。
在程序的主循环中,通过判断 HAL_GetTick 函数返回值与按键按下的时间的差值,来判断按键状态是短按还是长按,并将其记录在 key_state 变量中。程序可以根据 key_state 变量的值来进行相应的操作。需要注意的是,程序中的时间单位是毫秒(ms)。
以上是基于标准库进行编写的按键中断程序,可以读取按键的长按短按状态值。
阅读全文