STM32
直播中

小麦地

11年用户 1584经验值
私信 关注
[问答]

有关STM32F407的外部中断基础知识总结

STM32F407的中断与事件有何区别呢?

STM32F407的外部中断该怎样去设置呢?

回帖(1)

张文

2021-11-16 14:49:11
  基础知识
  1、外部中断/事件框架: STM32F407一共有16+7条中断/事件线(如下图),也就是说在STM32工作过程中同时支持22条外部中断/事件。
  
  从上图也可以看出,所有的GPIO口都可以当作外部中断/事件源。但是同时只能有16条位于不同的GPIO口上的中断/事件源。
  2、中断/事件源配置: 选择EXIT0-16中断/事件线的中断/事件源在相应的SYSCFG_EXTICRx寄存器里配置。如配置EXIT0-3中断/事件线的源寄存器为下图:
  
  3、中断与事件: 在这里我们需要辨识以下中断与事件的区别:
  中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;
  事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等;
  代码设计
  .c代码
  void mpuIntInit(void)
  {
  EXTI_InitTypeDef EXTI_InitStruct;
  GPIO_InitTypeDef GPIO_InitStruct;
  NVIC_InitTypeDef NVIC_InitStruct;
  //开启相关时钟
  RCC_AHB1PeriphClockCmd(MPU_EXIT_RCCPERIPH, ENABLE);
  //GPIO设置-下拉输入
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_Pin = MPU_EXIT_GPIO_PIN;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;//大于等于50最好开启IO补偿
  GPIO_Init(MPU_EXIT_GPIO, &GPIO_InitStruct);
  //EXIT设置-中断模式上升沿触发
  EXTI_InitStruct.EXTI_Line = MPU_EXTI_LINE;
  EXTI_InitStruct.EXTI_LineCmd = ENABLE;
  EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_Init(&EXTI_InitStruct);
  //NVIC设置-中断配置
  NVIC_InitStruct.NVIC_IRQChannel = MPU_EXIT_IT_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//最高
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStruct);
  //中断源配置-PA1
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);
  }
  void MPU_EXIT_IT_HANDLER()
  {
  if(EXTI_GetITStatus(MPU_EXTI_LINE) == SET)
  {
  EXTI_ClearITPendingBit(MPU_EXTI_LINE);
  printf(“coming”);
  }
  }
  .h代码
  #define MPU_EXIT_GPIO GPIOA
  #define MPU_EXIT_GPIO_PIN GPIO_Pin_1
  #define MPU_EXIT_RCCPERIPH RCC_AHB1Periph_GPIOA
  #define MPU_EXTI_LINE EXTI_Line1
  #define MPU_EXIT_IT_IRQn EXTI1_IRQn
  #define MPU_EXIT_IT_HANDLER EXTI1_IRQHandler
  #define MPU_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA
  #define MPU_EXTI_PIN_SOURSE EXTI_PinSource1
  void mpuIntInit(void);
  void MPU_EXIT_IT_HANDLER(void);
  总结
  一般配置外部中断/事件一般步骤:
  1、先配置对应GPIO的时钟;
  RCC_AHB1PeriphClockCmd
  2、初始化配置GPIO(根据触发方式设置上下拉模式);
  GPIO_Init
  3、初始化配置EXTI中断线;
  EXTI_Init
  4、如需中断则初始化配置NVIC
  NVIC_Init
  5、设置中断线的中断源
  SYSCFG_EXTILineConfig
举报

更多回帖

发帖
×
20
完善资料,
赚取积分