STM32G0系列MCU内的Cortex-M0+处理器和核心外设结构,如图2.1所示。
图2.1 Cortex-M0+处理器和核心外设结构
该处理器是一款入门级的32位Arm Cortex处理器,专为广泛的嵌入式应用而设计。Cortex-M0+处理器基于对面积和功耗进行充分优化的32位处理器内核构建,并具有两级流水线的冯·诺依曼架构。该处理器通过一个小的但是功能强大的指令集和广泛优化的设计来提供出色的能源效率,从而提供包括单周期乘法器在内的高端处理硬件。
Cortex-M0+处理器实现了Armv6-M架构,该架构基于16位的Thumb指令集并包含Thumb-2技术。这样,该处理器就提供了现代32位架构所期望的出色性能,并且具有比其他8位和16位处理器更高的代码密度。
Cortex-M0+处理器紧耦合集成了可配置的嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC),以提供最好的中断性能。其特性包括:
(1)提供不可屏蔽中断(Non-Maskable Interrupt,NMI);
(2)提供零抖动中断选项;
(3)提供4个中断优先级。
处理器内核和NVIC的紧密集成提供了快速执行中断服务程序(Interrupt Service Routines,ISR)的能力,从而显著减少了中断等待时间。这是通过寄存器的硬件堆栈以及放弃并重新启动多个加载和多个保存操作的能力来实现的。中断句柄不要求任何汇编程序封装代码,从而消除了ISR的代码开销。当从一个ISR切换到另一个ISR时,尾链优化还可以显著减少开销。
为了优化低功耗设计,NVIC与休眠模式集成在一起,该模式包括深度休眠功能,该功能可使整个器件快速断电。
Cortex-M0+处理器核是Cortex-M0+最核心的功能部件之一,它负责处理数据,包含内部寄存器、算术逻辑单元(ALU)、数据通路和控制逻辑。
1.处理器核的主要功能
其主要功能包括:
(1)使用Thumb-2技术的Thumb指令集;
(2)用户模式和特权模式执行;
(3)与Cortex-M系列处理器向上兼容的工具和二进制文件;
(4)集成超低功耗休眠模式;
(5)高效的代码执行可以降低处理器时钟或增加休眠时间;
(6)用于对安全有严格要求的存储器保护单元(Memory Protection Unit,MPU);
(7)低延迟、高速外设I/O端口;
(8)向量表偏移寄存器;
(9)丰富的调试功能。
2.处理器核中的流水线
此外,Cortex-M0+处理器核内提供了两级流水线(Cortex-M0、Cortex-M3和Cortex-M4具有三级流水线)。这个两级流水线减少了处理器核响应时间和功耗。第一级流水线完成取指令(简称取指)和预译码,第二级流水线完成主译码和执行,如图2.2所示。
注: 当以前的Cortex-M处理器核(具有三级流水线)执行条件分支时,下一条指令不再有效。这就意味着每次有分支的时候都必须刷新流水线。通过转移到两级流水线,可以最大限度地减少对Flash存储器的访问并降低功耗。通常,Flash存储器的功耗占据整个MCU功耗的绝大部分。因此,减少访问Flash存储器的次数将对降低总功耗产生直接影响。
大多数Armv6-M架构指令的长度是16位。只有6条32位指令,其中大多数是控制指令,很少使用。但是,用于调用子程序的分支和链接指令也是32位的,以便支持该指令与指向要执行下一条指令的标号之间的较大偏移。
理想情况下,每两个16位指令只有一个32位访问,因此每条指令的访存次数更少。在图2.2中,在第2个时钟周期没有发生取指操作。当指令 N 为加载/保存指令时,AHB-Lite(Advanced Hight-performance Bus Lite,高级高性能总线简化)端口可用于执行数据访问。
图2.2 Cortex-M0+处理器核的两级流水线
下面通过一个实例,说明Cortex-M0+处理器核采用两级流水线的优势,如代码清单2.1所示。
代码清单2.1 一段运行在Cortex-M0上的代码
如图2.3所示,由于采用了两级流水线,所以浪费更少的预取指令。
(1)在第1个时钟周期,处理器加载第0条指令和一条无条件分支指令。
(2)在第2个时钟周期,处理器执行第0条指令。
(3)在第3个时钟周期,处理器在取出第1条指令和第2条指令的同时,执行分支指令。
(4)在第4个时钟周期,处理器丢弃第1条指令和第2条指令,并取出第 N 条指令和第 N +1条指令。
图2.3 Cortex-M0+处理器执行指令
前面提到,Cortex-M0、Cortex-M3和Cortex-M4具有三级流水线,即取指、译码和执行指令。分支影子指令的数量更多:最多达到4条16位指令。
3.处理器核的访问方式
如图2.4所示,Cortex-M0+既没有缓存,也没有内部RAM。因此,任何取指交易都会指向AHB-Lite端口,并且任何数据访问都会指向AHB-Lite端口或单周期I/O端口。
图2.4 Cortex-M0+架构
注: STM32G0在处理器外实现了片上系统级(System on Chip,SoC)的缓存。
AHB-Lite主端口连接到总线矩阵,使得处理器可以访问存储器和外设。由于交易是在AHB-Lite端口上进行流水处理的,因此最佳的吞吐量为每个时钟周期传输32位数据或指令,同时保持最小的两个时钟周期延迟。
Cortex-M0+还具有单周期I/O端口,使处理器能够以一个时钟的延迟访问数据。
一个外部译码逻辑决定将数据访问指向这个端口的地址范围。在STM32G0系列MCU中,单周期I/O端口用于访问通用I/O(General-Purpose Input & Output,GPIO)端口寄存器,从而使这些端口能够以处理器频率工作。
当加载或保存指令的地址未落入单周期I/O端口地址范围内时,将在AHB-Lite端口上执行交易,从而防止处理器在同一时钟取指。
当加载或保存指令的地址落入单周期I/O端口地址范围内时,在该端口上执行交易,并可能与取指同时进行。
Cortex-M0+处理器使用AMBA技术提供单个系统级端口,以提供高速、低延迟的存储器访问。
Cortex-M0+处理器具有一个可选的MPU,它可以提供细粒度的存储器控制、使得应用程序可以使用多个特权级,并根据任务分割和保护代码、数据和堆栈。在许多嵌入式应用(如汽车系统)中,此类要求变得非常重要。
Cortex-M0+处理器实现了完整的硬件调试解决方案,并具有广泛的硬件断点和观察点选项。通过一个具有两个引脚的串行线调试(Serial Wire Debug,SWD)端口,该系统可提供对处理器、存储器和外设的可视性,非常适合微控制器和其他小封装器件。
核心外设是与Cortex-M0+处理器核紧密耦合的外部功能部件。
1.嵌套向量中断控制器
NVIC是一个嵌入的中断控制器,它提供了32个可屏蔽的中断通道和4个可编程的优先级控制,支持低延迟的异常和中断处理。此外,它还提供了电源管理控制功能。
2.系统控制块
系统控制块(System Control Block,SCB)是程序员与处理器的模型接口。它提供系统的实现信息和系统控制,包括配置、控制以及系统异常的报告。
3.系统定时器
系统定时器(SysTick)是一个24位的递减计数器。将该定时器用作一个实时操作系统(Real Time Operating System,RTOS)滴答定时器或作为一个简单的计数器。
4.存储器保护单元
存储器保护单元(Memory Protection Unit,MPU)通过定义不同存储器区域的存储属性来提高系统可靠性。它提供最多8个不同的区域以及一个可选的预定义背景区域。
5.I/O端口
I/O端口提供单周期加载,并保存到紧耦合的外设。
思考与练习2.1:请说明Cortex-M0+处理器核的主要性能参数。
思考与练习2.2:请说明Cortex-M0+处理器核采用的流水线结构。
思考与练习2.3:Cortex-M0+处理器由哪两部分组成,它们各自的主要功能是什么?