ARM Cortex 系列是新一代的,一个为广泛的技术需求提供标准架构的处理器。与其他的ARM 处理器不同,Cortex 系列是一个完整的处理器核心,一个标准的CPU 和系统架构。
Cortex-M3的4Gbyte地址空间被分成明确定义的区域:代码区,SRAM区,外设区和系统外设区。与ARM7不同的是,Cortex-M3是一个哈佛结构的处理器,所以有多条总线,允许执行并行操作,提高其整体性能。与早期的ARM架构不同,Cortex 系列允许未对齐的数据访问。这将确保最有效地利用内部SRAM。Cortex 系列还有一个称为位带的方法,支持在两个1Mbyte 的内存区域里进行位设置和清除。这样可以有效地访问位于SRAM存储器的外设寄存器和标志,而不需要一个完整的布尔处理器。
Cortex CPU 是一个有加载和存储体系结构的RISC处理器。为了执行数据处理指令,操作数必须被加载到一个中央寄存器,数据操作必须在这些寄存器上执行,并且把结果回存到内存上。
STM32的核心是Cortex-M3 处理器。Cortex M3 处理器是一个标准化的微控制器,包括32 位CPU,总线结构,嵌套的中断单元,调试系统和标准内存布局。
M3处理器支持两种处理器的工作模式,还支持两级特权操作。
两种工作模式: 处理模式 handler mode 线程模式 thread mode。
引入两个模式的本意,在于区别普通应用程序代码和异常服务程序,包括中断服务程序代码
M3的特权分级: 特权级 用户级,可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。这也是一个基本的安全模型。当处理器运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级,但是异常服务程序必须在特权模式下执行。复位后,处理器默认进入线程模式,特权级访问。在特权级下,程序可以访问所有的存储器空间(除非被MPU设置禁用),并且可以执行所有指令。(特权级进入用户级后就只能处理在用户级的状态下能做的功能,想要回到特权级只有触发异常)在非特权模式下某些指令将被禁用(如允许访问xPSR 和它的别名的MRS 和MSR指令。
在 51 单片机的程序开发中,我们直接配置 51 单片机的寄存器,控制芯片的工作方式,如中断,定时器等。配置的时候,我们常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置1 还是置 0。这些都是很琐碎的、 机械的工作,因为 51 单片机的软件相对来说较简单,而且资源很有限,所以可以直接配置寄存器的方式来开发。 STM32 库是由 ST 公司针对 STM32 提供的函数接口,即 API(Application Program Interface),开发者可调用这些函数接口来配置 STM32 的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速,易于阅读,维护成本低等优点。
库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。
CMSIS 为所有的Cortex 微控制器提供业界标准的驱动程序级别的接口。CMSIS 的目标只是使软件驱动程序和组件与硬件的交互变得尽量简单。这使得节省了开发时间,可以集中精力建设最好的应用程序代码。
早期的ARM7和ARM9的CPU只能在SRAM和外设存储器位置上通过使用AND和OR指令执行位操作。这需要一个读-修改-写操作,在设置和清除位需要的周期数量和对每一个位操作所需的整体代码空间方面来说,这是很昂贵的。
为了克服这个限制,将有可能引入一个专用的位设置和清除指令,或者一个完整的布尔处理器,但是这将会增加Cortex CPU 的大小和复杂性。取而代之的是,一个叫位带的技术允许直接位操作外设区和SRAM区内存空间,而不需要其他任何特别指令的介入。Cortex存储器映射中的位寻址区域是由位带区(容量高达1M byte的实际存储器或外设寄存器)和占用内存映射32Mbyte 的位带别名区组成的。位带技术把位带区域中的一个位映射到别名区中的一个字地址。因此,通过设置和清除别名区字地址,我们可以设置和清除真正内存中的位。(不同于51单片机,这些位带对应的都是一位的地址,没有字节地址,所以不需要类似51中的sbit来区分是字节还是位地址)
计算别名地址的公式如下:
位带别名区的地址 = 位带别名区的基地址+位带字偏移
位带字偏移 = 位带基地址偏移*32+位号*4
这比一开始看起来要容易得多。对于一个实际的例子,GPIO 输出数据寄存器被设计为可以设置和清除单个IO线。端口B 输出寄存器的物理地址是0x40010C0C。在这个例子中,我们可以使用上面的公式来设置和清除这个字的第8位。
字地址 =0x40010C0C
外设位带基地址 =0x40000000
外设位带别名基地址 = 0x42000000
位带基地址偏移 =0x40010C0C-0x40000000=10C0C
位带字偏移 = (0x10C0C*32)+(8*4)=0x2181A0
位别名地址 =0x42000000+0x2181A0=0x422181A0
现在,我们可以用下面的C代码来创建一个指针指向这个地址:
#define PortBbit8 (*((volatile unsigned long *)0x422181A0 ))然后,可以使用这个指针来设置和清除IO端口位:
PortBbit8 = 1; //led on
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |