STM32 EXTI(外部中断)和NVIC(嵌套向量中断控制器)学习

STM32 EXTI(外部中断)和NVIC(嵌套向量中断控制器)学习

在STM32中EXTI有0~18个事件/中断,0~4各自都是单独的一个通道,5~9是共一个通道,10~15共享一个通道,16/17/18各自独立用到一个通道

EXTI

在STM32中NVIC是嵌套向量中断控制器,分为0~4五个组,称之为(Group)
NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4
库函数里提供的函数NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)就是用来配置中断分组的

第0组:所有4位用于指定响应优先级(16种)
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级(8种)
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级(4种)
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级(2种)
第4组:所有4位用于指定抢占式优先级

  • 例子
    • 配置EXTI所用到的GPIO口和相应引脚
    • 配置缺省EXTI
    • 配置线路和中断模式并使能

void exti_init(void){
  EXTI_InitTypeDef   EXTI_InitStructure;
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource8);
  EXTI_DeInit();
  /* Configure EXTI8 line */
  EXTI_InitStructure.EXTI_Line = EXTI_Line8;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}
  • 例子
    • 设置好中断通道
    • 设置中断主从优先级,这里都是0
    • 中断通道使能

void nvic_init(void){
  NVIC_InitTypeDef   NVIC_InitStructure;
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
  • 例子
    • 中断子程序中判断EXTI中断的状态
    • 选择中断源的时候看是Line几
    • 记得清除掉中断产生的条件,否则会一直执行中断

void EXTI9_5_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line8) != RESET)
  {
    bsp_led_off(1);
    /* Clear the  EXTI line 8 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line8);
  }
}

基本过程:

  • 时钟配置
  • GPIO配置
  • EXTI配置
  • NVIC配置
  • ISR编写
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值