Lecture4

STM32结构和原理

STM32结构和原理

本节有关内容可以详细参见《STM32F4xx中文参考手册》

1. STM32架构

普林斯顿(冯·诺伊曼)架构

/figures/lecture4/Von_Neumann_Architecture.svg.png
普林斯顿(冯·诺伊曼结构)

组成部分:输入设备、输出设备、存储单元、算数逻辑单元、控制单元。

哈佛结构

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问,目的是为了减轻程序运行时的访存瓶颈。

重要特点:指令(代码)和数据存储分开

所以一般会有指令I(Instruction)总线和数据D(data)总线的之分。

STM32F4型号架构

/figures/lecture4/stm32_arch.png
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还有位带操作等概念。

注意
  1. 不建议直接操作寄存器控制外设。请使用现存的库函数或硬件抽象层。
  2. 上述操作寄存器的方式只是一个例子,不代表真实可用的代码。
  3. STM32位带操作可以将寄存器的每个bit膨胀为4字节,但仍是最低位有效。这个映射机制叫做位带操作。

3. STM32时钟树

时钟

时钟信号就是计算机的脉搏,寄存器等时序逻辑器件依赖时钟的上升沿和下降沿运作。 时钟频率越高,计算机的运算能力越强,功耗也越大。为了平衡运算能力与工号,STM32设计了非常复杂的时钟系统。

时钟的作用:同步和时间测量。

同步:时钟信号用于同步计算机中所有组件的操作,包括CPU、内存、输入/输出设备等。通过提供一致的时间基准,时钟确保了不同组件之间的协调和有序运行。

时间测量:时钟提供了时间测量的基础。通过计数时钟周期,计算机可以测量和记录时间,从而支持各种时间相关功能,如时间戳、计时器和计数器等。

STM32时钟源

STM32的时钟源总共有四种,低速外部时钟,低速内部时钟,高速外部时钟,告诉内部时钟。内部时钟一般较频率较低且较不稳定, 外部时钟使用晶体振荡器,会更为稳定。

/figures/lecture4/%E6%97%B6%E9%92%9F%E6%A0%91.png
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 复用功能高位寄存器

/figures/lecture4/gpio.png
GPIO原理图
有关寄存器的详细用法和资料,请查阅《STM32F4xx中文参考手册》

0%