ARM Cortex-M3/M4 权势巨子指南 条记【二】架构

打印 上一主题 下一主题

主题 876|帖子 876|积分 2628

一、架构

1.1 架构简介

Cortex-M3/M4 处置惩罚器都基于 ARMv7-M 架构。最初的 ARMv7-M 架构是随着 Cortex-M3 处置惩罚器一同引入的,而在 Cortex-M4 发布时,架构中又额外增长了新的指令和特性,改进后的架构有时也被称为 ARMV7E-M。要了解 ARM7-M 和 ARMV7E-M 的特性。



二、编程模子

2.1 操作模式和状态

Cortex-M3/M4 处置惩罚器有两种操作状态和两个模式。另外,处置惩罚器还可以区分特权和非特权访问品级,特区访问品级可以处置惩罚器所有的资源,而非特权访问品级意味着有些储存器地区是不能访问的,有些操作也是无法使用的。
2.1.1 操作状态

调试状态:当处置惩罚器被暂停后(比方,通过调试器或断点触发后),就会进入调试状态并制止指令运行。
Thumb 状态:若处置惩罚器正在执行步伐代码(Thumb指令),他就会处于 Thumb 状态。
2.1.2 操作模式

处置惩罚模式:执行中断服务步伐(ISR)等异常处置惩罚。在处置惩罚模式下,处置惩罚器总是具有特权访问品级。
线程模式:在执行平凡的应用步伐代码时,处置惩罚器可以处于特权访问品级,也可以处于非特权访问品级。实际的访问品级由特殊寄存器 control 控制。





三、寄存器

与其他几乎所有的处置惩罚器类似,Cortex-M3/M4 处置惩罚器在处置惩罚器内核中都有多个执行数据处置惩罚和控制的寄存器,这些寄存器大都以寄存器组的情势举行了分组。每个数据处置惩罚指令都指定了所需的操作和源寄存器,而且若必要,还有目标寄存器。
对于ARM 架构,若处置惩罚的是存储器中的数据,就必要将其从存储器加载到寄存器组中的寄存器里。在处置惩罚器内处置惩罚完后,若有必要,还要写回存储器,这种方式一样平常被称作“加载一存储架构”。由于寄存器组中有丰富的寄存器,这种筹划使用起来非常方便,而且可以用 C 编译器生成高效的步伐代码。比方,在举行其他的数据处置惩罚时,寄存器组中可以临时存储一些数据变量,而无须更新到系统存储器及在使用时将它们读回。
Cortex-M3/M4 处置惩罚器的寄存器组中有 16 个寄存器,此中 13 个为 32 位通用目标寄存器,其他 3 个则有特殊用途。

3.1 R0~R12 寄存器

寄存器 R0~R12 为通用目标寄存器,前 8 个 (R0~R7) 也被称作低寄存器。
由于指令中可用的空间有限,许多 16 位指令只能访问低寄存器。高寄存器 (R8~R12) 则可以用于 32 位指令和几个 16 位指令,如 MOV(move)。R0~R12 的初始值是未定义的。
3.2 R13 栈指针 (SP)

R13 为栈指针,可通过 push 和 pop 操作实现栈存储的访问。
物理上存在两个栈指针:


  • 主栈指针(MSP):为默认的栈指针,在复位后或处置惩罚器处于处置惩罚模式时,其会被处置惩罚器选择使用。
  • 历程栈指针(PSP):栈指针,其只能用于线程模式。
栈指针的选择由特殊寄存器 control 决定,对于一样平常的步伐,这两个寄存器只会有一个可见。MSP 和 PSP 都是 32 位的,不过指针(MSP 或 PSP)的最低两位总是为 0,对这两位的写操作不起作用。对于 ARMCortex-M 处置惩罚器,push 和 pop 总是 32 位的,栈操作的地点也必须对齐到 32 位的字边界上。
大多情况下,若应用不必要嵌入式 OS,PSP 也没必要使用。许多简朴的应用可以完全依赖于MSP,一样平常在用到嵌入式 OS 时才会使用 PSP。此时 OS 内核同应用使命的栈是相互独立的。PSP 的初始值未定义,而 MSP 的初始值则必要在复位流程中从存储器的第一个字中取出。
3.3 R14 链接寄存器 (LR)

