目录
前言
为了大家更好的理解STM32的启动方式,这里将以上资料进行整合并从以一下几点进行详细介绍:
一、STM32的存储器类型
二、STM32的启动
三、三种下载方式
四、三种硬件电路
一、STM32的存储器类型
1.1 存储器组织结构
程序存储器、数据存储器、寄存器、I/O端口排列在同一顺序的4GB地址空间内。
可寻址的存储空间分为8个主要块,每个块为512MB;未分配给片上存储器和外设的所有存储区域视为“保留区”。
请参考数据手册中的存储器映射图。
每次芯片复位后,所有外设时钟都被关闭(SRAM和Flash接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟。
1.2 嵌入式Flash(闪存)
Flash架构
Flash接口可管理CPU通过AHB I-Code和D-Code对Flash进行访问。该接口可针对Flash执行擦除和编程操作,并实施读写保护机制。
Flash接口通过哦指令和缓存机制加速代码执行。
由于本人使用的STM32F407系列开发板,因此将其作为参考讲解:

Flash接口具体系统架构:

Flash结构
- 主存储块,分为4个16KB扇区、1个64KB扇区和7个128KB扇区,起始地址:0x0800 0000
- 系统存储器,期间在系统存储器启动模式下从该存储器启动,起始地址:0x1FFF 0000
- 512字节OTP(一次性可编程),用于存储用户数据。OTP区域还有16个额外字节,用于锁定对应的OTP数据块
- 选项字节,用于配置读写保护、BOR级别、软/硬件看门狗以及器件处于待机或停止模式下复位。

1.3 嵌入式SRAM
系统SRAM架构

系统SRAM结构
可按照字节、半字(16位)或全字(32位)访问,执行速度cpu速度,且等待周期为0。
- 映射在地址0x2000 0000的112KB和16KB的SRAM,可供所有AHB主控总线访问。
- 映射在地址0x2002 0000的64KN,可供所有AHB主控总线访问。
- 映射在地址0x1000 0000映射的64KB块,只能供CPU通过数据总线访问。
二、STM32的启动

2.1 启动流程
在嵌入式开发过程中,由于是使用C编程,很少涉及到机器底层寄存器的执行,一般都会从main函数里开始写代码,也都知道代码运行是从main函数开始执行。在C语言代码执行过程中通常是机器先读取下一条语句的地址,然后从程序存储器中读取该地址的程序,然后再执行这条语句。那么问题来了,下一条语句的地址可以根据本条语句的地址来寻找到,但是main函数最开始的程序的入口地址如何找到?
事实上微控制器是无法从硬件上去定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,因此main函数的入口地址在编译后并不是固定不变的,因此需要通过一个启动文件来寻找到main的入口地址。
以前接触无论是PIC、AVR、MSP430或51过程中都会有涉及到启动文件的配置,仅仅只有熔丝位或配置字是需要根据实际使用配置来设置,其实并非没有,而是大部分开发环境往往自动完整提供了这个启动文件,不需要开发人员对其进行配置和干预,只需要从main函数开始程序涉及即可。但是对于嵌入式来说,当接触到嵌入式内核,在片上跑系统时却是很重言的环节。如Linux系统移植过程“bootloader”。启动文件完成微控制器从“复位”到“开始执行main函数”中间这段时间必要启动配置。
启动流程:
-
硬件选择启动模式
-
读取启动模式对应的存储器的中断向量表
-
初始化栈
-
初始化PC指针,指向Reset_Hander
-
初始化系统时钟
-
执行C库函数_main,进入C语言世界,执行main函数
相对于ARM上一代主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了很大的变化。ARM7/9内核的控制器在复位后,CPU会从存储空间的绝对地址0x0000 0000取出第一条指令执行复位中断服务程序的启动方式,即固定了复位后的起始地址为0x00000000(PC=0X00000000)同时中断向量表的位置并不是固定的。而Cort

最低0.47元/天 解锁文章
1059

被折叠的 条评论
为什么被折叠?



