• stm32中断初识与实践(上)


     

    stm32中断的讲解我分为两部分,即两篇文章,上半部分做一个总结性的概览,有一个初步认识,下半部分会通过一个实例来讲解中断的应用。本文即为上半部分的总结性概览。

    所谓“中断”,通俗地讲,就是CPU在遇到一个需要即时处理的情况时,暂时中止当前程序的执行,转而处理新情况。

    在stm32参考手册中的中断和异常向量表里可查阅到,其内核的异常响应系统里有10个系统异常(含Reset和HardFault),60个外部中断。具体的定义可在库文件stm32f10x.h头文件的IRQn_Type枚举里查到。如图5-1。

    图5-1

    在进行中断配置前,有两个概念需要先弄清楚——NVIC、优先级定义及分组。

    NVIC

    NVIC即为嵌套向量中断控制器,控制着整个芯片的中断相关,是Cortex-M3内核里的一个外设。其在库文件core_cm3.h里定义如下:

    图5-2

    其中ISER(中断使能寄存器NVIC_ISERx)、ICER(中断清除寄存器NVIC_ICERx)、IP(8bit中断优先级寄存器NVIC_IPRx)会在配置中断的时候用到。我们可在core_cm3.h库文件里找到相关寄存器操作的函数声明,如操作ISER的NVIC_EnableIRQ()函数,操作ICER的NVIC_DisableIRQ()函数,操作IP的NVIC_SetPriority()函数等。


    优先级定义及分组

    NVIC里有一个中断优先级寄存器NVIC_IPRx,用来配置外部中断的优先级。IPR的宽度为8bit,而ST公司的F103芯片只用了高4bit来配置优先级,即每个外部中断可配置的优先级为0~15。这4bit被分组为抢占优先级(pre-emption priority)和子优先级(subpriority),数值越小,优先级越高。首先会比较抢占优先级,如果相同则比较子优先级,还是相同则继续比较各自的硬件中断编号(编号可在参考手册里的异常向量表查到,编号越小,优先级越高)。

    优先级分组由内核外设SCB的AIRCR(应用程序中断及复位控制寄存器)的PRIGROUP[10:8]位决定,在F103里分成了5组。如图5-3。

    图5-3

    上图中的表格里显示了5组的优先级,由于只用了高4位,所以级数最多为16(0~15,有16个级数)。优先级分组配置可调用NVIC_PriorityGroupConfig()函数实现,函数声明和定义分别在库文件misc.h和misc.c中。该函数便是封装了对SCB_AIRCR寄存器的操作。

    中断配置编程

    经以上了解后,可以开始进入程序环节了。一般中断编程按以下三点来完成:

    1. 使能外设中断。具体由相应外设的相关中断使能位控制,如串口收/发完成中断等。
    2. 配置中断优先级分组。前文已经说明可以调用NVIC_PriorityGroupConfig()函数实现。
    3. 初始化NVIC_InitTypeDef结构体。用于设置抢占优先级和子优先级,及使能中断。
    4. 编写中断服务函数。启动文件中已经预先为每个中断定义了一个空的中断服务函数,用于初始化中断向量表。而实际中我们需要重新定义这些函数,可统一定义在stm32f10x_it.c中。

    其中,

    在第3点,NVIC_InitTypeDef结构体是在库文件misc.h中定义的。如图5-4。

    图5-4

    由图中库函数源码可知,

    • NVIC_IRQChannel:中断源。每个中断都有其单独的中断源,不能写错,否则会致不响应中断,程序也不会报错。具体配置如图5-1的IRQn_Type枚举类型定义,这个枚举类型包含了所有的中断源。
    • NVIC_IRQChannelPreemptionPriority:抢占优先级。由前文描述可知,可配置的优先级为0~15,有16个优先级数。
    • NVIC_IRQChannelSubPriority:子优先级。同抢占优先级。
    • NVIC_IRQChannelCmd:使能(ENABLE)或失能(DISABLE)中断寄存器。操作的是NVIC_ISER和NVIC_ICER寄存器。


    在第4点,需要注意的是,函数名必须和启动文件里设置的一样,否则系统无法在中断向量表里找到中断服务函数入口,便会转而跳到启动文件里的空函数,从而进入死循环。如图5-5为启动文件预先定义的函数。
    图5-5

    至此,对中断已经有了一个大致的认识,第一步算是圆满完成啦。那么接下来的下半部分会开始借用一个实例来帮助巩固实践。

  • 相关阅读:
    TSINGSEE青犀视频云边端架构产品EasyNVR/EasyGBS/EasyDSS区别及应用场景介绍
    【解决方案】TSINGSEE青犀视频云边端架构产品如何实现明厨亮灶汇总直播方案?
    【开发记录】RTSP/GB28181/Ehome协议安防视频服务平台EasyCVR使用golang orm操作数据库及基本使用步骤
    TSINGSEE青犀视频云边端架构产品是如何实现视频流传输的?
    【开发记录】安防视频上云服务云平台EasyCVR部署之docker部署步骤参考说明
    TSINGSEE青犀视频+海康合作研发RTMP推流摄像头出现无法推流或无法上线的情况如何配置?
    VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果
    系统程序员成长计划拥抱变化(下)
    系统程序员成长计划Write once, run anywhere(WORA)(下)
    KJava虚拟机hack笔记编译
  • 原文地址:https://www.cnblogs.com/fire909090/p/8872510.html
Copyright © 2020-2023  润新知