主函数main.c
#include <stm32f4xx.h>
#include "led.h"
#include "key.h"
#define PAin(n) (*(volatile uint32_t *)(0x42000000 + (GPIOA_BASE+0x10-0x40000000)*32 + (n)*4))
#define PEin(n) (*(volatile uint32_t *)(0x42000000 + (GPIOE_BASE+0x10-0x40000000)*32 + (n)*4))
#define PEout(n) (*(volatile uint32_t *)(0x42000000 + (GPIOE_BASE+0x14-0x40000000)*32 + (n)*4))
#define PFout(n) (*(volatile uint32_t *)(0x42000000 + (GPIOF_BASE+0x14-0x40000000)*32 + (n)*4))
int main(void)
{
//抢占优先级0~3,支持4级!
//响应优先级0~3,支持4级!
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
led_init();
key_init();
while(1)
{
}
}
//外部中断0的中断服务函数
//void EXTI0_IRQHandler(void)
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) == SET)
{
PFout(9)=0;
delay();
PFout(9)=1;
delay();
/* 清空标志位,告诉CPU当前中断请求完毕,可以去响应新的中断请求
思考题:若不清空标志位,会出现什么现象?
*/
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
//外部中断2的中断服务函数
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) == SET)
{
PFout(10)=0;
delay();
PFout(10)=1;
delay();
/* 清空标志位,告诉CPU当前中断请求完毕,可以去响应新的中断请求
思考题:若不清空标志位,会出现什么现象?
*/
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
//外部中断3的中断服务函数
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3) == SET)
{
PEout(13)=0;
delay();
PEout(13)=1;
delay();
/* 清空标志位,告诉CPU当前中断请求完毕,可以去响应新的中断请求
思考题:若不清空标志位,会出现什么现象?
*/
EXTI_ClearITPendingBit(EXTI_Line3);
}
}
//外部中断4的中断服务函数
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4) == SET)
{
PEout(14)=0;
delay();
PEout(14)=1;
delay();
/* 清空标志位,告诉CPU当前中断请求完毕,可以去响应新的中断请求
思考题:若不清空标志位,会出现什么现象?
*/
EXTI_ClearITPendingBit(EXTI_Line4);
}
}
----------------------
key.c代码
0x00优先等级最高
0x03等级最低