打印
[STM32F0]

STM32F0单片机快速入门三 MCU启动过程

[复制链接]
1095|49
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.MCU 代码如何启动

首先我们需要澄清一个问题,什么是 Startup Code,什么是 Bootloader?因为总看到有同学混用这两个概念。


使用特权

评论回复
沙发
花间一壶酒sd|  楼主 | 2021-1-25 22:23 | 只看该作者
Bootloader 可以译为引导程序。早期的单片机是没有 Bootloader 这种概念的。如大家熟悉的 MCS51,最初芯片内是不能存储代码的,需要外挂EPROM,就是下面这种带个小玻璃窗的存储器。擦除 EPROM 中的代码需要用紫外线照射几分钟才行。

使用特权

评论回复
板凳
花间一壶酒sd|  楼主 | 2021-1-25 22:23 | 只看该作者

使用特权

评论回复
地板
花间一壶酒sd|  楼主 | 2021-1-25 22:24 | 只看该作者
后来出现了 Flash 这种可电擦写的存储器,并集成在了单片机内部。但出厂的时候单片机的程序存储区仍然是空白的,没有任何代码。用户编译程序后,下载到单片机后才能运行。那么在产品发给用户后,如果发现有Bug怎么办呢?就得用编程器把新代码重新下载一次。这实在是有点儿麻烦,特别是如果客户距离很远的话。于是有聪明的程序猿想了一个办法,写一小段特殊的代码放在程序里,这段代码可以通过一定方式,比如用按键触发进入运行,它可以通过串口(早期的 PC 串口是标配)接收新的代码并写入Flash,从而在没有硬件编程器的情况下也能完成代码的更新。

使用特权

评论回复
5
花间一壶酒sd|  楼主 | 2021-1-25 22:25 | 只看该作者
程序猿们也是现代历史前进的重要推动力啊!

使用特权

评论回复
6
花间一壶酒sd|  楼主 | 2021-1-25 22:34 | 只看该作者
后来,有芯片厂商把这种代码在出厂时就固化在芯片里,极大的方便了代码下载和程序更新。STM32F030内部就固化了Bootloader。当我们把一个引脚 BOOT0 拉高的同时,重新给芯片上电或复位,就会触发Boootloader进入运行。此时我们通过单片机的串口就可以把新程序发送给单片机,发送完后把 BOOT0 拉低,再复位单片机,新程序就会运行起来。

使用特权

评论回复
7
花间一壶酒sd|  楼主 | 2021-1-25 22:36 | 只看该作者
Startup Code 可以译为启动代码。单片机上电或复位后最先执行的一段代码。一般主要会完成堆栈指针的设置,复位向量的获取和加载,然后初始化变量,最后跳转到用户代码。在详细看启动代码之前,我们先看一下 STM32F030 的内存映射。

使用特权

评论回复
8
花间一壶酒sd|  楼主 | 2021-1-25 22:37 | 只看该作者
2.STM32F030内存映射(Memory Map)
下面是 STM32F030 的内存映射,其它芯片会因为 Flash,SRAM 空间大小不同而略有不同。

使用特权

评论回复
9
花间一壶酒sd|  楼主 | 2021-1-25 22:38 | 只看该作者

使用特权

评论回复
10
花间一壶酒sd|  楼主 | 2021-1-25 22:42 | 只看该作者

使用特权

评论回复
11
花间一壶酒sd|  楼主 | 2021-1-25 22:46 | 只看该作者

使用特权

评论回复
12
花间一壶酒sd|  楼主 | 2021-1-25 22:47 | 只看该作者
因为是32位机,所以可寻址从 0x0000_0000 到 0xFFFF_FFFF 的总共 4G 空间。

使用特权

评论回复
13
花间一壶酒sd|  楼主 | 2021-1-25 22:48 | 只看该作者
这是采用32位机的好处,地址空间足够用。不像8位或16位机,很容易出现地址空间不够用,动不动就需要用 Page 来间接寻址。

使用特权

评论回复
14
花间一壶酒sd|  楼主 | 2021-1-25 22:51 | 只看该作者
我们从低地址到高地址逐段看一下:

0x0000 0000 Virtual memory

这段地址空间,会因为不同的 BOOT 模式而映射到不同的物理内存。

使用特权

评论回复
15
花间一壶酒sd|  楼主 | 2021-1-25 22:52 | 只看该作者
当芯片复位,或从 Standby 低功耗模式唤醒时:

如果引脚 BOOT0 是被拉低的,将映射到 Flash memory。这是最常用的代码运行模式;

如果引脚 BOOT0 是被拉高的,且nBOOT1为 1 ,将映射到 System memory。进入bootloader模式;

如果引脚 BOOT0 是被拉高的,且nBOOT1为 0 ,将映射到 SRAM。

注:nBOOT1 为Flash寄存器中的一位,用户何以设置。

使用特权

评论回复
16
花间一壶酒sd|  楼主 | 2021-1-25 22:56 | 只看该作者
0x0800 0000 Flash memory

存放用户代码

使用特权

评论回复
17
花间一壶酒sd|  楼主 | 2021-1-25 22:57 | 只看该作者
0x1FFF EC00 System memory

存放 bootloader, 片内集成温度传感器的校正数据,和片内集成电压参考的校正数据

这些代码和数据是在工厂固化好的。

使用特权

评论回复
18
花间一壶酒sd|  楼主 | 2021-1-25 22:57 | 只看该作者
0x2000 0000 SRAM

存放用户变量,堆(Heap)和栈(Stack)。也可以把代码加载到 SRAM 运行。

使用特权

评论回复
19
花间一壶酒sd|  楼主 | 2021-1-25 22:58 | 只看该作者
0x4000 0000 Pheriperals

芯片集成的外设,如 USART, SPI, GPIO等的寄存器地址在这一区域。

使用特权

评论回复
20
花间一壶酒sd|  楼主 | 2021-1-25 22:59 | 只看该作者
0xE000 0000 Cortex-M0 internal pheriperals

M0内核的外设映射到此区域。如 systick (System Tick),NVIC,Debug Registers。这些寄存器在芯片手册里是查不到的,需要到 ARM 的手册里查找。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

971

帖子

1

粉丝