0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32速成笔记(3)—中断

冬至子 来源:二土电子 作者:二土电子 2023-10-24 09:09 次阅读

一、什么是中断

首先介绍一下什么是中断。在实际开发过程中,中断是很有必要的。比如需要针对某种特殊情况进行快速响应,单纯的使用一个while轮询似乎并不能满足。中断的概念非常好理解,举个经典例子。比如你在家里看电视,忽然有人敲门,你临时把电视暂停了,转去开门。开完门之后再次回来继续看电视。

中断也就是这种流程。看电视的行为就类似于程序中main函数的while,轮询执行业务。忽然有人敲门,对应程序运行过程中忽然产生了一个中断请求。此时暂停电视,对应于此时程序中断当前的业务,转而去处理中断业务(开门)。最后,中断业务处理完成后,再继续执行main函数while轮询中的业务。简单用一个图来表示一下

图片

中断概念示意图

根据中文参考手册的介绍,STM32F103ZET6除了一些特殊的中断外,常用的中断有60个,这些中断是通过中断控制器来有条不紊地分配执行的。

二、中断的相关概念

2.1 中断优先级

从字面意思来讲,优先级用来区分中断的响应顺序。当同时接收到多个中断请求时,中断控制器会根据中断优先级来决定中断处理的顺序,优先级高的会先被处理。如果在处理某个中断请求时又来了一个中断,这时会根据两个中断的中断优先级来确定处理方式。

如果新来的中断优先级比当前中断的优先级高,则会停止对当前中断的处理,转而处理新的中断。反之,如果新来的中断优先级比当前中断的优先级低,则需要等到当前中断处理完成后,再去处理新来的中断。

中断优先级有两种,一种是抢占优先级,一种是响应优先级。响应优先级通常又被称为“亚优先级”或者“副优先级”。当两个中断的抢占优先级相同时,用相应优先级来决定中断的处理顺序。

如果两个中断的抢占优先级和相应优先级相同,则根据芯片手册中的中断向量号来决定中断的处理顺序。比如同时来了两个中断请求,在抢占优先级和响应优先级均相同时,中断向量号为41的中断会比中断向量号为42的中断先被处理。

STM32提供了16个可编程的优先等级(使用了4位中断优先级),优先级分组可以使用库函数提供的NVIC_PriorityGroupConfig()设置。

2.2 中断嵌套

一些低优先级的中断可以被高优先级中断打断,这种情况叫做中断嵌套。

2.3 中断服务函数

中断服务函数就是在进入中断后需要执行的内容。

中断服务函数有特定的函数名,可以在下图文件中搜索“IRQ”找到。

图片

中断服务函数名

2.4 中断标志位

不同的中断会有对应的中断标志位,通常标志位默认值为0。当产生中断请求时,标志位被置1。比如设置一个串口接收完成中断,串口接收完成标志位初始值为0。当串口接收完成后对应的串口接收完成标志位会被置1。

在中断服务函数中检测该标志位的值,来确定是否是串口接收完成中断产生了。每次中断服务函数执行结束后,需要清除一下对应的中断标志位。

三、外部中断EXIT

STM32F103ZET6有一个外部中断控制器(EXIT),可以支持20个软件的中断/事件请求,其中外部中断的EXIT0~EXIT15同坐IO中断。

图片

外部中断IO对应

其他详细的介绍这里就不再说明。

四、中断程序配置

这里以配置PA0(按键WK UP)的外部中断为例,展示一下库函数开发时,外部中断的配置流程。关于其他中断的配置,后续使用其他外设时会单独介绍。

想要实现的效果是,利用外部中断实现按下WK UP,LED1点亮。

4.1 设置中断分组并使能中断

这里使用外部中断,需要开启AFIO时钟,设置IO与外部中断线的映射关系。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   // 开启AFIO时钟

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);   //选择GPIO管脚用作外部中断线路

设置中断分组并使能中断时,库函数提供了一个结构体,我们直接配置这个结构体就可以了。

//EXTI0 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;   //EXTI0中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;   //抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   //子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

需要注意的是,配置优先级时,数值越大,优先级越低。

4.2 初始化EXIT

初始化EXIT时,库函数也提供了一个结构体,其中包括中断线,EXIT模式,触发方式以及EXIT使能或者失能。由按键检测一节了解到,WK UP按下时,会产生一个上升沿。因此触发方式我们选择上升沿触发。

EXTI_InitStructure.EXTI_Line=EXTI_Line0;   // EXIT0
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;   // 中断
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;   // 上升沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;   // 使能
    EXTI_Init(&EXTI_InitStructure);

整体配置函数如下

