Cortex-M3系列微处理器应用:专们3为那些对成本和功耗非常敏感但同时又对性能有较高要求的应用而设计的。
其核心是基于哈佛架构的三级流水线内核。
该内核基于最新的ARMv7架构,采用Thumb-2指令集,继承了分支预测,单周期乘法,硬件除法等众多功能。
微处理器分级结构:Cortex-M3处理器内核、调试系统、时钟、存储器、外设、I/O等。
一、内核体系结构
Cortex-M3 内核主要包括:①中央处理器核心
②嵌套中断向量控制器 (NVIC)
③系统时钟 (SYSTICK)
④存储器保护单元 (MPU)
⑤总线矩阵
调试系统包括:①串行线调试端口、串行线JTAG调试端口(SW-DP/SWJ-DP)
②基于AHB总线的通用调试端口(AHB-AP)
③嵌入式跟踪宏单元(ETM)
④数据观察点触发器(DWT)
⑤指令跟踪宏单元(ITM)
⑥跟踪端口接口单元(TPIU)
⑦Flash重载及断点单元(FPB)
⑧配置查找表(ROM表)
二、系统总线结构
总线:计算机系统中,各个部件之间传送信息的公共通路。
它是计算机各种功能部件之间传送信息的公共干线。
I-Code:指令总线、
D-Code:数据总线
系统总线:SRAM,片上外设,排外RAM,片外扩展设备以及系统级存储区。
外设总线:在系统连接结构中,通常借助AHB-APB桥实现内核内部告诉总线到外部低俗总线的数据缓冲和转换。
三、寄存器
-----------------------------------------------------------------------------------------------------------------------------------
R0
-
-
- 低组寄存器
-
-
- 通用寄存器
-
R8
-
- 高组寄存器
-
R12
------------------------------------------------------------------------------------------------------------------------------------
R13(MSP、PSP) 主堆栈指针(MSP)、进程堆栈指针(PSP)
R14 连接寄存器(LR)
R15 程序计数器(PC)
-------------------------------------------------------------------------------------------------------------------------------------
xPSR 状态字寄存器(三合一)
--------------------------------------
PRIMASK
BASERPI 中断屏蔽寄存器s 特殊功能寄存器s
FAULTMASK
--------------------------------------
CONTROL 控制寄存器
-------------------------------------------------------------------------------------------------------------------------------------
说明:1、通常在调用并进入一个子程序后,为保证子程序运行中不影响调用程序所使用的寄存器内容,第一件事就是把寄存器的值先PUSH
如堆栈中,并在子程序退出前再将堆栈中保存的值POP到原来的寄存器,以回复调用程序寄存器原有的内容。
2、PC的第零位LSB用于指示当前的指令环境为何种状态 LSB = 0 表示为ARM状态,LSB = 1表示为Thumb状态。因为Cortex-M3中的
指令是隶属于Thumb-2指令集,且至少是半字对齐的,所以PC的LSB总是读回0.然而在编写分支指令时,无论是直接写PC的值还是
使用分支执行,都必须保证加载到PC的数值是奇数LSB = 1,用以表明当前指令在Thumb状态下执行。
3、因为Cortex-M3内部使用了流水线,读取到PC内容是返回的值是当前指令的地址+4。
4、特殊功能寄存器
1) 程序状态字寄存器:(PSR或XPSR)
①应用程序PSR:占据第27~31位
N ALU的运算结果为负,N= 1,否则N = 0;
Z ALU的运算结果为0,则Z = 0,否则 Z = 1;
C ALU运算存在仅为错位,C =1,否则 C = 0;
V ALU运算结果已出,V = 1;否则 V = 0;
Q ALU运算结果饱和溢出,Q = 1;否则 Q = 0;
②中断号PSR(IPSR);占据0~8位
Exception Number = 0 :表示基础级别的线程上下文,无被激活异常。
Exception Number = n :表示向量表位置 n 处的异常发生,例如:n = 2 表示 NMI 非屏蔽中断,n = 15表示 SysTick中断请求,
n = 16 + m表示中断号 m INTISR[m].
③执行PSR(EPSR)占据10~15,24~26位
IT/ICI标志位:包含IF-THEN指令的基础条件骂和支持中断继续执行的相关信息。
LDM/STM指令可以利用ICI(interrupt-continuable information)继续执行被中断的程序,但包含在IT指令块中的LDM/STM指令无此功能,因为IT与ICI占用相同的比特位。
T标志位:指示Thumb 工作状态,对于Cortex-M3 微处理器T=1恒成立;T = 0将可能发生异常,因为Cortex-M3无法执行ARM指令。
EPSR可以使用MRS读取,但只能被间接修改。当使用三合一访问时,应使用名字xPSR或者PSR
2)中断屏蔽寄存器(PRIMASK,FAULTMASK和BASEPRI)
这三个寄存器用于控制异常的使能和除能。
对于时间关键任务而言,PRIMASK,和BASEPRI对于暂时关闭中断是非常重要的。而FAULTMASK则可以被操作系统用于暂时关闭Fault处理机能,这种处理在某个 任务崩溃时可能需要。因为在任务崩溃时,尝尝伴随一大堆Faults。在系统料理“后事”时,通常不需要相应这些Fault。总之FAULTMASK就是专门留给OS用的。
-----------------------------------------------------------------------------------------------------------------------------------
名称 - 功能描述
----------------------------------------------------------------------------------------------------------------------------------
PRIMASK - 这是个只有1位的寄存器,当他置一时,就关闭所有可屏蔽的异常,只剩下NMI和
- 硬fault可以相应。它的缺省值是0,表示没有关中断。
----------------------------------------------------------------------------------------------------------------------------------
FAULTMASK - 只是个只有1位的寄存器。当它置一时,周NMI才能相应,所有其他的异常,包括
- 中断和fault,统统失效。它的缺省值也是0,表示没有关异常。
---------------------------------------------------------------------------------------------------------------------------------
BASEPRI - 这个寄存器最多有9位(由优先级决定的)。它定义了被屏蔽优先级的阈值。当它
- 被设置成某个值后,所有优先级号大于等于此值的中断都被关闭(优先级越大,优
- 先级越低)。但若设成成0,则不关闭任何中断,0也是缺省值。
---------------------------------------------------------------------------------------------------------------------------------
说明:1、只有在特权级别下,才允许访问这3个寄存器。
2、为了快速开关中断Cortex-M3还专门设置了一条CPS指令。该指令有四种用法:
CPSID I ;PRIMASK = 1 ; 关中断
CPSIE I ;PRIMASK = 0 ;开中断
CPSID F ;FAULTMASK = 1;开异常
CPSID F ;FAULTMASK = 0 ;关异常
3)控制寄存器(CONTROL)
控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针
-------------------------------------------------------------------------------------------------------------------------------
位 - 功能描述
------------------------------------------------------------------------------------------------------------------------------
- 堆栈指针选择
CONTROL【1】 - 0 表示选择主堆栈指针 MSP(复位后缺省值)
- 1 表示选择进程堆栈指针 PSP。
- 在线程或基础级,可以使用PSP。在 Handler模式下只允许使用MSP,所以此时
- 不得往该位写1.
-----------------------------------------------------------------------------------------------------------------------------
CONTROL【0】 - 0 表示特权级的线程模式
- 1 表示用户级的线程模式。
- 注意 Handler模式永远都是特权级的
-----------------------------------------------------------------------------------------------------------------------------
说明:1、在Cortex-M3的Handler模式中,CONTROL【1】总是为 0 。在线程模式则 0 (特权级)1(用户级) 均可 。
2、仅当处于特权级下才能操作CONTROL【0】。一旦进入了用户级,唯一返回特权级的途径,就是触发中断
异常,再由中断服务例程改写该位。
CONTROL 寄存器也是通过MRS 和 MSR 指令来操作的
MSR R0,CONTROL //读
MSR CONTROL,R0 //写