stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》

        本人是大一的学生,学习了一段时间的stm32,此系列博客为个人的学习笔记,方便个人复习,如有错误或问题,非常非常欢迎大家来大力指正。

简单用文字说一下原理。

如果先要清楚了解建议去b站看一下keysking大佬的教程,很有趣易懂(本视频的部分图也来自keysking视频中的图片,大家如果要学习强烈推荐他的视频

当EXTI触发时,正在运行的代码会暂停运行,跳转到中断函数的代码执行,结束后返回之前停止的代码,直到下一次中断触发。

外部的电平信号进入输入驱动器,经过上下拉电阻,经过施密特触发器,通过比较转换将模拟电路转化为数字电路(也可以不走触发器之间传到模拟输入口)后到达片上外设或者输入寄存器。到达外部事件/中断控制器

进入外部事件/中断控制器

输入线中其实有引脚对应的EXTI外部中断线,编号为相同数字的用一条线

边缘检测电路是帮我们配置下降沿/上升沿触发中断信号的 ,如果触发产生一个高电平。

软件中断事件寄存器是可以用代码模拟创造一个中断。

或门有一个相应中断就输出中断。

后面有个与门,要两个都产生相同电平才可以,所以中断屏蔽发生器可以控制中断的传递。

之后到达NVIC(嵌套向量中断控制器)

EXTI触发,就会执行对应的处理函数。函数处理完要将挂起寄存器清除为0,清除中断标志位

中断的优先级

①抢占优先级(先判断,相同就判断相应优先级)

②相应优先级

一个中断正在执行,被另一个打断,只比较抢占优先级。

2.标准库的代码初始化

标准库要AFIO选择中断引脚

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);

    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line=EXTI_Line14;
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
    NVIC_Init(&NVIC_InitStructure);

这个是标准库外部中断的定义

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

开启AFIO的时钟(GPIO为通用引脚,AFIO为复用引脚,都要开启外部时钟)

将要输入的引脚的模式设定为外部输入,其他像gpio那样配置

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);

上面那条是开启GPIOB pin14的外部中断复用功能

    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line=EXTI_Line14;
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);

这部分为EXTI外部中断的配置

   EXTI_InitStructure.EXTI_Line=EXTI_Line14;为配置外部中断线
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;打开使能开关
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;选择中断模式(有中断模式和事件模式)
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;触发方式(这里是下降沿触发)
    EXTI_Init(&EXTI_InitStructure);

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
    NVIC_Init(&NVIC_InitStructure);

这里是NVIC优先级的定义

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置优先级分组
    NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//设置通道(IRQhandler)
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//通道使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//设置响应优先级
    NVIC_Init(&NVIC_InitStructure);

至此外部中断是所有都配置好了

而中断处理函数,产生中断就会执行下面的函数

void TIM2_IRQHandler(void)
{
    EXTI_ClearITPendingBit(EXTI_Line14);

	}

其中    EXTI_ClearITPendingBit(EXTI_Line14);//清除外部中断14号线的中断标志位

3.HAL库初始化

GPIO mode为设置触发方式

GPIO pull up/pull down是设置端口的上下拉

然后在NVIC开启外部中断

配置NVIC的优先级

较为方便,直接选数字就好,数值越小优先级越高

生成代码后再stm32f1xx_it.c文件中找到

void EXTI15_10_IRQHandler(void)
{
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}

这个就是中断处理函数

其中HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);//这个函数可以帮我们将挂起寄存器清除为0

在中断函数中写下中断时需要执行的代码。

补充:如果要使用delay函数,要考虑优先级问题,要将系统滴答(time base:system tick timer)的优先级调至高于中断的优先级delay才能实现延时,如果低于中断,着轮不到delay产生效果

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值