要学习一个MCU,首先要学习这个芯片的架构,比如这个芯片是32bit 的RSIC V还是哈佛架构,对于STM32F4,它采用ARMv7-ME架构,是32位处理器,哈佛结构,三级流水线,Thumb-2指令集,扩展的DSP指令和SIMD指令,单周期MAC,可选的单精度FPU,可选的MPU,可选的Debug$trace接口
可配置的NVIC,可配置的WIC(wakeup interrupt controller)
3套AHB-Lite总线接口
主系统由 32 位多层 AHB 总线矩阵构成,可实现以下部分的互连:
八条主控总线:
Cortex™-M4F 内核,Icode总线(I-bus,读取指令)Dcode总线(D-bus,访问数据),System总线(S-bus,内核系统总线)
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
每次芯片复位后,所有外设时钟都被关闭(SRAM 和 Flash 接口除外)。使用外设前,必须 在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟。
注意:对 APB 寄存器执行 16 位或 8 位访问时,该访问将转换为 32 位访问:总线桥将 16 位或 8 位数据复制后提供给 32 位向量。
存储器组织结构
程序存储器、数据存储器、寄存器和 I/O 端口排列在同一个顺序的 4 GB 地址空间内。
各字节按小端格式在存储器中编码。字中编号最低的字节被视为该字的最低有效字节,而编号最高的字节被视为最高有效字节。
可寻址的存储空间分为 8 个主要块,每个块为 512 MB。
嵌入式 SRAM
STM32F405xx/07xx 和 STM32F415xx/17xx 带有 4 KB 备份 SRAM和 192 KB 系统 SRAM。
系统 SRAM 可按字节、半字(16 位)或全字(32 位)访问。读写操作以 CPU 速度执行, 且等待周期为 0。系统 SRAM 分为三个块:
映射在地址 0x2000 0000 的 112 KB 和 16 KB 块,可供所有 AHB 主控总线访问。
在地址 0x1000 0000 映射的 64 KB 块,只能供 CPU 通过数据总线访问。
Flash
Flash 接口可管理 CPU 通过 AHB I-Code 和 D-Code 对 Flash 进行的访问。该接口可针对 Flash 执行擦除和编程操作,并实施读写保护机制。Flash 接口通过指令预取和缓存机制加速 代码执行
Flash 具有以下主要特性:
● 对于 STM32F40x 和 STM32F41x,容量高达 1 MB;
● 128 位宽数据读取
● 字节、半字、字和双字数据写入
● 扇区擦除与全部擦除
● 存储器组织结构
Flash 结构如下:
● 主存储器块,分为 4 个 16 KB 扇区、1 个 64 KB 扇区和 7 个 128 KB 扇区
● 系统存储器,器件在系统存储器自举模式下从该存储器启动
● 512 字节 OTP(一次性可编程),用于存储用户数据
OTP 区域还有 16 个额外字节,用于锁定对应的 OTP 数据块。
● 选项字节,用于配置读写保护、BOR 级别、软件/硬件看门狗以及器件处 于待机或停止模式下的复位。
● 低功耗模式
对比一个建立好的工程文件,对SRAM和ROM的默认配置如下
说明STM32F407系列主要用的ROM是4个16KB的扇区,SRAM用的是 112 KB 和 16 KB 的SRAM,同时也可以勾选 0x1000 0000 映射的 64 KB 区域,但是这一部分只能供CPU通过数据访问。
位段
Cortex™-M4F 存储器映射包括两个位段区域。这些区域将存储器别名区域中的每个字映射 到存储器位段区域中的相应位。在别名区域写入字时,相当于对位段区域的目标位执行读-修改-写操作。
在 STM32F4xx 器件中,外设寄存器和 SRAM 均映射到一个位段区域,这样可实现单个位段的 读写操作。这些操作仅适用于 Cortex™-M4F 访问,对于其它总线主接口(如 DMA)无效。
可通过一个映射公式说明别名区域中的每个字与位段区域中各个位之间的对应关系。映射公式为:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
其中:
— bit_word_addr 代表别名区域中将映射到目标位的字的地址
— bit_band_base 代表别名区域的起始地址
— byte_offset 代表目标位所在位段区域中的字节编号
— bit_number 代表目标位的位位置 (0-7)。
示例
下例说明如何将 SRAM 地址 0x20000300 处字节的位 2 映射到别名区域:
0x22006008 = 0x22000000 + (0x30032) + (24)
对地址 0x22006008 执行写操作相当于在 SRAM 地址 0x20000300 处字节的位 2 执行读-修 改-写操作。
对地址 0x22006008 执行读操作将返回 SRAM 地址 0x20000300 处字节的位 2 的值(0x01 表示位置位,0x00 表示位复位)。
自举配置
存储器采用固定的存储器映射,代码区域起始地址为 0x0000 0000(通过 ICode/DCode 总 线访问),而数据区域起始地址为 0x2000 0000(通过系统总线访问)。Cortex™-M4F CPU 始终通过 ICode 总线获取复位向量,这意味着只有代码区域(通常为 Flash)可以提供 自举空间。STM32F4xx 微控制器实施一种特殊机制,可以从其它存储器(如内部 SRAM) 进行自举。
在 STM32F4xx 中,可通过 BOOT[1:0] 引脚选择三种不同的自举模式
所以,一般情况下,我们板子上配置的都是BOOT0拉低,如果在调试时,则可以将BOOT0,BOOT1都拉高,以此来降低FLASH的擦写次数,提高寿命。
但是也要注意,如果器件从 SRAM 自举,在应用程序初始化代码中,需要使用 NVIC 异常及中断向量表和偏 移寄存器来重新分配 SRAM 中的向量表。
复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。复位后,用户可以通过设置 BOOT1 和 BOOT0 引脚来选择需要的自举模式。
BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。
器件退出待机模式时,还会对 BOOT 引脚重新采样。因此,当器件处于待机模式时,这些引 脚必须保持所需的自举模式配置。这样的启动延迟结束后,CPU 将从地址 0x0000 0000 获 取栈顶值,然后从始于 0x0000 0004 的自举存储器开始执行代码。
嵌入式自举程序
嵌入式自举程序模式用于通过以下串行接口重新编程 Flash:
● USART1(PA9/PA10)
● USART3(PB10/11 和 PC10/11)
● CAN2(PB5/13)
● USB OTG FS(PA11/12) 从设备模式(DFU:器件固件升级)。
USART 外设以内部 16 MHz 振荡器 (HSI) 频率运行,而 CAN 和 USB OTG FS 则需要相当 于 1 MHz 数倍(4 MHz 到 26 MHz 之间)的外部时钟 (HSE) 频率。
嵌入式自举程序代码位于系统存储器中,在芯片生产期间由 ST 编程。