2.1 NVIC外部中断

NVIC中断的库函数:

GPIO剩下的函数:

   void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);   //锁定GPIO配置

//配置AFIO事件输出功能
  void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); 
  void GPIO_EventOutputCmd(FunctionalState NewState);

  void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);  //引脚重映射
  void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);  //配置																	GPIO对应的AFIO引脚选择 **

EXTI函数:

void EXTI_DeInit(void);    //复位EXTI
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);  //EXTI初始化  **
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);  //EXTI结构体赋予默认值
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);   //软件触发外部中断
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);  //获取标志位
void EXTI_ClearFlag(uint32_t EXTI_Line);    //清除标志位
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);  //中断函数里获取标志位  **
void EXTI_ClearITPendingBit(uint32_t EXTI_Line); //中断函数里清除标志位  **

NVIC misc.h:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);   //中断分组 **
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);   //NVIC初始化 **
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);  

img

NVIC中断:

1.打开使用的GPIO和AFIO时钟:

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

2.GPIO初始化:

GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

3.配置GPIO对应的AFIO引脚选择:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);

4.配置EXTI:

   EXTI_InitTypeDef EXTI_InitTypeDefStructure;

  EXTI_InitTypeDefStructure.EXTI_Line=EXTI_Line12;     
  EXTI_InitTypeDefStructure.EXTI_LineCmd=ENABLE;    //EXTI状态
  EXTI_InitTypeDefStructure.EXTI_Mode=EXTI_Mode_Interrupt;  //中断模式
  EXTI_InitTypeDefStructure.EXTI_Trigger=EXTI_Trigger_Falling; //触发方式

  EXTI_Init(&EXTI_InitTypeDefStructure);

5.配置NVIC:

  NVIC_InitTypeDef NVIC_InitTypeDefStructure;

  NVIC_InitTypeDefStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
  NVIC_InitTypeDefStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_InitTypeDefStructure.NVIC_IRQChannelPreemptionPriority=1;
  NVIC_InitTypeDefStructure.NVIC_IRQChannelSubPriority=1;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  NVIC_Init(&NVIC_InitTypeDefStructure);

6.在启动文件选择对应的中断函数名:

void EXTI15_10_IRQHandler(void){
    if(EXTI_GetITStatus(EXTI_Line12)==SET){
      EXTI_ClearITPendingBit(EXTI_Line12);
    }

  }

img

posted @ 2023-08-23 13:37  狴泽犴  阅读(17)  评论(0编辑  收藏  举报