news 2026/9/8 22:33:19

[技术讨论] 【Cortex-Mx系列的SCB关键寄存器浅谈】之二:ICSR寄存器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[技术讨论] 【Cortex-Mx系列的SCB关键寄存器浅谈】之二:ICSR寄存器

在上一篇文章(链接:https://bbs.21ic.com/icview-3461486-1-1.html)中作者介绍了SCB功能块及其第一个关键寄存器CPUID,本文章将主要介绍SCB的第二个关键寄存器:ICSR。

ICSR,即Interrupt Control and State Register,翻译为中断控制和状态寄存器,主要用于控制和查询中断状态,比如提供中断的 pending(挂起)、active(活动)状态,以及异常管理的控制位(如手动触发 PendSV和SysTick 等)。

查看core_cm4.h文件,可以看到ICSR是由下面这些位域信息组成的:

接下来我们逐个解释,如下表所示:

字段名

位域

读写类型

功能描述

NMIPENDSET

[31]

RW

写1,表示不可屏蔽中断(NMI)被挂起

PENDSVSET

[28]

RW

写0无效,写1,表示手动挂起PendSV异常

PENDSVCLR

[27]

RW

写0无效,写1,表示清除PendSV的挂起状态

PENDSTSET

[26]

RW

写0无效,写1,表示手动挂起SysTick异常

PENDSTCLR

[25]

RW

写0无效,写1,表示清除SysTick的挂起状态

ISRPREEMPT

[23]

R

只读,表示是否有可抢占的异常正在挂起

ISRPENDING

[22]

R

只读,表示是否有外部中断正在挂起

VECTPENDING

[21:12]

R

只读,表示当前挂起异常的异常编号,0表示无

RETTOBASE

[11]

R

表示当前是否在中断嵌套中(0表示有更高优先级异常活跃,1表示无嵌套)

VECTACTIVE

[9:0]

R

表示当前活跃异常的异常编号(0表示线程模式,非异常)

我们先来看看Keil的仿真运行时ICSR寄存器的值:

运行时,值为0,如下图:

停止运行时,值为0x00C2E000,如下图:

二进制就是:0000 0000 1100 0010 1110 0000 00000000

比如bit22为1表示有外部中断正在挂起,bit23为1表示有可抢占的异常正在挂起。

那我们可以如何应用ICSR呢?

可以用来手动触发或清除PendSV:

在RTOS中,PendSV用来作为RTOS调度器的御用通道,上下文切换和任务调度都是在ISR中实现的,而ISCR寄存器中的PENDSVSET和PENDSVCLR就专为PendSV设置了两个控制位段;我们可以通过下面的代码操作来挂起PendSV或者清除PendSV的挂起状态:

SCB->ICSR |=SCB_ICSR_PENDSVSET_Msk; // 挂起PendSV

SCB->ICSR |=SCB_ICSR_PENDSVCLR_Msk; // 清除PendSV

有一点需要注意,,就是如果同时向这两个控制位写1,可能导致无法预测的行为。

可以查询当前异常状态:

通过 VECTACTIVE 或 VECTPENDING 字段判断当前运行状态。

可以调试中断状态:

通过检查 ISRPENDING 或 NMIPENDSET 位确认中断是否挂起。

可以读取中断编号:

通过读取 VECTACTIVE 可以确定当前执行的异常或中断编号。

由于ISCR寄存器包含了中断和异常等重要的状态信息,如果直接读取可能会导致不可预测的行为,因此,如果你尝试按读取CPUID寄存器的代码来操作,是不可行的:

复制

  1. uint32_t icsr= 0;
  2. uint32_t read_icsr(void)
  3. {
  4. icsr = SCB->ICSR;
  5. return icsr;
  6. }

按以上代码来读取,读取出来的结果与实际值不一样:

也就是说ICSR需要在特权模式下访问,用户模式是无法操作的;那如何访问呢?可以通过间接访问 NVIC 结构体中的 ISER 、 ICER 、 ISPR 和 ICPR 寄存器来实现。

在Keil仿真时其实也可以直接看到NVIC的寄存器值及查看中断信息:



此处也涉及了关于查看中断信息的方法,后续文章会详细阐述。

下一篇文章作者将介绍VTOR(向量表偏移寄存器)。


---------------------
作者:dffzh
链接:https://bbs.21ic.com/icview-3463182-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 16:29:39

网易云音乐扩展引擎:开启个性化音频体验新篇章

在数字音乐时代,用户对播放器个性化功能的需求日益增长。传统的插件安装方式往往需要复杂的手动操作,让许多用户望而却步。现在,一款名为BetterNCM Installer的工具应运而生,彻底改变了这一局面。 【免费下载链接】BetterNCM-Inst…

作者头像 李华
网站建设 2026/9/8 17:45:52

【有手就行】LoRA:用你自己的数据来微调大模型,让大模型真正懂你

一、前言 上上周的周末无事在家,然后写了一篇《【有手就行】自己花20分钟从0开始训练一个“大模型”》,结果发现这两个星期涨了几十个关注,比我前面写了几个月文章得到的关注还多,看来这种浅显易懂的、入门级的技术文章相对来说会…

作者头像 李华
网站建设 2026/9/8 13:08:37

TouchGAL社区搭建完全指南:从零开始构建专属Galgame交流平台

TouchGAL社区搭建完全指南:从零开始构建专属Galgame交流平台 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 想要打造一个…

作者头像 李华
网站建设 2026/9/8 9:09:31

BilibiliDown:快速便捷获取B站视频的终极解决方案

还在为无法离线观看B站精彩内容而烦恼吗?BilibiliDown作为一款专业的B站视频获取工具,彻底解决了你的痛点。这款基于Java开发的跨平台软件支持Windows、Linux和MacOS系统,让你轻松实现B站视频保存、批量处理和离线观看。 【免费下载链接】Bil…

作者头像 李华
网站建设 2026/9/8 20:13:11

如何利用OpenBoardView实现.brd电路板文件的终极查看方案

如何利用OpenBoardView实现.brd电路板文件的终极查看方案 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView 作为一名电子工程师,你是否曾经遇到过这样的困境:手头有一份重要的.brd电路…

作者头像 李华
网站建设 2026/9/8 2:50:09

零基础玩转AssetStudio:Unity资源提取实战手册

零基础玩转AssetStudio:Unity资源提取实战手册 【免费下载链接】AssetStudio AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles. 项目地址: https://gitcode.com/gh_mirrors/as/AssetStudio 想要轻松提取Unity游戏中…

作者头像 李华