学习笔记(三)——Cortex-M3 - 黑夜里的黑喵

时间:2024-03-03 07:09:14

学习笔记(三)——Cortex-M3

一、Cortex-M3简介

1.1 ARM Cortex-M3

  业界对单片机的要求越来越高,硬件上要求更多的诸如以太网等外设,软件方面也要求更高的运算速度和更多的功能模块,在这个环境下,ARM Cortex-M3作为32位单片机诞生了。Cortex-M3有以下优势是的CM3在业界脱颖而出:

(1)性能强劲

(2)功耗低

(3)实时性好

(4)成本低

(5)开发和使用方便

  CM3是单片机(MCU)的CPU,完整的MCU还需要包括存储器、I/O、时钟、外设等配置。ARM公司只提供处理器的设计授权给各个半导体公司,让其自己设计芯片。ARM公司设计了很多种架构,在最新的版本中,内核架构变成三种款式:A,用于设计高性能系统;R,高端嵌入式系统;M,深度嵌入的单片机系统,认准实时性、低成本、低功耗、极速中断和高处理效率,CM3就是这个系列的典型代表。

  在指令集方面,ARM处理器一直支持两种形式上的独立的指令集,分别是32位ARM指令集和16位Thumb指令集。在程序执行过程中,处理器可以在两个指令集间切换。CM3使用的是Thumb-2指令集,这是Thumb指令集的超集,16位和32位指令并存,处理器也就不必再两个指令集间切换了。

  通过前述对CM3的了解,可以知道CM3适用于一些领域:

(1)低成本单片机

(2)汽车电子

(3)数据通信

(4)工业控制

1.2 CM3的结构

  CM3结构如图所示,采用哈佛结构,即指令总线和数据总线分开,取指和数据访问不冲突,提升了性能。CM3提供一个可选的MPU,同时还提供丰富的调试组件。

  CM3有R0-R15共16个寄存器组,都是32位的,R0-R12是通用寄存器,16位指令只能访问R0-R7,32位可以访问全部。R13是两个堆栈指针,包括MSP(主堆栈指针,用于操作系统内核和异常处理)和PSP(进程堆栈指针,用户程序代码使用),堆栈指针最低两位是0,堆栈总是4字节对齐的,CM3是向下堆栈,每次PUSH,堆栈指针SP自减4再存入数据。R14是连接寄存器,当呼叫一个子程序时,R14存储返回地址。R15为程序计数器,指向当前程序地址,改变它就可改变执行流。

  CM3还有一些特殊功能寄存器,包括xPSR(状态字寄存器)、PRICMASK(除能除了NMI(不可屏蔽中断)外所有中断)、FAULTMASK(纯那个所有除NMI的fault)、BASEPRI(除能某个优先级以下的中断)、CONTROL(定义特权状态,决定使用哪个堆栈指针)。特殊功能寄存器组通过MSR/MRS指令操作:

  (1)PSR又分为三个子状态寄存器,应用程序PSR、中断号PSR、执行PSR,可单独访问或组合访问,三合一访问时应使用名字“PSR”或者“xPSR”。

  (2)CONTROL有两个用途,定义特权级别和选择哪个堆栈指针。CONTROL[1],为0时选择MSP,为1时选择PSP,handler模式下总为0,线程模式中可以为0或者1,因此只有特权级线程模式下此位才可以写;CONTROL[0],为0时选择特权级线程模式,为1时选择用户级线程模式,仅在特权级操作时才允许写此位。

1.3 操作模式和特权级别

  CM3有两种操作模式和两级特权操作。两种模式分别是处理者模式和线程模式,两级特权分别为特权级和用户级。CM3运行主程序(线程模式)可以使用两种等级,处理者模式必须用特权级。特权级可以访问所有范围的寄存器(不包括MPU规定的禁地外)。特权程序一旦切换到用户级,想回到特权级就必须执行一条SVC(系统调用指令)触发SVC异常,然后由ISR接管,若批准则修改CONTROL寄存器,才能回到特权级。两级特权提高了可靠性。切换方式如图所示:

1.4 中断控制器NVIC 

  CM3在内核中集成了一个NVIC(嵌套向量中断控制器)提供以下功能:

(1)支持嵌套中断

(2)支持向量中断。响应一个中断后,自动定位一张向量表,根据中断号找出ISR入口地址去执行,大大减小中断延迟时间。

(3)支持动态优先级调整。可以在运行时改变中断优先级,若将运行中的中断实例提高优先级,又重新产生一个处于悬起中的中断,不会自己打断自己,没有重入(也即是一段代码在不同的内存区域重复执行,浪费内存)风险。

(4)中断延迟大大缩短。具体原因在后面简述。

(5)中断可屏蔽。可屏蔽优先级低于某个数值的中断也可以屏蔽所有中断。

1.5 存储器映射

  CM3支持4G存储空间,区域划分如图所示:

  CM3事先定义好了大致的存储器映射,通过外设寄存器映射到外设区,就可以通过访问内存的方式访问这些外设寄存器,提高了访问速度。处于最高地址是系统级存储区,把这些地址定死,为程序移植扫清了障碍。

1.6 总线接口

(1)两条指令存储区总线。负责对代码存储区的访问,I-code用于取指,D-code用于查表等操作,按最佳执行速度优化

(2)系统总线。负责访问内存和外设。

(3)私有外设总线。负责私有外设的访问,主要是调制组件。

1.7 存储器保护单元(MPU)

  MPU可以提高系统可靠性,最常见的是使用MPU保护系统本身的数据。

1.8 中断和异常

  CM3支持11种系统异常和240个外部中断输入。如图所示:

1.9 低功耗和高能效

  提供睡眠模式和深度睡眠模式,门数量的降低工作状态下电路的活动更少,降低了功耗。程序代码密度高,程序容量也可以变少,强大的性能减小了执行时间。

1.10 调试支持

  内核水平上提供了丰富的调试支持。

1.11复位序列

  复位后,CM3分别从0x0000,0000和0x0000,0004处取出MSP和PC的初始值,PC初始值是复位向量,从这个向量相应的地址处取指。