#include <stm32f4xx.h>
void Led_Init(void);
void main()
{
RCC->AHB1ENR |= 0X00000009; //enable GPIOA GPIOD
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; //enable System Configure
SCB->AIRCR = 0x05FA0000|0x400; //中断优先级分组 抢占:响应 3:1
Led_Init();
GPIOA->MODER &= 0XFFFFFFFC; //浮空输入
GPIOA->PUPDR &= 0XFFFFFFFC; //无上拉下拉
EXTI->IMR |= (1<<0); //不屏蔽中断线0
EXTI->FTSR |= (1<<0); //下降沿触发
SYSCFG->EXTICR[1] &= 0XFFFFFF00; //配置外中断线0到PA口
NVIC->IP[6] = 0XE0; //1110, 最高抢占优先级,最低响应优先级
NVIC->ICER[0] |= (1<<6); //中断使能
while(1)
{};
}
void Led_Init()
{
GPIOD->MODER &= 0X00FFFFFF;
GPIOD->MODER |= 0X55000000;
GPIOD->OTYPER &= 0XFFFF0FFF;
GPIOD->OSPEEDR &= 0X00FFFFFF;
GPIOD->OSPEEDR |= 0XFF000000;
GPIOD->PUPDR &= 0X00FFFFFF;
GPIOD->BSRRH = 0XF000;
SYSCFG->CMPCR =0X00000001; //速度超过50M,要开启补偿
}
void EXTI0_IRQHandler(void)
{
uint32_t tmp;
if((EXTI->PR & 0X00000001)!=0) //检测是哪个中断挂起
{
tmp=(~GPIOD->ODR) & 0X0000F000;
GPIOD->ODR &= 0XFFF0FFF;
GPIOD->ODR |= tmp;
EXTI->PR = 1<<0; //解除中断挂起
}
}
EXTI寄存器: