STM32结构和原理
本节有关内容可以详细参见《STM32F4xx中文参考手册》 。
1. STM32架构
普林斯顿(冯·诺伊曼)架构
普林斯顿(冯·诺伊曼结构) 组成部分:输入设备、输出设备、存储单元、算数逻辑单元、控制单元。
哈佛结构
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问,目的是为了减轻程序运行时的访存瓶颈。
重要特点:指令(代码)和数据存储分开
所以一般会有指令I(Instruction)总线和数据D(data)总线的之分。
STM32F4型号架构
STM32F4x架构 2. STM32外设
如何组装一台电脑?
首先我们得先拥有一块主板(包含了我们的CPU)。
然后,我们得有显示屏、键盘、扬声器。我们还得装显卡、声卡、无线网卡……
对于STM32等微处理器,显示屏、键盘、无线上网不是必须的。
未了实现不同的功能,我们的STM32需要完成一些基本功能,例如:
引出一些引脚,我可以控制是高电平还是低电平 添加一个USB串口,可以与电脑通信 一个定时器,在我需要的时候进行计时功能 …… 如何制造一个STM32?
采用什么CPU?ARM Cortex系列中央处理器。
配置哪些硬件?由意法半导体为我们完成并封装到STM32中。
外设,类似于组装电脑时的无线网卡、显卡、声卡等硬件。
那么如果我想自定义硬件(外设)怎么办?
使用硬件描述语言生成半定制电路。可以使用FPGA。
如何使用代码来操作外设?
如果使用显卡,那么我需要显卡驱动。
如果使用摄像头,那么我需要摄像头驱动。
如果使用Wifi,那么我需要网卡驱动……
如果使用外设,我需要外设驱动硬件抽象层 (Hardware Abstraction Layer,HAL)。
应尽抽象层将硬件方面的不同抽离操作系统的核心,核心模式的代码就不必因为硬件的不同而需要修改。因此硬件抽象层可加大软件的移植性。
硬件抽象层底层逻辑
历史上,总共有两种办法来操作这些设备。
这些硬件外设设备其本质都是为了输入、输出,因此它们都是输入输出设备(IO设备,Input,Ouput)。
第一种方法 ,是设计专门的汇编命令。如x86汇编就保留了专门用来输入输出的指令。但是随着现代计算机中出现了越来越多不同的新设备,这种设计专门指令的方法也开始落伍。
第二种方法 ,叫做内存地址映射 IO(Memory Mapped IO)。这种方法也是大部分现代计算机所采用的输入输出的办法。
让我们回到硬件抽象层的概念。
硬件抽象层还是没有接触最底层的原理,因为硬件抽象层毕竟也是用代码写出来的。所以如果我想写硬件抽象层怎么办?
——寄存器操作
把寄存器当成电闸开关。当我想让一个房间的电灯亮起来,只需要拨动开关;类似的,当我要启用某一种功能,比如说让STM32的某一个引脚变成高电平,我只需要将寄存器的某一位设置为1。
或者说我可以用寄存器表示一种模式或功能。假设我的房间的灯有三种颜色,红、绿、蓝。我用00表示红,01表示绿,10表示蓝。
STM32的寄存器主要存在于两种地方: ARM Cortex内核里的寄存器 。我们不需要显示地去操作它(除非编写汇编语言)。这些寄存器是和C语言编译完成之后的汇编语言较为相关。 挂接于总线上的寄存器 。
假设系统有一块32kB的内存(位于0x0000 ~ 0x8000的位置)。这意味着不能访问0x9000的位置么?不是的。32位机的寻址能力是2^32。
我们可以把寄存器对应到一个空闲的地址上,然后在C语言中使用指针的方式进行读写!
这样,寄存器的表现就仿佛是一块内存,同时,寄存器的具体值又定义了硬件外设的行为。我们可以通过改变寄存器中的值,来控制和访问外设。
这就是内存地址映射IO的方法。
现在假设一个控制LED灯点亮的寄存器,被映射到了0x9000的地址上,寄存器的最低位(第0位)位1的时候,LED灯可以被点亮。
1
2
3
4
#define REG_ADDRESS 0x9000
volatile uint32_t * peripheral_register = REG_ADDRESS ; // Volatile 关键字:防止编译器优化
* peripheral_register |= 0x0001 ;
STM32中外设众多,没有每个外设寄存器与地址的直接对应表,很多时候这些映射地址需要经过复杂的计算才能得出。而且,STM32还有位带操作等概念。
注意
不建议直接操作寄存器控制外设。请使用现存的库函数或硬件抽象层。 上述操作寄存器的方式只是一个例子,不代表真实可用的代码。 STM32位带操作可以将寄存器的每个bit膨胀为4字节,但仍是最低位有效。这个映射机制叫做位带操作。 3. STM32时钟树
时钟
时钟信号就是计算机的脉搏,寄存器等时序逻辑器件依赖时钟的上升沿和下降沿运作。
时钟频率越高,计算机的运算能力越强,功耗也越大。为了平衡运算能力与工号,STM32设计了非常复杂的时钟系统。
时钟的作用:同步和时间测量。
同步 :时钟信号用于同步计算机中所有组件的操作,包括CPU、内存、输入/输出设备等。通过提供一致的时间基准,时钟确保了不同组件之间的协调和有序运行。
时间测量 :时钟提供了时间测量的基础。通过计数时钟周期,计算机可以测量和记录时间,从而支持各种时间相关功能,如时间戳、计时器和计数器等。
STM32时钟源
STM32的时钟源总共有四种,低速外部时钟,低速内部时钟,高速外部时钟,告诉内部时钟。内部时钟一般较频率较低且较不稳定,
外部时钟使用晶体振荡器,会更为稳定。STM32F4x时钟树
常用概念
分频器(DIV):将时钟频率除以一定的倍数。
PLL倍频锁相环(倍频器):将时钟频率乘以一定的倍数。
通过复杂的时钟配置,最终可以确定各个模块的时钟频率。
4. 通用输入输出GPIO
GPIO(General Purpose Input Ouput, 通用目的输入输出)外设是STM32最基本的外设之一。学习GPIO是学习其他一切外设的基础。
GPIO分为端口(Port)若干,编号为ABCD……
每个端口分别对应16个引脚(Pin)
例如:GPIOA Pin10, GPIOB Pin 2, GPIOC Pin3 ……
对于每个GPIOx, 都有9个寄存器控制。
分别为:
GPIO 端口模式寄存器 、
GPIO 端口输出类型寄存器 、
GPIO 端口输出速度寄存器 、
GPIO 端口上拉/下拉寄存器 、
GPIO 端口输入数据寄存器 、
GPIO 端口输出数据寄存器 、
GPIO 端口置位/复位寄存器 、
GPIO 复用功能低位寄存器 、
GPIO 复用功能高位寄存器 。
GPIO原理图 有关寄存器的详细用法和资料,请查阅《STM32F4xx中文参考手册》 。