全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn
野火视频教程优酷观看网址:http://i.youku.com/firege
本章参考资料:《STM32F4xx 中文参考手册》、《STM32F429xx数据手册》、
学习本章时,配合《STM32F4xx 中文参考手册》"存储器和总线架构"、"嵌入式FLASH接口"及"通用I/O(GPIO)"章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。
5.1 什么是寄存器
我们经常说寄存器,那么什么是寄存器?这是我们本章需要讲解的内容,在学习的过程中,大家带着这个疑问好好思考下,到最后看看大家能否用一句话给寄存器下一个定义。
5.2 STM32长啥样
我们开发板中使用的芯片是176pin的STM32F429IGT6,具体见图 51。这个就是我们接下来要学习的STM32,它讲带领我们进入嵌入式的殿堂。
芯片正面是丝印,ARM应该是表示该芯片使用的是ARM的内核,STM32F429IGT6是芯片型号,后面的字应该是跟生产批次相关,最下面的是ST的LOGO。
芯片四周是引脚,左下角的小圆点表示1脚,然后从1脚起按照逆时针的顺序排列(所有芯片的引脚顺序都是逆时针排列的)。开发板中把芯片的引脚引出来,连接到各种传感器上,然后在STM32上编程(实际就是通过程序控制这些引脚输出高电平或者低电平)来控制各种传感器工作,通过做实验的方式来学习STM32芯片的各个资源。开发板是一种评估板,板载资源非常丰富,引脚复用比较多,力求在一个板子上验证芯片的全部功能。
图 51 STM32F429IGT6 实物图
图 52 STM32F429IGT6正面引脚图
5.3 芯片里面有什么
我们看到的STM32芯片已经是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的CPU与主板、内存、显卡、硬盘的关系。
STM32F429采用的是Cortex-M4内核,内核即CPU,由ARM公司设计。ARM公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如ST、TI、Freescale,负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。如GPIO、USART(串口)、I2C、SPI等都叫做片上外设。具体见图 53。
图 53 STM32芯片架构简图
芯片和外设之间通过各种总线连接,其中主控总线有8条,被控总线有7条,具体见图 54。主控总线通过一个总线矩阵来连接被控总线,总线矩阵用于主控总线之间的访问仲裁管理,仲裁采用循环调度算法。总线之间交叉的时候如果有个圆圈则表示可以通信,没有圆圈则表示不可以通信。比如S0:I总线只有跟M0、M2和M6这三根被控总线交叉的时候才有圆圈,就表示S0只能跟这三根被控总线通信。从功能上来理解,I总线是指令总线,用来取指,指令指的是编译好的程序指令。我们知道STM32有三种启动方式,从FLASH启动(包含系统存储器),从内部SRAM启动,从外部RAM启动,这三种存储器刚好对应的就是M0、M2和M6这三条总线。
图 54 STM32F42xxx 和 STM32F43xxx 器件的总线接口
5.4 存储器映射
在图 54中,连接被控总线的是FLASH,RAM和片上外设,这些功能部件共同排列在一个4GB的地址空间内。我们在编程的时候,操作的也正是这些功能部件。
5.4.1 存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,具体见图 55。如果给存储器再分配一个地址就叫存储器重映射。
图 55 存储器映射
1. 存储器区域功能划分
在这4GB的地址空间中,ARM已经粗线条的平均分成了8个块,每块512MB,每个块也都规定了用途,具体分类见表格 51。每个块的大小都有512MB,显然这是非常大的,芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的一部分而已。
表格 51 存储器功能分类
序号 |
用途 |
地址范围 |
Block 0 |
SRAM |
0x0000 0000 ~ 0x1FFF FFFF(512MB) |
Block 1 |
SRAM |
0x2000 0000 ~ 0x3FFF FFFF(512MB) |
Block 2 |
片上外设 |
0x4000 0000 ~ 0x5FFF FFFF(512MB) |
Block 3 |
FMC的bank1 ~ bank2 |
0x6000 0000 ~ 0x7FFF FFFF(512MB) |
Block 4 |
FMC的bank3 ~ bank4 |
0x8000 0000 ~ 0x9FFF FFFF(512MB) |
Block 5 |
FMC |
0xA000 0000 ~ 0xCFFF FFFF(512MB) |
Block 6 |
FMC |
0xD000 0000 ~ 0xDFFF FFFF(512MB) |
Block 7 |
Cortex-M4内部外设 |
0xE000 0000 ~ 0xFFFF FFFF(512MB) |
在这8个Block里面,有3个块非常重要,也是我们最关心的三个块。Boock0用来设计成内部FLASH,Block1用来设计成内部RAM,Block2用来设计成片上的外设,下面我们简单的介绍下这三个Block里面的具体区域的功能划分。
存储器Block0内部区域功能划分
Block0主要用于设计片内的FLASH, F429系列片内部FLASH最大是2MB,我们使用的STM32F429IGT6的FLASH是1MB。要在芯片内部集成更大的FLASH或者SRAM都意味着芯片成本的增加,往往片内集成的FLASH都不会太大,ST能在追求性价比的同时做到1MB以上,实乃良心之举。Block内部区域的功能划分具体见表格 52。
表格 52 存储器Block0 内部区域功能划分
块 |
用途说明 |
地址范围 |
Block0 |
预留 |
0x1FFF C008 ~ 0x1FFF FFFF |
OTP区域:其中512个字节只能写一次,用于存储用户数据,额外的16个字节用于锁定对应的OTP数据块。 |
0x1FFF C000 ~ 0x1FFF C00F |
|
预留 |
0x1FFF 7A10 ~ 0x1FFF 7FFF |
|