初识STM32
STM32构成
内核通过总线与各种外部器件进行通信。
内核由arm设计,外设由各家芯片厂商设计。
这些内容了解就行。
以stm32f103为例,简单说明一下系统构成。其中驱动单元有 4
个,被动单元也有 4 个。
以stm32f4系列为例,简单说明一下系统构成。
这两幅图是一个意思
STM32F407主系统是一款32位,基于多种AHB总线矩阵构成的,以此来实现多种主控总线的互联互通。
● 八条主控总线:
— Cortex™-M4F 内核 I 总线、D 总线和 S 总线
— DMA1 存储器总线
— DMA2 存储器总线
— DMA2 外设总线
— 以太网 DMA 总线
— USB OTG HS DMA 总线
● 七条被控总线:
内部 Flash ICode 总线
内部 Flash DCode 总线
主要内部 SRAM1 (112 KB)
辅助内部 SRAM2 (16 KB)
辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx STM32F43xxx 器件)
AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)
AHB2 外设
FSMC
通过主控总线与被控总线与总线矩阵的互联互通,实现主控总线对被控总线上数据的访问,以此实现M4内核对外部代码指令和数据的执行和计算。
主控总线
S0:I 总线
此总线用于将 Cortex™-M4F 内核的指令总线连接到总线矩阵。内核通过此总线获取指令。 此总线访问的对象是包含代码的存储器(内部 Flash/SRAM 或通过 FSMC 的外部存储器)。
S1:D 总线
此总线用于将 Cortex™-M4F 数据总线和 64 KB CCM 数据 RAM 连接到总线矩阵。内核通过 此总线进行立即数加载和调试访问。此总线访问的对象是包含代码或数据的存储器(内部Flash 或通过 FSMC 的外部存储器)。
S2:S 总线
此总线用于将 Cortex™-M4F 内核的系统总线连接到总线矩阵。此总线用于访问位于外设 或 SRAM 中的数据。也可通过此总线获取指令(效率低于 ICode)。此总线访问的对象是 112 KB、64 KB 和 16 KB 的内部 SRAM、包括 APB 外设在内的 AHB1 外设、AHB2 外设以 及通过 FSMC 的外部存储器。
S3、S4:DMA 存储器总线
此总线用于将 DMA 存储器总线主接口连接到总线矩阵。DMA 通过此总线来执行存储器数据 的传入和传出。此总线访问的对象是数据存储器:内部 SRAM(112 KB、64 KB、16 KB) 以及通过 FSMC 的外部存储器。
S5:DMA 外设总线
此总线用于将 DMA 外设主总线接口连接到总线矩阵。DMA 通过此总线访问 AHB 外设或执 行存储器间的数据传输。此总线访问的对象是 AHB 和 APB 外设以及数据存储器:内部 SRAM 以及通过 FSMC 的外部存储器。
S6:以太网 DMA 总线
此总线用于将以太网 DMA 主接口连接到总线矩阵。以太网 DMA 通过此总线向存储器存取 数据。此总线访问的对象是数据存储器:内部 SRAM(112 KB、64 KB 和 16 KB)以及通过 FSMC 的外部存储器。
这里附带说一句,其实M4内核在访问FLASH上的软件是分成两个部分进行的,分别是:I总线和S总线,一个访问指令,一个访问数据,这种将指令和数据分开的结构称之为哈佛结构,反之使用一条总线访问数据和指令则称之为冯诺依曼结构,至于孰优孰劣则取决于嵌入式平台应用场景了以及处理复杂程度和系统的实时性。
S7:USB OTG HS DMA 总线
此总线用于将 USB OTG HS DMA 主接口连接到总线矩阵。USB OTG DMA 通过此总线向存储 器加载/存储数据。此总线访问的对象是数据存储器:内部 SRAM(112 KB、64 KB 和 16 KB) 以及通过 FSMC 的外部存储器。
被控总线
AHB/APB 总线桥
借助两个 AHB/APB 总线桥 APB1 和 APB2,可在 AHB 总线与两个 APB 总线之间实现完全 同步的连接,从而灵活选择外设频率。
AHB,是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种“系统总线”。AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。AHB系统由主模块、从模块和基础结构(Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。
APB,是Advanced Peripheral Bus的缩写,这是一种外围总线。APB主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像 AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。再往下,APB2负责AD,I/O,高级TIM,串口1;APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
这两者都是总线,符合AMBA规范。AHB为系统资源总线,使用系统最高时钟,主要应用在主屏较高的外设资源通信上,例如以太网,USB等通信协议;而APB则是经过系统时钟分频后总线,主要面向外接设备总线通信,例如:IIC,SPI,UART,AD,TIM等。通过芯片手册中描述的系统时钟树便可以清晰了解到这种结构。
外设总线
上一节中提到外设总线挂载APBX的系统总线上,外设总线根据传输类型来区分主要分为:
1,并行传输
通过多根数据线在一个时钟周期内,同时访问多个寄存器地址,若数据线有8根,那么单次操作则可以获取1个字节的数据长度。较为典型的外设通信协议有:FMSC(静态储存控制器),主要用来外接SDRAM。
2,串行协议
串行通信协议实际上将来自系统总线的并行数据进行拆分,将一个字节分成8位传输,以此实现串口通信。目前ARM外设总线扩展基本都是基于串口协议。串口协议相对于并行传输速度慢,但是物理引脚少,易于封装以及外设接口的通用性收到广泛应用。我们常说的SPI,IIC,UART和CAN等通信都是串行通信。
我们在熟悉ARM系统总线后,若是要提高开发产品的能力,还必须学习外部总线扩展协议,无论是SOC还是MCU始终只是一个芯片,离开了外设他也将毫无价值。我们也必须清楚以上几个常用的串行协议在电平时序和电平电压上及电路抗干扰特点,根据应用场景选择最适合且成本最低的通信方式。关于以上几个常用的串行通信做个简单归纳则为:
① IIC应用场景
多主多从,片上通信(抗干扰差),速度低,端口少(2PIN),半双工异步收发。
② UART(RS232 485 645…)
一主多从,片外通信(抗干扰一般,可以接线),距离一般,端口少(2PIN),全双工同步收发。
③ SPI
一主多从,片内通信(抗干扰较IIC强些而已),速度快(在IIC基础上独立的片选来控制启停,而IIC需要一个ACK电平,双向收发IO),距离短,端口多(较IIC增加两个端口)
④CAN
多主模式(加入了仲裁优先级,光这一点秒杀上述所有协议),片外通信(可外部接线50米来着),距离远(与采用12V差分信号RS485一样),速度快(多主模式下的优势),端口少,成本贵(每个CAN节点均配备独立的CAN控制器和稍复杂的协议驱动)
储存器组织结构
总线结构,总线只不过是人们对架构设计时候虚构出来的通道而已,设计总线的目的只不过是对一整个系统中海量的数据设计一个相对安全有序的通道,但是这些数据最终是要保存在硬件设备上的,依托的这个设备就是我们非常常见的储存器了,这也是所有芯片运行最基本硬件了。
储存映射
存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOT,BLOCK等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLASH的情况下可进行自定义。
Cortex-M4支持4GB的存储空间,它的存储系统采用统一编址的方式; 程序存储器、数据存储器、寄存器被组织在4GB的线性地址空间内,以小端格式(little-endian)存放。由于Cortex-M3是32位的内核,因此其PC指针可以指向2^32=4G的地址空间,也就是0x0000_0000——0xFFFF_FFFF这一大块空间。
上面描述了两个点:
①统一编址:将IO映射到内存中的架构(区别于51等的独立编码而言),目前主流的大型计算机多使用这种编码方式,其优点是在设计芯片时候可以根据储存大小很容易扩充IO管脚数量,缺点嘛就是浪费了这一块内存了,还有就是访问IO实际上要访问一遍储存,比较消耗时间不适用于小型系统。
②地址总线:M4内核支持16,32,64,128位寻址,而STM32F4则设计为32位系统,意思是他们地址总线有32根,单个周期内能够获取4个字节数据,同时STM32储存器地址被映射为4字节长度表达,所以这款芯片最长寻址地址为:0xff ff ff ff,也就是4GB空间了。
这里用STM32F407ZGT6图解