R14 也被称作链接寄存器 (LR),用于函数或子步伐调用时返回地点的生存。
在函数或子步伐结束时,步伐控制可以通过将 LR 的数值加载步伐计数器 (PC) 中返回调用步伐处并继承执行。当执行了函数或子步伐调用后,LR 的数值会主动更新。若某函数必要调用另外一个函数或子步伐,则它必要首先将 LR 的数值生存在栈中,否则,当执行了函数调用后,LR 的当前值会丢失。
在异常处置惩罚期间,IR 也会被主动更新为特殊的 EXCRETURN(异常返回)数值,之后该数值会在异常处置惩罚结束时触发异常返回。尽管 Cortex-M 处置惩罚器中的返回地点数值总是偶数(由于指令会对齐到半字地点上,因此,第 0 位为 0),LR 的第 0 位为可读可写的,有些跳转/调用操作必要将 LR (或正使用的任何寄存器)的第 0 位置 1 以表示 Thumb 状态。
3.4 R15 步伐计数器 (PC)

R15 为步伐计数器(PC),是可读可写的,读操作返回当前指令地点加 4,写 PC(比方,使用数据传输/处置惩罚指令)会引起跳转操作。
由于指令必须要对齐到半字或字地点,PC 的最低位(ISB)为 0。不过,在使用一些跳转/读存储器指令更新 PC 时,必要将新 PC 值的 LSB 置 1 以表示 Thumb 状态,否则就会由于试图使用不支持的 ARM 指令(如 ARM7TDMI 中的 32 位 ARM 指令)而触发错误异常。对于高级编程语言(包括C和C++),编译器会主动将跳转目标的 LSB 置位。多数情况下,跳转和调用由专门的指令实现,利用数据处置惩罚指令更新PC的情况较为少见。
多数情况下,跳转和调用由专门的指令实现,利用数据处置惩罚指令更新PC的情况较为少见。不过,在访问位于步伐存储器中的字符数据时,PC的数值非常有用,因此,会经常发现存储器读操作将 PC 作为基地点寄存器,而地点偏移则由指令中的立即数生成。
3.5 步伐中使用的寄存器名

对于多数汇编工具,在访问寄存器组中的寄存器时可以使用多种名称。在一些汇编工具中,如 ARM 汇编(被 DS-5 Professional和Keil MDK-ARM 支持),可以使用大写、小写或者大小写混淆。

3.6 特殊寄存器

除了寄存器组中的寄存器外,处置惩罚器中还存在多个特殊寄存器,这些寄存器表示处置惩罚器状态、定义了操作状态和中断/异常屏蔽。在使用 C 等高级编程语言开发简朴的应用时,必要访问这些寄存器的情况不多。不过,在开发嵌入式 OS 或必要高级中断屏蔽特性时,就要访问它们。

特殊寄存器未经过存储器映射,可以使用 MSR 和 MRS 等特殊寄存器访问指令来举行访问。
  1. MRS<reg>,<special reg> ;将特殊寄存器读入寄存器
  2. MSR<special reg>,<reg> ;写入特殊寄存器
复制代码
CMSIS-Core 也提供了几个用于访问特殊寄存器的 C 函数。不要把特殊寄存器和其他微控制器架构中的“特殊功能寄存器(SFR)”搞混淆了,它们一样平常指的是用于 I/O 控制的寄存器。 
3.6.1 步伐状态寄存器

步伐状态寄存器包括以下三个状态寄存器:


  • 应用 PSR(APSR)
  • 执行 PSR(EPSR)
  • 中断 PSR(IPSR)
这三个寄存器可以通过一共寄存器组访问,有些被称之为 xPSR。访问方式如下:
  1. MRS r0, PSR    ;读组合程序状态字
  2. MSR PSR, r0     ;写组合程序状态字
