编写一个按键中断的程序,并设置上升沿,下降沿,高电平,低电平等触发方式
时间: 2023-06-19 11:10:17 浏览: 95
按键中断程序
这里提供一个基于STM32F4的按键中断程序示例,可以设置上升沿、下降沿、高电平和低电平等触发方式:
```c
#include "stm32f4xx.h"
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //检测是否触发了EXTI0中断
{
//执行相应的操作
//...
EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位
}
}
void EXTI_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能SYSCFG时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择PA0作为按键输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //设置为输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉电阻
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置GPIO速度为100MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); //将GPIOA0与EXTI线连接
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //选择EXTI线0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //设置触发方式为上升沿和下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI线
EXTI_Init(&EXTI_InitStructure); //初始化EXTI
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //选择EXTI0中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; //设置抢占优先级为最高
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //设置子优先级为最高
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能EXTI0中断通道
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
}
int main(void)
{
EXTI_Config(); //配置EXTI
while(1)
{
//主循环
}
}
```
在上述程序中,我们首先定义了一个`EXTI0_IRQHandler()`函数,用于处理EXTI0中断。在函数内部,我们可以执行相应的操作,例如修改某个标志位、触发其他中断等。
接下来是`EXTI_Config()`函数,用于配置EXTI。在函数内部,我们首先使能了GPIOA和SYSCFG的时钟,然后设置了GPIOA0为输入模式,并上拉了电阻。接着,我们将GPIOA0与EXTI线连接,并选择了EXTI线0。设置了触发方式为上升沿和下降沿,并使能了EXTI线。最后,我们初始化了NVIC,选择了EXTI0中断通道,并设置了抢占优先级和子优先级。
在主函数中,我们调用了`EXTI_Config()`函数进行配置,并进入了一个死循环。
阅读全文