IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> Stm32笔记-NVIC中断向量控制(开始于2021-09-05) -> 正文阅读

[嵌入式]Stm32笔记-NVIC中断向量控制(开始于2021-09-05)

Stm32笔记-NVIC中断向量控制

NIVC中断控制的寄存器(组)是位于cortex-M3内核中的,所以平时可能较少接触所以在这里补充一个笔记。

参考资料主要是《cortex-M3中文参考手册》

1.一些与内核有关的名词

  • 在内核中,所有的中断都可以称为 ”异常“

    ”异常“ 定义如下:

  • ”挂起“:即一个异常不能被立即响应时的状态,(我理解为 ”立flag“)定义如下:

    注意:功能上是与FreeRTOS中的挂起任务列表相同,但挂起任务列表与其没有关系(时使用链表实现的)

  • 向量表:实际上是处理例程(我理解成是中断服务函数内容)的入口地址组成的表单。

  • 一些缩写的自我猜测:

    • NMI: Not Mask Interrupt 不可屏蔽中断;

      永远不会被屏蔽的中断,可用于发生紧急情况时使用;

    • PendSV :Pendable request for System Serve 系统可挂起请求;

      FreeRtos中用于任务的切换,参考手册中也提及使用PendSV进行任务切换(需将其设为任务优先级最低),可以免去OS切换任务时检查是否有中断发生.

    • MSP:主栈指针,异常(中断/中断嵌套)调度时使用;

      PSP:进程栈指针,任务调度时使用。

2. 异常清单:

1)系统异常及外部异常清单:

Cortex-M3共有256级中断,前16个系统中断中前4个不可变程,其余均可编程;

240个外部中断( 这里的外部是相对于Cortex_M3内核来说的,不等同于STM32的外部中断(是前者的很小一部分) )均可编程。( 如野火所说STM32的NVIC是cortex-M3NVIC的一个子集

stm32对这个中断清单的分配如下图:

(详情见stm32参考手册中断与事件章节)

(可以看到外部中断只占很小一部分而已,而且,stm32f103也只支持(使用256中前)60种中断(16级)而已)

3.寄存器组(族)

NVIC的寄存器数量比较多,以寄存器组(族)方式出现。而且除了自身的寄存器,还有一些其他的寄存器也于NVIC功能相关。

1)NVIC寄存器组:

NVIC 的这些寄 存器都是写 1 有效的,写 0 是无效的。

  • ISER[8]: SET ENAs族(8个32位,Interrupt Set-Enale Registers):

    0xE000_E100-0xE000_E11C

    对应位写一,使能240个外部中断对应的 外部中断 (还是相对于cortex-M3来说的,下面均是如此).

  • ICER[8]: CLR ENAs族(8个32位,Interrupt Clear-Enale Registers):

    0xE000_E180-0xE000_E19C

    对应位写一,失能240个外部中断对应的 外部中断 (还是相对于cortex-M3来说的).

  • ISPR[8]:SETPENDs族(8个32位,Interrupt Set-Pending Registers)

    0xE000_E200 – 0xE000_E21C,写一挂起对应的 外部中断

  • ICPR[8]:CLRPENDs族(8个32位,Interrupt Clear-Pending Registers)

    0xE000_E280 – 0xE000_E29C,写一解挂对应的 外部中断

  • IABR[8]:ACTIVE族,Interrupt Active Bit Registers(8*32位),

    类似于状态标志位,当240个外部中断处于活动状态时,其被置1,否则为0,为只读寄存器。

  • IP[240] Interrupt Priority Registers,优先级族寄存器,共240个*8位,分别决定美个外部异常的优先级(8位中,高X位表示抢占优先级,低X位表示响应优先级,取决于优先级分组AIRCR的PRIGROUP三位),如下图:

- AIRCR;优先级分组寄存器,见上图。

2)与NVIC相关的寄存器:

以下几个寄存器常使用汇编指令访问。

  • PRIMASK 优先级屏蔽寄存器,使除NMI和硬fault外的所有异常失能。

  • FAULTMASK fault异常掩蔽寄存器,使除NMI外的所有异常失能。

    cortex-M3中NMI是绝对不可能被屏蔽的。在STM32中将其与时钟树中的CSS相连,用于补救时钟故障的情况。

  • BASEPRI 只会屏蔽优先级的数字比它大的寄存器(所以对于系统的4个不可编程是没有影响的,优先级为负数)。

    FreeRTOS中就是通过设置BSASEPRI的值来进出临界段。

3.库函数使用

库函数的使用相当简单,而且普遍:

  • 初始化中断优先级分组(通常在主函数中进行分组,且只分一次,后来程序不会改动):
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//0/1/2/3/4
  • 在每个需要使用中断向量的地方,对该中断向量初始化:

    初始化结构体如下:

    typedef struct
    {
     uint8_t NVIC_IRQChannel;//中断通道,常以IRQn结尾 
     uint8_t NVIC_IRQChannelPreemptionPriority;//抢占优先级
     uint8_t NVIC_IRQChannelSubPriority; //响应优先级
     FunctionalState NVIC_IRQChannelCmd; //使能与否
     } NVIC_InitTypeDef;
     NVIC_Init(&NVIC_InitStructure);//中断向量初始化函数
    
  • 注意:因为在stm32的启动文件 startup_stm32f10x_hd.s 中有中断服务函数的弱定义,(为了初始化向量表),如果我们中断服务函数的函数名写错的话,那中断执行时就会跳转到启动文件中,而里面的函数是个什么都不做的死循环,系统也不会err提示。所以中断服务函数的名称一定要写对

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:19:00  更:2021-09-06 11:19:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:52:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码