当前位置: 代码迷 >> 综合 >> STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(4):系统控制块
  详细解决方案

STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(4):系统控制块

热度:72   发布时间:2023-10-25 20:27:49.0

系统控制块提供了系统执行信息和系统控制。这包括系统异常的配置、控制和报告。CMSIS绘图Cortex-M3 SCB寄存器,为了改善软件效率。CMSIS简化了SCB寄存器展示。在CMSIS中,字节数组SHP[0]~SHP[12]相当于寄存器SHPR1~SHPR3。

辅助控制寄存器(SCB_ACTLR)

地址偏移 0x00 (基地址=0xE000E008)

复位值 0x0000 0000

需要的特权 特权的

辅助控制寄存器(ACTLR)失能处理器内某些方面的功能。寄存器在STM32F2和STM32L系列也是可用的。

位31:3  保留,必须保持清除的

位2 DISFOLD 失能IT(如果然后)指令的折叠

0使能IT(如果然后)指令的折叠

1失能IT(如果然后)指令的折叠

位1 DISDEFWBUF 失能在默认内存地图访问时的写缓冲使

       0使能写缓冲使用:在下一条指令前完成储存到内存

       1失能写缓冲使用

位0 DISMCYCINT 失能多周期指令的中断

       0使能处理器中断延迟(载入/存储和乘/除操作)

       1失能中断延迟

 

CPUID基础寄存器(SCB_CPUID)

地址偏移 0x00

复位值 0x411F C231(STM32F1系列)

复位值 0x412F C230(STM32F2系列和STM32L系列)

需要的特权 特权的

CPUID基础寄存器包含处理器部分编号,版本,和执行信息。

位31:24  Implementer 实施者,制定者

       0x41ARM

位22:20 Variant变体号码。Rnpn产品版本标识符中的r值。

0x1 r1

0x2 r2

位19:16 Constant 读为0xF

位15:4  PartNo 处理器部件号

       0xC23= Cortex-M3

位3:0 Revision 版次号。Rnpn产品版本标识符中的p值,指明修补发布

       0x0p0

       0x1p1

 

中断控制和状态寄存器(SCB_ICSR)

地址偏移 0x04

复位值 0x0000 0000

需要的特权 特权的

中断控制和状态寄存器(ICSR)

提供用于不可屏蔽中断异常的一个设置待定位;用于PendSV和SysTick异常的设置待定和清除待定位。

       指明了将被执行异常的异常编号;是否存在抢占活跃异常;最高优先级待定异常的异常编号;是否有中断处于待定状态。

注意:当写ICSR时,如果:写1到PENDSVSET位和写1到PENDSVCLR位;写1到PENDSTSET位和写1到PENDSTCLR位;效果是不可预测的。

位31  NMIPENDSETNMI设置待定位

       写:0,无效果;1,改变NMI异常状态为待定状态。

       读:0,NMI异常不是待定状态;NMI异常是待定状态。

       因为NMI是最高优先级异常,一般地处理器只要它的寄存器对此位写1就进入NMI异常处理,并且进入处理清除这一位为0。通过NMI异常处理读这一位返回1只有在处理器执行处理时NMI信号重新声明。

位30:29  保留,必须保持清除

位28 PENDSVSET PendSV设置待定位

       写:0,无效果;1,改变PendSV异常状态为待定状态;

       读:0,PendSV异常状态不是待定状态;PendSV异常状态为待定状态;

写1到这一位是唯一的设置PendSV状态位待定状态的方法。

位27 PENDSVCLR PendSV清除待定位

       写:0,无效果;1,移除PendSV异常的待定状态。

位26 PENDSTSET SysTick异常设定待定位

       写:0,无效果;1,改变Systick异常状态为待定状态;

       读:0,PendSV异常状态不是待定状态;PendSV异常状态为待定状态;

位25 PENDSTCLR SysTick异常清除待定位

       写:0,无效果;1,移除Systick异常的待定状态。

       这一位只写模式,在一个寄存器读它的值是未知的。

位24  保留,必须保持清除

位23  这一位保留用于Debug使用,当处理器不在Debug状态时读为0。

