1、文章概述:
此文档大致介绍了三种启动(BOOT)方式以及具体操作方法。介绍文档请自行查看STM32参考手册。注意:BOOT中文翻译是启动的意思。BOOT方式就是启动方式。
三种启动方式分别为: 从主闪存存储器、系统存储器、内置SRAM启动。所谓主闪存就是STM32 自带的片内Flash。系统储存器为STM32片内自带的ROM,该区域由STM32生产时固化,用户无权且无须改动。SRAM即STM32自带的64K片内SRAM,正常使用中SRAM一般是储存程序运行中的一些变量。
2、启动方式的实质:
所谓STM32的启动方式,其实质为:STM32把代码下载到什么地方的问题。KEIL编译的程序最终转换为二进制下载到STM32的储存器件(STM32只有SRAM和FLASH能放代码)。如何告知STM32内部电路应该将程序下载到何处? 此时就是通过BOOT引脚告知STM32内部电路该把程序下载到何处。BOOT一共两个引脚,BOOT0、BOOT1。根据这两个引脚上的电平,风别对应以下三种下载选择:
启动之后的具体寻址、指针跳转等访问细节可以查看中文参考手册2.4启动配置一章。下面讲述三种启动方式实操。
3、启动实操
3.1 主闪存存储器启动
这个启动方式即为FLASH启动。该方式很常见:使用ST-LINK连接开发板,然后在KEIL(MDK)设置Options for Target等,设置完毕后点击菜单栏 Download绿色箭头,然后就可以下载到FLASH了。把鼠标放在绿色箭头会出现一行解释:Download code to flash memory。该方式需要把BOOT0置0,BOOT1随意。
3.2、系统存储器启动
在系统存储器放置着出厂设置的下载引导电路:这个电路你可以理解为一段固定作用的代码。该代码的名字就叫BootLoader,也叫自举程序。他的作用就是把通过串口发送过来的代码放到FLASH。该启动方式就是大家所熟悉的串口下载。此启动方式的流程:用户编译产生二进制文件 ->二进制文件通过串口发送到stm32 ->stm32自举程序将二进制文件写入FLASH。所以实质也是把代码下载到FLASH。
该启动方式的配置流程:
1、将BOOT0连接高电平,BOOT1连接低电平。
2、使用CH340连接电脑与MCU串口1引脚,
3、使用FlyMcu串口下载软件:设置DTR低电平复位,RTS高电平进Bootloader,选中STMISP,在该栏下选中校验、编程后执行、以及编程前重装文件,然后点击”开始编程“下载代码,注意下载时需要按一下复位才能烧录。
4、代码下载完毕之后程序开始运行。需要注意:如果按复位之后,程序是不会运行的,此时需要将BOOT0设置为0,按复位之后程序方可运行。这是因为复位之后BOOTLOADER没有从串口接收到代码,而代码是存放在Flash的,所以复位之后再从系统存储器启动自然不会成功。而将BOOT0该为0之后,是从存放着程序的Flash区域启动的,所以会成功启动。
3.3、SRAM启动
一般情况下,用户代码都是放在FLASH,SRAM则用来存放一些用户定义的变量等。所以想要从SRAM启动,那么必须要使SRAM既保留其原来的功能,又要使其作为FLASH使用。这里就涉及到将SRAM分区,一部分作为ROM固定存放用户代码,一部分用作RAM存放用户变量。 SRAM分区需要用户自己写代码完成。
具体分区代码:首先在工程目录(只要在工程路径下的任一文件夹就行)定义.sct文件。文件名自行定义,这里定义为sram_load.sct。该文件内容如下:STM32F1系列可以直接复制。在该文件中,我们将F1的64K SRAM分为两个区,虚拟Flash(ROM区)、虚拟SRAM(RAM区),大小各占64K的四分之三、四分之一。
LR_IROM1 0x20000000 0x00010000 { ; load region size_region 总储存区域起始地址以及大小(这里为sram起始地址及大小)
ER_IROM1 0x20000000 0x0000C000 { ; load address = execution address 虚拟Flash(ROM)起始地址及大小
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x2000C000 0x00004000 { ; RW data 虚拟SRAM(RAM)起始地址及大小
.ANY (+RW +ZI)
}
}
至此,分区所需文件完成。
此外还需准备另一个.ini文件。该文件用来指示系统启动方式。这里以Debug_RAM.ini命名。文件具体内容如下。该文件可在ST安装包里的相关文件里面找到。
FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter
XPSR = 0x01000000; // Set Thumb bit
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
}
LOAD %L INCREMENTAL // Download to RAM
Setup();
g, main
至此两个所需文件准备完毕。
下面开始讲述具体详细设置步骤:
1、将BOOT0连接高电平,BOOT1连接高电平。
2、在工程目录下创建.sct文件(分散加载文件)在“ Options for Target->linker”的选项中取消勾选第一个√,自己把刚刚新建的分散加载文件添加进来并 edit
3、配置中断向量表:Options for Target-> c/c++ ->Define”框中输入宏VECT_TAB_SRAM,与其他宏之间用逗号隔开
4、修改Flash的下载配置:
Options for Target->Debug->Settings:选择Do not erase
Options for Target->Target:
IRAM1:0x2000C000 ,大小:0x4000
IROM1:0x20000000,大小:0xC000
flashDownload -> Programming Algorithm:把他改成虚拟 ROM 的空间信息即: start:0x20000000,size:0x0000C000
flashDownload ->RAM for Algorithm:start:0x2000C000,size:0x4000.(如下图配置)
5、Debug->Load Application at Statup 取消勾选,并在Initialization FIle:添加Debug_RAM.ini并Edit。
6、主函数开头增加如下代码:
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
7、下载方式是通过KEIL(MDK) 红色DEBUG 按钮进入仿真(此时将将代码下载至SRAM),然后点击Run按钮运行。
9、 Options for Target ->C/C++ ->Define 中添加宏VECT_TAB_SRAM,与前面的宏用英文逗号隔开
至此操作步骤完毕。
4、总结
以上就是三种启动方式。若有疑问以及错误欢迎在评论区交流。