STM32:就是32位的微控制器单片机。可以很容易地控制I/o口的电平的高低。
ST推出有5大类,16个系列,1000多个型号的Cortex 内核微控制器。
大类 | 系列 |
主流MCU | G0,G4,F0,F1,F3 |
高性能MCU | F2,F4,F7,H7 |
低功耗MCU | L0,L1,L4,L4+,L5 |
无线MCU | WB |
微处理器MPU | MP1(用在linux上) |
以一款型号命名举例:
关于指令集架构与内核的对应:
指令集架构都是用的ARM公司的精简指令集(RISC)与之对应的是英特尔公司的复杂指令集。
指令集分为:
ARM: 32位,效率高 (在多核上)
Thumb: 16位,有限存储空间可以存放更多代码
Thumb-2:兼有16 位和 32 位指令,ARMv6T2 和 ARMv7M体系。
STM32是属于Thumb-2指令集的MCU,其基于ARMv7架构。
如图上图注意:M3包含M0并且在M0基础加入Thumb2指令集。M4包含M3在其基础上包含了DSP(数字信号处理),浮点运算。
其次ST根据不同的场合推出不同的Corter内核系列。
1.取指单元:从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。
2.解码器:CPU根据存储器提取到的指令来决定其执行行为。
3.寄存器组:包括通用寄存器组和特殊功能寄存器。通用寄存器用来保存指令执行过程中临时存放的寄存器操作数和中间(或最终)的操作结果。
4.算术逻辑运算单元:能实现多组算术运算和逻辑运算的组合逻辑电路,简称ALU。是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算,如加减乘(不包括整数除法)。
5.存储器接口:存储器总线用于传输指令或数据。
6.中断控制:嵌套向量中断控制器 NVIC
7.流水线:3级流水线:取指,解码和执行
8.调试系统
下面在针对寄存器组于流水线具体进行介绍:
R0‐R12都是32位通用寄存器,用于数据操作。
R13作为堆栈指针SP。SP有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。 主堆栈指针( MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程) 进程堆栈指针( PSP):由用户的应用程序代码使用。 堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
R14:连接寄存器,当呼叫一个子程序时,由R14存储返回地址
R15:程序计数寄存器。指向当前的程序地址。如果修改它的值,就能改变程序的执行流。
什么是三级流水线:就是取值,解码,执行。
当指令N执行取指时接着解码。同时指令N+1就会取指的操作。当指令N到执行时。指令N+1就会解码。指令N+2就会取指。这样大大提高效率。
执行一条分支指令或直接修改PC而发生跳转时, ARM内核有可能会清空流水线,而需要重新读取指令。 即使产生了一个中断,一条处于“执行”阶段的指令也将会完成。流水线里其他指令将会被放弃,而处理器将从向量表的适当入口开始填充流水线。 不论是执行16位指令还是32位指令,读取PC时,会返回当前指令地址+4的值。
内核都是ARM公司设计的。而MCU厂商购买了 ARM公司内核架构基础上加入总线,基本外设,时钟,存储器,I/o。从而设计出各种各样的MCU芯片。
查看对应的手册:
如下就是如上完整的实物:
32位的内核:4G空间 32位CPU每次可以处理32个字位,即32bits=4Bytes。每一个字节都有一个地址,其中包含了8个字位。32位CPU有32根地址线,地址线决定了寻址范围的能力。每一根线都决定0和1两个地址,那么两根线就会决定00,01,10,11这四个地址,依次类推,32根线总共会决定出2^32(4G)次方个位置。每一个位置都是1Byte,这是内存的基本单位,所以32位操作系统配32位CPU,理论上可以寻找4GB的地址。
各种外设挂载在总线的时钟图:
Cortex-M4在SRAM区和片上外设区都开有一个1MB的“位带区”和32MB的“位带别名区”。位带别名区的每个字(只有LSB有效)对应位带区的一个比特位。
如下:对位带别名区每个字的操作最终都变换成对位带区对应比特位的操作。
操作0x22000000地址相当于操作0x20000000的bit0。因为内核有硬件支持这种功能。
对位带别名区的访问操作,将原有的“读-改-写”做成一个硬件级别支持的原子操作,不能被中断打断。
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4) bit_band_base : 位带别名区的起始地址
byte_offset :包含目标比特位的字节在位带区的偏移值(字节数)
bit_number : 目标比特位在字节中的位置(0~7)
复位后从0x04取复位代码的起始地址。以及从地址0x00取堆栈指针。开始执行复位程序。
起始地址的值赋值给PC指针从起始地址开始执行。
当从FSMC启动时需要重新设置SYSCFG寄存器最低两位为10.
● 电路内部使用的寄存器 内部寄存器不能被外部电路或软件访问,只是为内部电路的实现存储功能或满足电路的时序要求,比如ALU中的累加器ACC、以及CPU中的通用寄存器R0~R12
● 充当内外部接口的寄存器 接口寄存器可以同时被内部电路和外部电路或软件访问,CPU中的寄存器就是其中一种,作为软硬件的接口,为广泛的通用编程用户所熟知,比如控制端口A输出高电平的GPIOA_BSRR。
举例:
把GPIOA_OSPEEDR寄存器的第0和第1位都设置为1。
库函数编程使用了大量的宏定义,并辅以众多结构体,对大量的寄存器操作代码进行严谨封装,使得代码可读性非常高。
I/o挂载在AHB1时钟时的各起始地址:
每个GPIO的寄存器有结构体表示并且顺序按地址的前后。MODER是第一个结构体成员。