位22  ISRPENDING中断待定标志,不包括NMI和错误

       0中断没有待定;1,中断待定。

位21:12 VECTPENDING[9:0]暂停向量。指明最高优先级待定使能异常的异常编号。

       0没有待定的异常。

       其他值,最高优先级待定使能异常的异常编号。该字段指示的值,包括BASEPRI和FAULTMASK寄存的效果,但是没有任何PRIMASK寄存器的影响。

位11 RETOBASE 返回至基本水平。指示是否有抢占活跃异常。

0有抢占活跃异常执行

1没有活跃异常,或者当前执行的异常是唯一的活跃异常。

位10:9  保留,必须保持清除

位8:0 VECTATIVE[8:0]活跃向量,包含活跃异常编号。

       0线程模式

       其他值,当前活跃异常的异常编号。注释:从这个值中减去16可以获得IRQ编号,这个编号用来索引中断清除使能,设置使能,清除待定,设置待定或优先级寄存器。

 

向量表偏移寄存器(SCB_VTOR)

地址偏移 0x08

复位值 0x0000 0000

需要的特权 特权的


位31:30  保留,必须保持清除

位29:9  TBLOFF[29:9]向量表基本偏移域。它包含来于内存地址0x0000 0000表基偏移位[29:9]。当设置TBLOFF,你必须对齐对在这个向量表中异常入口编号的偏移。最小的队列为128字。表对齐要求意味着表偏移的位[8:0]一直是0。

       位29决定向量表在代码或SRAM内存区域。

0代码内存区域

1SRAM

注释:位29有时被称为TBLBASE位。

位8:0 保留,必须保持清除

 

应用中断和复位控制寄存器(SCB_AIRCR)

地址偏移 0x0C

复位值 0xFA05 0000

需要的特权 特权的

应用中断和复位控制寄存器(AIRCR)提供对异常模型优先级组控制,数据访问的字节序状态,系统复位控制。

为了写这个寄存器,必须写0x5FA到VECTKEY域,否则处理器忽略写。

位31:16 VECTKEYSTAT[15:0]/VECTKEY[15:0]寄存器钥匙

       读为0xFA05

       写入时,将0x5FA写入到VECTKEY,否则写将被忽略。

位15 ENDIANESS数据字节序位

       读为0,小端字节序。

位14:11  保留,必须保持清除
位10:8 PRIGROUP[2:0]中断优先级组域。这个域决定从子优先级拆分组优先级。

位7:3 保留,必须保持清除

位2 SYSRESETREQ 系统复位需求。这一位打算强制一个除了debug的所有主要器件的大系统复位。

       读为0。

       0无系统复位请求。

       1向请求复位的外部系统声称一个信号。

位1 VECTCLRACTIVE 保留为debug使用。这1位读为0.当写入寄存器时,必须写入0到这一位,否则,行为是不可预测的。

位0 VECTRESET 保留为debug使用。这一位读为0。当写入寄存器时,必须写入0到这一位,否则,行为是不可预测的。

 

系统控制寄存器(SCB_SCR)

地址偏移 0x10

复位值 0x0000 0000

需要的特权 特权的

系统控制寄存器SCR控制进入和离开低功耗状态的特点。


位31:5  保留,必须保持清除

位4  SEVEONPEND发送事件在待定状态位。

当一个事件或中断进入待定状态时,事件信号从WFE唤醒处理器。如果处理器不是在等待一个事件,这个事件将被注册并影响下次的WFE。

       处理器同样唤醒执行在执行一个SEV指令或一个外部事件。

       0只有使能的中断或事件可以唤醒处理器,失能的中断被排除。

       1使能的事件和所有中断,包括失能的中断,也可以唤醒处理器。

位3保留,必须保持清除

位2 SLEEPDEEP控制处理器使用睡眠还是深度睡眠作为它的低功耗模式。

       0睡眠;1深度睡眠

位1 SLEEPONEXIT 当从处理模式返回到线程模式时配置sleep-on-exit,设置这个位为1,使能一个中断驱动应用避免返回任何空的主应用。

       0当返回线程模式时不睡眠

       1在从中断服务例程返回时进入睡眠或深度睡眠

