STM32F407 学习笔记四(EXTI)


#include 


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寄存器:

STM32F407 学习笔记四(EXTI)_第1张图片STM32F407 学习笔记四(EXTI)_第2张图片STM32F407 学习笔记四(EXTI)_第3张图片


STM32F407 学习笔记四(EXTI)_第4张图片

STM32F407 学习笔记四(EXTI)_第5张图片


STM32F407 学习笔记四(EXTI)_第6张图片

STM32F407 学习笔记四(EXTI)_第7张图片


你可能感兴趣的:(STM32F407 学习笔记四(EXTI))