初始化你的按键输入口PA0,PA15,PC5。
eg.PA0-15为EXTI0的外部中断输入源
因为IO口设置的时候将PC5和PA15设置为了上拉输入,PA0为下拉输入,所以触发条件就是PC5和PA15当电位变化由高到低的时候(下降沿触发)触发中断,PA0则反之。
Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 三个参数分别为:GPIOA-G,需要使能的位,触发条件
RTIR:上升沿触发 FTIR:下降沿触发
其次,需要设置中断分组的问题
抢占优先级和响应优先级:
1.序号越小,优先级越高。
2.抢占优先级高的中断组可以打断抢占优先级低的中断组,但当两个抢占优先级同时到达的时候,会先执行响应优先级高的中断组,但当不是同时到达的时候,即使后来高的响应优先级到达的时候,也不可以打断当前的正在执行的较低的中断组,抢占优先级和响应优先级可以分为五组,每组都有16中分配方式。例如组2,抢占属性和响应属性,,抢占和响应即11:11,所以抢占和响应的选择都是四种(0-3).
MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
分别指的是:抢占优先级的数值,响应优先级的数值,io口对应的中断服务函数,组别。
//设置触发条件
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发 wake_up 电位由低到高而触发输出变化 原本是下拉电阻
Ex_NVIC_Config(GPIO_C,5,FTIR); //下降沿触发 key0 电位由高到低而触发输出变化 原本是上拉电阻
Ex_NVIC_Config(GPIO_A,15,FTIR); //下降沿触发 key1 电位由高到低而触发输出变化 原本是上拉电阻
//设置中断分组
MY_NVIC_Init(2,2,EXTI0_IRQn,2); //抢占2,子优先级2,组2
MY_NVIC_Init(2,1,EXTI9_5_IRQn,2); //抢占2,子优先级1,组2
MY_NVIC_Init(2,0,EXTI15_10_IRQn,2); //抢占2,子优先级0,组2
exti.c(中断使用完后需要清除中断标志位)
//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
delay_ms(10); //消抖
if(WK_UP==1) //WK_UP按键
{
LED0=!LED0;
LED1=!LED1;
}
EXTI->PR=1<<0; //清除LINE0上的中断标志位
}
//外部中断9~5服务程序
void EXTI9_5_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY0==0) //按键0
{
LED0=!LED0;
}
EXTI->PR=1<<5; //清除LINE5上的中断标志位
}
//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY1==0) //按键1
{
LED1=!LED1;
}
EXTI->PR=1<<15; //清除LINE15上的中断标志位
}
//外部中断初始化程序
//初始化PA0,PC5,PA15为中断输入.
void EXTI_Init(void)
{
KEY_Init();
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发 wake_up 电位由低到高而触发输出变化 原本是下拉电阻
Ex_NVIC_Config(GPIO_C,5,FTIR); //下降沿触发 key0 电位由高到低而触发输出变化 原本是上拉电阻
Ex_NVIC_Config(GPIO_A,15,FTIR); //下降沿触发 key1 电位由高到低而触发输出变化 原本是上拉电阻
MY_NVIC_Init(2,2,EXTI0_IRQn,2); //抢占2,子优先级2,组2
MY_NVIC_Init(2,1,EXTI9_5_IRQn,2); //抢占2,子优先级1,组2
MY_NVIC_Init(2,0,EXTI15_10_IRQn,2); //抢占2,子优先级0,组2
}
int main()
int main(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
EXTI_Init(); //外部中断初始化
while(1)
{
printf("lalala\r\n");
delay_ms(1000);
}
}