位0 保留,必须保持清除


配置和控制寄存器(SCB_CCR)

地址偏移 0x14

复位值 0x0000 0200(STM32F2和STM32L系列)

复位值 0x0000 0000(STM32F1系列)

需要的特权 特权的

配置和控制寄存器CCR控制进入线程模式和使能:NMI,硬件错误,为了忽略总线错误由FAULTMASK升级的错误,处理;除以0和不对齐访问的捕获;通过无特权程序访问STIR。


位31:10  保留,必须保持清除

位9  STKALIGN配置在异常入口栈对齐。在异常入口,处理器使用栈内的PSR的位9指示堆栈对齐。在异常返回时,它用来栈内的位恢复正确的栈对齐。

       04位对齐

       18位对齐

位8 BFHFNMIGN 使能优先级为-1或-2的处理来忽略由载入或存储指令引起的数据总线错误。这应用于硬件错误,NMI,和FAULTMASK升级处理。设置这一位为1,只有当处理和它的数据在完全安全的内存。这一位的通常应用是试探系统设备和桥梁以监测控制路径错误和定位他们。

       0由载入或存储指令引起的数据错误导致一个锁定。

       1处理运行优先级为-1或-2,忽略由载入或存储指令引起的数据总线错误。

位7:5 保留,必须保持清除

位4 DIV_0_TRP 使能错误或停止当处理器执行一个SDIV或UDIV指令时用一个除数0.

       0不捕获用0除

       1捕获用0除

       当这一位设置为0时,用0除将会返回一个商0。

位3 UNALIGN_TRP 使能未对齐访问捕获

       0不捕获未对齐的半字和字访问

       1捕获未对齐的半字和字访问

       当这一位设置为1,一个未对齐的半字和字访问将产生一个使用错误。

       不对齐的LDM,STM,LDRD和STRD指令总是故障无论UNALIGN_TRP是否设置为1

位2 保留,必须保持清除

位1 USERSETMPEND 使能无特权软件访问STIR

       0失能;1使能

位0 NONBASETHRDENA 配置处理器如何进入线程模式

       0处理器只有在没有异常活跃时进入线程模式

       1处理器可以从任何在EXC_RETURN值控制下级别进入线程模式。

 

系统处理优先级寄存器(SHPRx)

       SHPR1-SHPR3寄存器设置可配置优先级异常处理的优先级级别0~15。SHPR1-SHPR3是字节可访问的。系统错误处理和每个处理的优先级域和寄存器如下:


每一个PRI_N是8位宽,但是处理器只执行每个域位[7:4],位[3:0]读为0且被写忽略。

系统处理优先级寄存器1(SCB_SHPR1)

地址偏移 0x18

复位值 0x0000 0000

需要的特权 特权的


位31:24  保留,必须保持清除

位23:16  PRI_6[7:0]系统处理6,使用错误的优先级

位15:8  PRI_5[7:0]系统处理5,总线错误的优先级

位7:0  PRI_4[7:0]系统处理4,内存管理错误的优先级

系统处理优先级寄存器2(SCB_SHPR2)

地址偏移 0x1C

复位值 0x0000 0000

需要的特权 特权的


位31:24  PRI_11[7:0]系统处理11,管理程序调用的优先级

位23:0  保留,必须保持清除

系统处理优先级寄存器3(SCB_SHPR3)

地址 0xE000 ED20

复位值 0x0000 0000

需要的特权 特权的


位31:24  PRI_15[7:0]系统处理15,系统滴答的优先级

位23:16  PRI_14[7:0]系统处理14,PendSV的优先级

位15:0  保留,必须保持清除

 

系统处理控制和状态寄存器(SCB_SHCSR)

地址偏移 0x24

复位值 0x0000 0000

需要的特权 特权的

系统处理控制和状态寄存器(SHCSR)使能系统处理,而且指明:总线错误,内存管理错误和SVC异常的待定状态;系统处理的活跃状态。

如果你失能一个系统处理而且相应的错误出现,处理器对待错误作为一个硬件错误。

我们可以写这个寄存器改变系统异常的待定或活跃状态。一个操作系统内核可以写活跃位为了完成一个改变当前异常类型的上下文切换。改变寄存器中活跃位值的软件没有正确调整栈内的内容会导致处理器产生错误异常,确保写这个寄存器的软件保留和随后恢复当前的活跃状态;在你使能了系统处理之后,如果你不得不改变这个寄存器中一位的值,必须使用读-更改-写程序来确保你仅改变必需的位。

位31:19  保留,必须保持清除

位18  USGFAULTENA使用错误使能位,设置1使能。

位17  BUSFAULTENA总线错误使能位,设置1使能。

位16  MEMFAULTENA内存管理错误使能位,设置1使能。

位15  SVCALLPENDED管理程序调用待定位,如果异常待定读为1

位14  BUSFAULTPENDED总线错误异常待定位,如果异常待定读为1

位13  MEMFAULTPENDED内存管理错误异常待定位,如果异常待定读为1

位12  USGFAULTPENDED使用错误异常待定位,如果异常待定读为1

位11  SYSTICKACT系统滴答异常活跃位,如果异常活跃读为1

位10  PENDSVACTPendSV异常活跃位,如果异常活跃读为1

位9   保留,必须保持清除

位8   MONITORACT调试监视器活跃位,如果调试监视器活跃读为1

位7  SVCALLACT管理程序调用活跃位,如果SVC活跃读为1

位6:4   保留,必须保持清除

位3  USGFAULTACT使用错误异常活跃位,如果异常活跃读为1

位2   保留,必须保持清除

位1  BUSFAULTACT总线错误异常活跃位,如果异常活跃读为1

位0  MEMFAULTACT内存管理异常活跃位,如果异常活跃读为1

注释:使能位,设置1使能异常,设置0失能异常;

       待定位,如果异常待定读为1,否则读为0.我们可以写这些位改变异常的待定状态。

       活跃位,如果异常活跃读为1,否则读为0.我们可以写这些位改变异常的活跃状态,但是看这部分的注意事项。

 

配置错误状态寄存器(SCB_CFSR)

地址偏移 0x28

复位值 0x0000 0000

需要的特权 特权的

配置错误状态寄存器(CFSR)是可字节访问。你可以访问CFSR或它的子寄存器按照如下方式:访问完整CFSR通过对0xE000 ED28字访问;访问MMFSR通过对0xE000 ED28字节访问;访问MMFSR和BFSR通过对0xE000 ED28半字访问;访问BFSR通过对0xE000 ED29字节访问;访问UFSR通过对0xE000 ED2A半字访问;

配置错误状态寄存器(CFSR)指示了一个内存管理错误,总线错误,或使用错误的原因。


位31:26  保留,必须保持清除

位25  DIVBYZERO除以0使用错误。当处理器设置这一位为1时,为了异常返回堆栈程序计数器值指向执行除以0的指令。使能除以0的捕捉通过设置在CCR中的DIV_0_TRP位为1。

       0没有除以0错误,或者除以0捕捉未被使能

       1处理器执行了一个因数为0的SDIV或UDIV指令。

位24  UNALIGNED未对齐访问使用错误。使能未对齐访问的捕捉通过设置CCR中的UNALIGN_TRP位为1。

       不对齐的LDM,STM,LDRD和STRD指令总是错误不管UBALIGN_TRP的设置。

       0不对齐访问错误,或未对齐访问捕捉未被使能

       1处理器有一个未对齐内存访问。

位23:20  保留,必须保持清除

位19  NOCP没有协处理器使用错误。处理器不支持协处理器指令。

       0没有尝试访问协处理器导致的使用错误

       1处理器尝试访问协处理器

位18  INVPC无效程序计数器载入使用错误,由EXC_RETURN载入的一个无效程序计数器导致。当这一位设置为1时,为了异常堆栈的程序计数器的值返回指向尝试执行非法的程序计数器装载的指令。

       0没有无效程序计数器装载使用错误

       1处理器尝试EXC_RETURN到程序计数器不合法的装载,作为无效的上下文或无效的EXC_RETURN值的结果。

位17  INVSTATE无效状态使用错误。当这一位设置为1时,为了异常堆栈的程序计数器的值返回指向尝试执行非法使用EPSR的指令。如果一个未定义的指令使用ESPR,这一位不会设置为1。

       0没有无效状态使用错误

       1处理器尝试执行非法使用EPSR的指令。

位16  UNDEFINSTR未定义指令使用错误。当这一位设置为1时,为了异常堆栈的程序计数器的值返回指向未定义指令。一个未定义的指令是处理器不能解码的指令。

       0没有未定义指令使用错误

       1处理器尝试执行未定义指令。

位15 BFARVALID 地址错误地址寄存器(BFAR)有效标志。在一个已经知道地址的总线错误后,处理器设置这一位为1。其它错误设置这一位为0,录入晚一点出现的内存管理错误。

       如果一个总线错误出现而且由于优先级升级成为一个硬件错误,硬件错误处理必须设置这一位为0。这阻止预防了返回堆栈时激活总线错误处理它的BFAR已经重写的问题。

       0在BFAR中的值不是一个有效的错误地址

       1BFAR保存一个有效的错误地址

位14:13   保留,必须保持清除

位12 STKERR 在为异常进入堆栈时总线错误。当处理器设置这一位为1,SP仍然被调整但是在栈中上下文区域中的值可能不正确。处理器不写一个错误地址在BFAR中。

       0没有堆栈错误

       1在异常进入时堆栈已经导致一个或多个总线错误

位11 UNSTKERR 在为异常返回反堆栈时总线错误。这个错误被链接到处理,这意味着当处理器设置这一位为1,原始的返回栈依然存在。处理器不从这错误的返回中调整SP,不执行一个新的保存,不写一个错误地址在BFAR中。

       0没有反堆栈错误

       1在异常返回时反堆栈已经导致一个或多个总线错误

位10 IMPRECISERR 不精确数据总线错误。当处理器设置这一位为1时,它不写一个错误地址到BFAR。这是一个异步错误。因此,当目前处理器的优先级高于总线错误优先级时它被检测到,总线错误变成待定而且只有在处理器从所有较高优先级进程返回时才会变成活跃状态。如果一个精确错误出现在处理器进入精确总线错误处理之前,处理检测IMPREECISERR设置为1且一个精确错误状态设置为1。

       0没有不精确数据总线错误

       1一个数据总线错误出现,但是在栈帧中的返回地址没有相关导致错误的指令。

位9 PRECISERR 精确数据总线错误。当处理器设置这一位为1时,它写错误地址到BFAR。

       0没有精确数据总线错误

       1一个数据总线错误出现,并且为异常堆栈的程序计数器值返回指向导致错误的指令。

位8 IBUSERR 指令总线错误。处理器在预取一个指令时检测指令总线错误,但是仅在它尝试发行错误指令时它设置IBUSERR标志为1。当处理器设置这一位为1时,它不写一个错误地址到BFAR。

       0没有指令总线错误

       1指令总线错误

位7 MMARVALID 内存管理错误地址寄存器有效标志。如果一个内存管理错误出现并且它被由于优先级升级为一个硬件错误,硬件错误处理必须设置这一位为0.这避免了返回堆栈时激活内存管理错误处理MMAR值已经重写的错误。

       0在MMAR中的值是一个无效地址

1MMAR保存一个有效错误地址

位6:5   保留,必须保持清除

位4  MSTKERR在异常进入堆栈时内存管理错误。当这一位设置为1,SP仍旧被调整但是在栈中上下文区域的值可能不正确。处理器没有写一个错误地址到MMAR。

       0没有堆栈错误

       1在为异常进入堆栈时导致了一个或多个访问违例。

位3  MUNSTKERR在为一个异常返回反堆栈时内存管理错误。这个错误被链接到处理。这意味着当这一位为1时,原始的返回栈仍旧存在。处理器不从错误返回中调整SP,不执行一个新的保存,不写一个错误地址到MMAR。

       0没有堆栈错误

       1在为异常返回反堆栈时导致了一个或多个访问违例。

位2   保留,必须保持清除

位1  DACCVIL数据访问违例标志。但这一位为1时,为异常返回堆栈的PC值指向错误指令。处理器用尝试访问的地址装载MMAR。

       0没有数据访问违例错误

       1处理器尝试一个不被允许的装载或存储在一个位置。

位0  IACCVIOL指令访问违例标志。这个错误出现在对一个XN区域的任何访问。但这一位为1时,为异常返回堆栈的PC值指向错误指令,处理器不写一个错误地址到MMAR。

       0没有指令访问违例错误

       1处理器尝试一个不被允许的从一个位置指令预取。

 

硬件错误状态寄存器(SCB_HFSR)

地址偏移 0x2C

复位值 0x0000 0000

需要的特权 特权的

硬件错误状态寄存器(HFSR)提供了关于激活硬件错误处理的事件的信息。这个寄存器可以读,写清除。这意味着在寄存器中的位平时读,但是写1到任何位清除该位为0。


位31  DEBUG_VT为debug使用保留。当写这个寄存器时你必须向这一位写0,否则行为是不可预测的。

位30 FORCED 被迫的硬件错误。表明一个被迫的硬件错误,由一个不能被处理的可配置优先级的错误升级产生的,或者由于优先级或者由于它被失能。当这一位设置为1时,硬件错误处理必须读其他错误状态寄存器来查找错误的原因。

       0没有被迫的硬件错误

       1被迫的硬件错误

位29:2保留,必须保持清除

位1 VECTTBL 向量表硬件错误。指明在异常处理时读向量表时的一个总线错误。这个错误总是由硬件错误处理。当这一位为1时,为异常返回堆栈的PC值指向被异常抢占的指令。

       0在向量表读时没有总线错误

       1在向量表读时有总线错误

位0 保留,必须保持清除

 

内存管理错误地址寄存器(SCB_MMFAR)

地址偏移 0x34

复位值 未定义

需要的特权 特权的

位31:0 MMFAR[31:0] 内存管理错误地址。当MMFSR的MMARVALID位为1时,这个区域保存着产生内存管理错误的地址定位。当一个不对齐的访问错误时,地址是有错误的实际地址。因为单一的读或写指令可以分为多个对齐访问,错误的地址可以是在要求访问大小范围内的任何地址。在MMFSR寄存器中标志指明错误的原因,和在MMFAR中的值是否有效。

 

总线错误地址寄存器(SCB_BFAR)

地址偏移 0x38

复位值 未定义

需要的特权 特权的


位31:0 BFAR[31:0] 总线错误地址。当BFSR的BFARVALID位为1时,这个区域保存着产生总线错误的地址定位。

当一个不对齐的访问错误时,在BFAR中的地址是指令请求的地址,即使它不是故障的地址。

在BFSR寄存器中标志指明错误的原因,和在BFAR中的值是否有效。

 

系统控制块设计提示和小技巧。确保软件使用正确大小对齐访问方式访问系统控制块寄存器:除了CFSR和SHPR1-SHPR3,必须使用字对齐访问;对于CFSR和SHPR1-SHPR3,他可以使用字节或对齐的半字和字访问。

 

处理器不支持对系统控制块寄存器的不对齐访问。、

在一个错误处理,确定真实的错误地址:读和保存MMFAR或BFAR的值;读在MMFSR中的MMARVALD位,或BFSR中的BFARVALID位。MMFAR或BFAR地址仅在这个位为1时有效。

软件必须按照这个顺序,因为另一个高优先级异常可能改变MMFAR或BFAR的值。例如,如果一个高优先级处理抢占了当前错误处理,其它错误可能改变MMFAR或BFAR的值。

 

SCGB寄存器地址。下表提供显示了系统控制块寄存器地图和复位值。SCB寄存器块的基地址是0xE000 ED00。


对于stm32L和stm32F2,一个辅助控制寄存器被添加,并将系统控制块寄存器基地址设置为0xE000 E008。






  相关解决方案