复制代码
还可以单独访问每个PSR:比方:
  1. MRS r0,APSR    ;将标志状态读入R0
  2. MRS r0,IPSR    ;读取异常/中断状态
  3. MSR APSR,r0    ;写标志状态
复制代码
软件代码无法直接使用 MRS(读出为0) 
 


 


3.6.2 PRIMASK、FAULTMASK 和 BASEPRI 寄存器

PRIMASK、FAULTMASK 和 BASEPRI 寄存器都用于异常或中断屏蔽,每个异常(包括中断)都具有一个优先品级,数值小的优先级高,而数值大的则优先级低。这些特殊寄存器可基于优先品级屏蔽异常,只有在特权访问品级才可以对它们举行操作(非特权状态下的写操作会被忽略,而读出则会返回 0)。它们默认全部为 0,也就是屏蔽(克制异常/中断)不起作用。

1.PRIMASK 寄存器:
为 1 位宽的中断屏蔽寄存器。在置位时,它会阻止不可屏蔽中断(NMI)和HardFault 异常之外的所有异常(包括中断)。实际上,它是将当前异常优先级提升为 0,这也是可编程异常/中断的最高优先级。
PRIMASK 最常见的用途为,在时间要求很严格的历程中克制所有中断,在该历程完成后,必要将PRIMASK 扫除以重新使能中断。
2.FAULTMASK 和 PRIMASK 寄存器:
他们非常类似,不过它还能屏蔽 HardFault 异常,它实际上是将异常优先级提升到了-1。错误处置惩罚代码可以使用 FAULTMASK 以免在错误处置惩罚期间引发其他的错误(只有几种)。比方,FAULTMASK 可用于旁路 MPU 或屏蔽总线错误(这些都是可配置的),如许,错误处置惩罚代码执行修复措施也就更加容易了。与 PRIMASK 差别 FAULTMASK 在异常返回时会被主动扫除。
3.6.3 在特权状态下访问这些寄存器

待增补
3.6.5 CONTROL 寄存器

待增补
3.6.6 浮点寄存器

Cortex-M4 具有可选的浮点单元,其提供了浮点数据处置惩罚用的一些寄存器以及浮点状态和控制寄存器(FPSCR)。
1.S0~S31 和 D0~D15 寄存器
S0~S31(S) 都为 32 位寄存器,而且每个都可以通过浮点指令访问,或者利用符号 D0~D15(D 代表双字/双精度)成对访问。比方,S0 和 S1 成对组成 D0,而 S3 和 S2 则成对组成 D1。尽管Cortex-M4 中的浮点单元不支持双精度浮点运算,在传输双精度数据时仍可使用浮点指令。
2.浮点状态和控制寄存器(FPSCR)
由于下面的几个原因,FPSCR 中包罗多个位域


  • 定义一些浮点运算动作。
  • 提供浮点运算效果的状态信息。
浮点控制默认被配置为符合 IEEE754 单精度运算。在平凡应用中,浮点运算控制的设置也无须修改。列出了 FPSCR 的位域形貌。


3.7 应用步伐寄存器

3.7.1 整数状态标志

待增补
3.7.2 Q 状态标志

待增补
3.7.3 GE 位

待增补



四、储存器系统

4.1 储存器系统特性

Cortex-M3 和 Cortex-M4 处置惩罚器具有以下存储器系统特性:
4GB 线性地点空间:
通过32位寻址,ARM处置惩罚器可以访问多达4GB的存储器空间尽管许多嵌入式系统必要的存储器都不凌驾1MB,32位的寻址本领可以确保将来升级和扩展的大概。Cortex-M3和Cortex-M4处置惩罚器用AHBLITE总线协议提供了32位总线,利用合适的存储器接口控制器,可以将32/16/8位处置惩罚器毗连到总线上。
架构定义的存储器映射:
4GB的存储器空间被划分为多个地区,用于预定义的存储器和外设,以优化处置惩罚器筹划的性能。比方,Cortex-M3/M4处置惩罚器具有多个总线接口,允许对步伐代码用的CODE地区的访问和对SRAM或外设地区的数据操作同时举行。
支持小端和大端的存储器系统:
Cortex-M3/M4 处置惩罚器可以使用小端或大端的存储器系统。实际上,微控制器产品一样平常会被筹划成只具有一种端配置。位段访问(可选)。当包罗位段特性时(由微控制器/片上系统供应商决定),存储器映射中的两个1MB地区可以通过两个位段地区举行位寻址,如许可以实现对SRAM或外设地点空间中单独位的原子操作。
写缓冲:
若对可缓冲存储器地区的写传输必要耗费几个周期,Cortex-M3/M4 处置惩罚器内的写缓冲大概会将本次传输缓存起来,处置惩罚器可以继承执行下一条指令如果大概的话,如许可以提高步伐的执行速度。
存储器掩护单元(MPU):
MPU定义了各存储器地区的访问权限,且为可编程的。Cortex-M3和Cortex-M4处置惩罚器中的MPU支持8个可编程地区,可在嵌入式OS中提高系统的健壮性。
非对齐传输支持:
ARMv7-M架构的所有处置惩罚器(包括Cortex-M3和Cortex-M4处置惩罚器)都支持非对齐传输。
Cortex-M 处置惩罚器的总线接口为通用总线接口,可通过差别的存储器控制器被毗连至差别范例和大小的存储器。微控制器存储器系统中的存储器一样平常为两种或更多:步伐代码用的 Flash 存储器、数据用的静态 RAM(SRAM),有时还会有电可擦除只读存储器 (EEPROM)。大多情况下,这些存储器位于芯片内部,实际的存储器接口细节对软件开发职员是不可见的。因此,软件开发职员只需了解步伐存储器和 SRAM 的地点和大小即可。
4.2 储存器映射


4.3 栈存储

同几乎所有的处置惩罚器架构一样,Cortex-M 处置惩罚器在运行时必要栈存储和栈指针(R13)在栈这种存储器使用机制中,存储器的一部分可被用作后进先出的数据存储缓冲。ARM 处置惩罚器将系统主存储器用于栈空间操作,且使用 PUSH 指令往栈中存储数据以及 POP 指令从栈中提取数据。每次PUSH 和 POP 操作后,当前使用的指针都会主动调整。
栈可用于:


  • 当正在执行的函数必要使用寄存器(寄存器组中)举行数据处置惩罚时,临时存储数据的初始值。这数据在函数结束时可以被规复出来,以免调用函数的步伐丢失数据。
  • 往函数或子步伐中的信息通报。
  • 用于存储局部变量。
  • 在中断等异常产生时生存处置惩罚器状态和寄存器数值。
Cortex-M 处置惩罚器使用的栈模子被称作 “满递减”。处置惩罚器启动后,SP 被设置为栈存储空间最后的位置。对于每次 PUSH 操作,处置惩罚器首先减小 SP 的值,然后将数据存储在 SP 指向的存储器位置。在操作期间,SP 指向上一次数据被存储在栈中的位置,对于POP操作,SP指向的存储器位置的数据被读出,然后SP的数值会主动减小。PUSH和POP指令最常见的用法为,在执行函数或子步伐调用时生存寄存器组中的内容。在函数调用开始时,有些寄存器的内容可以通过PUSH指令生存在栈中,而后在函数调用结束时通过POP规复为它们的初始值。比方,中的一个名为 functionl 的简朴函数/子步伐被主步伐调用,由于function1必要在数据处置惩罚时使用并修改R4、R5和R6,而这些

4.4 储存器掩护单元(MPU)

MPU在Cortex-M3/M4 处置惩罚器中是可选的,因此并不是所有的Cortex-M3/M4 微控制器都有 MPU 特性。多数应用不会用到 MPU,因此可以忽略。在必要高可靠性的嵌人式系统中,MPU 可以通过定义特权和非特权访问权限,来掩护存储器地区,MPU 是可编程的,而且Cortex-M3/M4 处置惩罚器中的 MPU 支持 8 个可编程地区。MPU 可以有多种用法。有些情况下,MPU 由嵌人式 OS 控制,每个使命都被配置了存储器访问权限;而对于其他情况,MPU 被配置为只掩护某一特定存储器地区,如将某存储器地区设置为只读。



五、异常和中断

5.1 什么是异常

异常是会改变步伐流的变乱,当其产生时,处置惩罚器会暂停当前正在执行的使命,转而执行一段被称作异常处置惩罚的步伐。在异常处置惩罚执行完后,处置惩罚器会继承正常地步伐执行。对于ARM架构,中断就是异常的一种,它一样平常由外设或外部输入产生,有时也可以由软件触发。中断的异常处置惩罚也被称作中断服务步伐(ISR)。

NVIC 处置惩罚异常。NVIC 可以处置惩罚多个中断请求(IRQ)和一个不可屏蔽中断(NMI)请求,IRQ 一样平常由片上外设或外部中断输入通过 I/O 端口产生,NMI 可用于看门狗定时器或掉电检测(一种电压监视单元,在电压低到肯定程度时会给处置惩罚器产生警告)。处置惩罚器内部也闻名为 SysTick 的定时器,它可以产生周期性的定时中断请求,可用于嵌人式 OS 计时或没有 OS 的应用中的简朴定时控制。
处置惩罚器自身也是一个异常变乱源,此中包括表示系统错误状态的错误变乱以及软件产生、支持嵌入式 OS 操作的异常。
异常编号CMSIS 中断编号异常范例优先级功能
1复位—3
2—14NMI—2
3—13硬件错误—1
4—12MemManage 错误可设置
5—11总线错误可设置
6—10使用错误可设置
7-10
11—5SVC可设置
12—4调试错误可设置
13
14—2PendSV可设置
15—1SYSTICK可设置
16~2550~239IRQ可设置
每个异常源都有一个异常编号,编号 1~15 被归为系统异常,16 号及其之上的则用于中断。Cortex-M3/M4 处置惩罚器在筹划上支持最多 240 个中断输人,不过实际实现的中断数量要小得多,一样平常在16~100 之间,如许可以减小硅片面积,同时也会降低功耗。
异常编号在多个寄存器中都有所表现,此中包括用于确定异常向量地点的 IPSR。异常向量存储在向量表中,在异常入口流程中,处置惩罚器会读取这个表格以确定异常处置惩罚的起始地点。注意,异常编号的定义和 CMSIS 的设备驱动库中的中断编号定义差别。在 CMSIS 的设备驱动库中,中断编号从 0开始,系统异常编号则为负值。
与ARM7TDMI 等经典 ARM 处置惩罚器相比,Cortex-M 处置惩罚器中没有 FIQ(快速中断)。不过,Cortex-M3/M4 的中断期待非常小,只有 12 个周期,因此这也不会引起什么题目。
复位是一种特殊的异常,当处置惩罚器从复位中退出时,就会在线程模式(而不是其他异常时的处置惩罚模式)下执行复位处置惩罚。IPSR 中的异常编号读出也是 0。
5.2 嵌套向量中断控制器(NVIC)

NVIC 为 Cortex-M 处置惩罚器的一部分,它是可编程的,且寄存器位于存储器映射的系统控制空间(SCS)NVIC处置惩罚异常和中断配置、优先级以及中断屏蔽。NVIC具有以下特性:


  • 灵活的异常和中断管理
  • 支持嵌套异常/中断
  • 向量化的异常/中断入口
  • 中断屏蔽
1.灵活的中断和异常:
管理每个中断(除了NMI)都可以被使能或克制而且都具有可由软件设置或扫除的挂起状态
NVIC 可以处置惩罚多种范例的中断源:


  • 脉冲中断请求:中断请求至少持续一个时钟周期,当 NVIC 在某中断输入收到一个脉冲时,挂起状态就会置位且保持到中断得到处置惩罚。
  • 电平触发中断请求:在中断得到处置惩罚前必要将中断源的请求保持为高。
