首页 > 其他分享 >STM32之中断简介

STM32之中断简介

时间:2023-06-14 12:12:30浏览次数:37  
标签:__ NVIC 优先级 中断 简介 STM32 寄存器 uint32

一、F407在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中系统异常10个,外部中断82个。

除了个别异常的优先级被定死外,其他异常的优先级都是可以编程的。结构体: IRQn_Type包含全部异常声明。

二、嵌套向量中断控制器 NVIC,在STM32中NVIV 是 Cortex-M4的一个子集。结构体如下:

typedef struct
{
  __IO uint32_t ISER[8];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register  中断使能寄存器       */
       uint32_t RESERVED0[24];
  __IO uint32_t ICER[8];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register  中断清除寄存器       */
       uint32_t RSERVED1[24];
  __IO uint32_t ISPR[8];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register     中断使能悬起寄存器     */
       uint32_t RESERVED2[24];
  __IO uint32_t ICPR[8];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register    中断清除悬起寄存器    */
       uint32_t RESERVED3[24];
  __IO uint32_t IABR[8];                 /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register   中断有效位寄存器        */
       uint32_t RESERVED4[56];
  __IO uint8_t  IP[240];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide)  中断优先级寄存器 */
       uint32_t RESERVED5[644];
  __O  uint32_t STIR;                    /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register   软件触发中断寄存器  */
}  NVIC_Type;

在配置中断时,我们一般只使用  ISER  , ICER  ,IP。

2.2  NVIC库函数,我们一般很少使用,因为有更为简便的设置方法。

三、中断优先级定义

3.1 优先级的定义

  在NVIC中有一个专门的寄存器:中断优先级寄存器NVIC_IPRx(x = 0..981) 用来专门配置外部中断的优先级。但是在绝大多数的M4芯片中都精简设计,实际的优先级用的更少,

在F407中只是用了高四位来定义优先级。用于表示优先级的这四位,有分为抢占优先级和子优先级,如果多个中断同时响应,抢占优先级高的就会抢占优先执行权,如果抢占优先级相同,那就会比较子优先级。

如果抢占优先级和子优先级都相同,就比较他们的硬件中断编号,编号越小,优先级越高。

 

3.2 中断优先级分组

  设置优先级分组可调用库函数 : void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)   来实现。在F407优先级总共分了5组:

 四、中断编程

4.1 使能外设某个中断,这个具体由每个外设的相关中断使能位控制,比如串口有发送完成中断,接受完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。

4.2 初始化NVIC_InitTypeDef 结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求。

typedef struct
{
  uint8_t NVIC_IRQChannel;                    /*!< Specifies the IRQ channel to be enabled or disabled.
                                                   This parameter can be an enumerator of @ref IRQn_Type 
                                                   enumeration (For the complete STM32 Devices IRQ Channels
                                                   list, please refer to stm32f4xx.h file)  中断源 */

  uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< Specifies the pre-emption priority for the IRQ channel
                                                   specified in NVIC_IRQChannel. This parameter can be a value
                                                   between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
                                                   A lower priority value indicates a higher priority  中断抢占优先级 */

  uint8_t NVIC_IRQChannelSubPriority;         /*!< Specifies the subpriority level for the IRQ channel specified
                                                   in NVIC_IRQChannel. This parameter can be a value
                                                   between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
                                                   A lower priority value indicates a higher priority 中断子优先级 */

  FunctionalState NVIC_IRQChannelCmd;         /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
                                                   will be enabled or disabled. 
                                                   This parameter can be set either to ENABLE or DISABLE 中断使能或者失能 */   
} NVIC_InitTypeDef;

1)  结构体 IRQn_Type 定义了所有中断源

2) 抢占优先级和子优先级 ,具体的值要根据优先级分组来确定

3)中断使能或失能  是操作的NVIC_ISER 和NVIC_ICER这两个寄存器

 

4.3 编写中断服务函数

  在启动文件 startup_stm32f40xx.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是空的,为的只是初始化向量表。实际的中断服务函数都需要我们重新编写,中断服务函数我们统一写在 stm32f4xx_it.c 这个库文件中。

  关于中断服务函数的函数名必须跟启动文件里面预设的一样,如果写过,系统就在中断向量表中找不到中断服务函数的入口,就会直接跳转到启动文件里预设的空函数,并在里面无线循环,实现不了中断。

标签:__,NVIC,优先级,中断,简介,STM32,寄存器,uint32
From: https://www.cnblogs.com/zhanghongfei/p/17477089.html

相关文章

  • ZYNQ 启动过程简介 以及 ZYNQ 裸机生成BOOT.BIN
    背景下图是ZYNQ的启动过程 上电复位等完成后,先执行BootRom,然后再根据MIO设定的启动方式选择对应从哪里启动,无论从哪里启动,都需要一个BOOT.BIN文件,对于裸机程序来说:BOOT.BIN应对包含如下信息:1、FSBL代码,后缀elf;2、用户程序,后缀elf;3、用户PL逻辑,后缀bit;  裸机代码如......
  • java开发系统内核:使用一个中断实现多个API调用
    在上一节,我们实现了通过中断访问内核API的功能,本节,我们进一步改进中断调用内核API的机制。当前,我们使用一个中断来对应一个API,问题是内核导出的API不可能只有一个,如果始终保持一个中断对应一个API的话,那么CPU只支持两百多个中断,也就是说,按照上一节的办法,我们内核最多只能导出两百......
  • java开发系统内核:像Linux一样使用中断实现内核API
    我们当前提供的内核API有个问题,就是每次使用时,需要计算API函数在内核中的位置,一旦内核代码改变,API接口的位置也会改变,同时调用API的应用程序也必须跟着改变,显然这种限制是不可接受的。为了突破当前缺陷,我们必须想出新的API提供办法。常用的做法是,仿照Linux将API当做一个中断调用,由......
  • 多表查询-简介
       ......
  • STM32CubeIDE卸载插件/卸载汉化
    汉化时下载了所有的内容,打开就提示错误,大概是什么不能类转化查了下,说是不能全部都装,只装两个即可,然后就要卸载其他的话不多说直接上图哈哈哈,没有报错界面了,我找找,重启软件出来了然后 选中卸载项就能卸载了 可以用文件夹中选文件的快捷键哦 ......
  • 数据库设计-简介
       ......
  • 三种架构模式简介(MVC、MVP、MVVM)
    一简介手机终端随着每年的更新换代,其性能也飞速增长。依附于此的Android应用规模也愈发复杂。截止2023年4月,最新版本8.0.32微信apk大小为238MB,而对比2011年微信1.0版本apk包大小仅为457KB,短短12年增长了533倍。随着应用规模增大,功能扩展困难、测试规......
  • STM32cubeIDE CAN回环模式
    配置如下 经过分频,选择位段1和位段2之后波特率回自己计算CAN总线的频率实在PCLK上CAN是有接收和发送中断的但是需要在STM32CUBEIDE中自己加入滤波器。voidCAN_Config(void){CAN_FilterTypeDefsFilterConfig;/*配置CAN过滤�??*/sFilterConfig.FilterBan......
  • [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
    [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)——通过知识共享树立个人品牌。继上六篇:       [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)      [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不......
  • [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
    [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)——通过知识共享树立个人品牌。继上六篇:       [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)      [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不......