/*
 *==============================================================================
 *函数名称:Exit_Init
 *函数功能:初始化外部中断
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Exit_Init (void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef  EXTI_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   // 开启AFIO时钟

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);   //选择GPIO管脚用作外部中断线路
    
    //EXTI0 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;   //EXTI0中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;   //抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   //子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
    
    EXTI_InitStructure.EXTI_Line=EXTI_Line0;   // EXIT0
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;   // 中断
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;   // 上升沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;   // 使能
    EXTI_Init(&EXTI_InitStructure);
}

4.3 编写中断服务函数

上面介绍了如何找中断服务函数的函数名,这里直接开始写中断服务函数。这里的中断服务函数比较简单,直接点亮LED1即可。

/*
 *==============================================================================
 *函数名称:EXTI0_IRQHandler
 *函数功能:外部中断0中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void EXTI0_IRQHandler(void)
{
    // 如果EXIT0中断标志位被置1
    if(EXTI_GetITStatus (EXTI_Line0)==1)
    {
        Med_Led_StateCtrl (LED1,LED_ON);   // 点亮LED1
    }
    EXTI_ClearITPendingBit (EXTI_Line0);   // 清除中断标志位
}

至此,按下WK UP后,LED1会点亮。这种方法与之前的按键点亮LED有什么区别?之前的按键点亮LED是在main函数的while中实现的,而利用外部中断的方法,是在外部中断的中断服务函数中实现的。即使main函数的while轮询业务中没有按键业务,按键依旧可以起作用。

五、注意事项

  • • 中断服务函数无需在.h文件中声明
  • • 中断服务函数中不要有过长的业务
  • • 中断服务函数最后需要清除中断标志位
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • GPIO
    +关注

    关注

    16

    文章

    1137

    浏览量

    50601
  • 中断控制器
    +关注

    关注

    0

    文章

    59

    浏览量

    9373
  • 串口中断
    +关注

    关注

    0

    文章

    63

    浏览量

    13615
  • STM32F103ZET6
    +关注

    关注

    9

    文章

    67

    浏览量

    20774
  • AFIO
    +关注

    关注

    0

    文章

    6

    浏览量

    2891
收藏 人收藏

    评论

    相关推荐

    STM32速成

    哟管STM32速成贴?求助
    发表于 01-23 14:34

    STM32学习笔记——外部中断的初步了解

    STM32F103有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级16级可编程的中断优先级。 理解
    发表于 11-30 01:47 762次阅读
     <b class='flag-5'>STM32</b>学习<b class='flag-5'>笔记</b>——外部<b class='flag-5'>中断</b>的初步了解

    STM32各模块学习笔记

    STM32个模块学习笔记 目录 STM32笔记之一 中断优先级.......................................
    发表于 11-30 03:32 2983次阅读

    STM32关全局中断的方法 STM32中断类型

    STM32中断很强大,STM32中断可以嵌套,任何外设都可以产生中断,其中中断和异常是等价的。
    的头像 发表于 07-22 10:52 2.7w次阅读

    STM32核心笔记

    STM32核心笔记文章目录STM32核心笔记1. 下载程序的两种方式1.1 串口ISP1.2 仿真器2. 认识寄存器3. 地址总线与外设地址映射关系4. GPIO的三种配置5. 时钟树
    发表于 12-04 12:21 1次下载
    <b class='flag-5'>STM32</b>核心<b class='flag-5'>笔记</b>

    STM32(六)-------中断(外部中断

    STM32中断应用中断知识介绍STM32 中断应用概览异常NVIC优先级定义中断知识介绍
    发表于 12-04 17:21 9次下载
    <b class='flag-5'>STM32</b>(六)-------<b class='flag-5'>中断</b>(外部<b class='flag-5'>中断</b>)

    STM32学习笔记--中断系统

    目录:一、STM32中断系统二、NVIC中断管理三、中断配置相关函数一、STM32中断系统
    发表于 12-04 18:36 4次下载
    <b class='flag-5'>STM32</b>学习<b class='flag-5'>笔记</b>--<b class='flag-5'>中断</b>系统

    STM32学习笔记(五)---NVIC

    STM32学习笔记(五)—NVIC文章目录STM32学习笔记(五)---NVIC一、NVIC简介二、中断优先级优先级定义优先级分组三、
    发表于 12-04 18:51 16次下载
    <b class='flag-5'>STM32</b>学习<b class='flag-5'>笔记</b>(五)---NVIC

    stm32学习笔记-中断系统

    文章目录问题引入1、中断系统概述。1.1 为什么要中断中断意义)中断应用场合:1.2 中断处理过程i.保护现场ii.执行
    发表于 01-13 10:19 0次下载
    <b class='flag-5'>stm32</b>学习<b class='flag-5'>笔记</b>-<b class='flag-5'>中断</b>系统

    STM32自学笔记(二)中断

    组,为8个32位寄存器,控制CM3内核的256个中断 由于STM32F103的可屏蔽中断只有60个,故我们只会用到 ISER[0] 和ISER[1] . ISER[0] 的bit0~bit31...
    发表于 01-14 15:10 0次下载
    <b class='flag-5'>STM32</b>自学<b class='flag-5'>笔记</b>(二)<b class='flag-5'>中断</b>

    STM32笔记中断优先级和开关总中断

    STM32中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3)中的优先级概念STM32
    发表于 01-14 15:24 12次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>笔记</b>之<b class='flag-5'>中断</b>优先级和开关总<b class='flag-5'>中断</b>

    STM32学习笔记2---NVIC中断优先级管理

    STM32 NVIC 中断优先级管理STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽
    发表于 01-14 15:39 2次下载
    <b class='flag-5'>STM32</b>学习<b class='flag-5'>笔记</b>2---NVIC<b class='flag-5'>中断</b>优先级管理

    STM32入门学习笔记中断架构(下)

    Cortex-M3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用
    的头像 发表于 02-16 09:57 598次阅读
    <b class='flag-5'>STM32</b>入门学习<b class='flag-5'>笔记</b>之<b class='flag-5'>中断</b>架构(下)

    STM32入门学习笔记中断架构(上)

    Cortex-M3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用
    的头像 发表于 02-16 09:57 982次阅读

    STM32学习笔记一外部中断

    STM32 的每个 IO 都可以作为外部中断中断输入口。STM32F103 的中断控制器支持 19 个外部
    的头像 发表于 10-24 14:12 692次阅读
    <b class='flag-5'>STM32</b>学习<b class='flag-5'>笔记</b>一外部<b class='flag-5'>中断</b>