NVIC 输人信号为高有效。不过,实际微控制器中的外部中断输人的筹划大概会有所差别,会被片上系统逻辑转换为有效的高电平信号。
2.嵌套向量/中断支持:
每个异常都有一个优先级,中断等一些异常具有可编程的优先级,而其他的则大概会有固定的优先级。当异常产生时,NVIC 会将异常的优先级和当前品级相比较,若新异常的优先级较高,当前正在执行的使命就会暂停,有些寄存器则会被生存在栈空间,而且处置惩罚器会开始执行新异常的异常处置惩罚,这个过程叫作"抢占”。当更高优先级的异常处置惩罚完成后,它就会被异常返回操作终止,处置惩罚器主动从栈中规复寄存器内容,并且继承执行之前的使命。利用这种机制,异常服务嵌套不会带来任何软件开销。
3.向量化的异常/中断入口:
当异常发生时,处置惩罚器必要确定相应的异常处置惩罚入口的位置。对于 ARM7TDMI 等 ARM 处置惩罚器,这一操作由软件实现,Cortex-M 处置惩罚器则会从存储器的向量表中主动定位异常处置惩罚的入口。因此,如许也降低了从异常产生到异常处置惩罚执行间的延时。
4.中断屏蔽:
Cortex-M3/M4 处置惩罚器中的 NVIC 提供了多个中断屏蔽寄存器,如 PRIMASK 特殊寄存器。利用PRIMASK 寄存器,可以克制除 HardFault 和 NMI 外的所有异常。这种屏蔽对不应被中断的操作非常有用,如时序关键控制使命或实时多媒体编解码器。另外,还可以使用 BASEPRI 寄存器来选择屏蔽低于特定优先级的异常或中断。CMSIS-Core 提供了一组可以很方便访问各种中断控制功能的函数。NVIC 的灵活性和本领还使得 Cortex-M 处置惩罚器非常易于使用,而且通过降低中断处置惩罚的软件开销,在减小了代码体积的同时,还提高了系统的响应速度。
5.3 向量表

当异常变乱产生且被处置惩罚器内核接受后,相应的异常处置惩罚就会执行。要确定异常处置惩罚的起始地点,处置惩罚器利用了一种向量表机制。向量表为系统存储器内的字数据数组,每个元素都代表一个异常范例的起始地点。向量表是可以重定位的,重定位由 NVIC 中名为向量表偏移寄存器(VTOR)的可编程寄存器控制。复位后,VTOR 默以为 0,向量表则位于地点 0x0 处。
比方:若复位为异常范例 1,则复位向量的地点为 1X4(每个字为4字节),也就是0x00000004;NMI 向量(范例2)则是位于 2X4=0x00000008。地点0x00000000处存放的是MSP的初始值。
每个异常向量的最低位表示异常是否在 Thumb 状态下执行,由于Cortex-M 处置惩罚器只支持 Thumb指令,因此,所有异常向量的最低位都应该为 1。
5.4 错误处置惩罚

Cortex-M3/M4 处置惩罚器中有几个异常为错误处置惩罚异常。处置惩罚器检测到错误时就会触发错误异常,检测到的错误包括执行未定义的指令以及总线错误对存储器访问返回错误的响应等。错误异常机制使得错误可以被快速发现,软件因此也可以执行相应的修复措施。

总线错误、使用错误以及存储器管理错误默认都是克制的,且所有的错误变乱都会触发 HardFault异常。不过,这些配置都是可编程的,可以单独使能这三个错误异常,以处置惩罚差别范例的错误。HardFault 异常总是使能的。错误异常也可在软件调试时使用。比方,在错误产生时,错误异常可以主动网络信息及关照用户或其他系统错误已产生,并能够提供调试信息。Cortex-M3/M4 处置惩罚器中有多个可用的错误状态寄存器,它们提供了错误源等信息。开发职员可以在软件开发过程中利用调试器检查这些错误状态寄存器。



六、系统控制块(SCB)

SCB 为处置惩罚器的一部分,位于 NVIC 中。SCB 包罗寄存器,用于:


  • 控制处置惩罚器配置(如低功耗模式)
  • 提供错误状态信息(错误状态寄存器)
  • 向量表重定位(VTOR)
SCB 经过了存储器映射与 NVIC 寄存器类似,SCB 寄存器可以从系统控制空间(SCS)访问。



七、调试

由于软件越来越复杂,调试特性在现代处置惩罚器架构中也变得越来越紧张。尽管筹划非常紧凑,Cortex-M3/M4 处置惩罚器中包罗了多种经过精心筹划的调试特性,此中包括暂停和步进等步伐执行控制、指令断点、数据监视点、寄存器和存储器访问、概况及跟踪等。
Cortex-M 处置惩罚器提供了两种接口:调试和跟踪。利用调试接口,调试适配器可以毗连到 Cortex-M 微控制器上以控制调试特性和访问片上的存储器空间。Cortex-M 处置惩罚器支持传统的使用 4 或 5 个引脚的 JTAG 协议,以及名为串行线调试(SWD)的 2 针协议。SWD 协议由 ARM 开发。可以仅使用两个引脚实现和 JTAG 相同的调试特性,而且不会丧失调试性能。许多贸易调试适配器,如 Keil 的 ULINK2 或 ULINKPro 产品,都支持两种协议。这两种协议可以使用相同的接头,此中 JTAG、TCK 和串行线时钟共用 JTAG、TMS 则与串行线数据共用,数据引脚是双向的。多家公司提供的差别调试适配器都支持这两种协议。




八、复位和复位流程

对于典范的Cortex-M微控制器,复位范例共有三种:


  • 上电复位:复位微控制器中的所有部分,此中包括处置惩罚器、调试支持部件和外设等
  • 系统复位:只会复位处置惩罚器和外设,不包括处置惩罚器的调试支持部件。
  • 处置惩罚器复位:只复位处置惩罚器。
在系统调试或处置惩罚器复位操作过程中,Cortex-M3/M4 处置惩罚器中的调试部件不会复位,如许可以保持调试主机(如运行在计算机上的调试器软件)和微控制器间的毗连。调试主机可以通过系统控制块(SCB)中的寄存器产生系统复位或处置惩罚器复位。
上电复位和系统复位的持续时间取决于实际的微控制器筹划。有些情况下,由于复位控制器必要期待晶体振荡器等时钟源稳定下来,因此,复位要持续多少毫秒。
在复位后以及处置惩罚器开始执行步伐前,Cortex-M 处置惩罚器会从存储器中读出头两个字,向量表位于存储器的开头部分,它的头两个字为主栈指针(MSP)的初始值,以及代表复位处置惩罚起始地点的复位向量。处置惩罚器读出这两个字后,就会将这些数值赋给 MSP 和步伐计数器(PC)。

MSP 的设置黑白常必要的,这是由于在复位的很短时间内有产生 NMI 或 HardFault 的大概,在异常处置惩罚前将处置惩罚器状态压栈时必要栈储存和 MSP。
注意:对于多数 C 开发环境,C 启动代码会在进入主步伐 main() 前更新 MSP 的数值通过这两次对栈的设置,具有外部存储器的微控制器可以将外部存储器用作栈。比方,启动时栈大概位于片上SRAM,在复位处置惩罚中初始化外部存储器后执行C启动代码,此时会将栈设置为外部存储器。
ARM7TDMI 等经典的 ARM 处置惩罚器的栈初始化处置惩罚是差别的,在复位时处置惩罚器会从地点 0 处开始执行指令,栈指针必须要由软件初始化。对于经典的 ARM 处置惩罚器,向量表中为指令代码而不是地点值。
由于 Cortex-M3/M4 中的栈操作基于满递减的栈(SP在存储前减小),SP的初始值应该被设置为栈地区顶部的第一个位置。比方,若存储器地区为 0x20007C00~0x20007FFF(1KB),所示,初始的指针就应该为 0x20008000。

对于 Cortex-M 处置惩罚器,向量表中向量地点的最低位应该为 1,以表示它们为 Thumb 代码。正是由于这个原因,复位向量为 0x101,而启动代码从 0x100 处开始。在取出复位向量后,Cortex-M 处置惩罚器就可以从复位向量地点处执行步伐,并开始正常操作。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表