STM32 ISP程序下载详解
1、STM32三种启动模式
STM32通过BOOT0和BOOT1两个引脚来选择启动模式:
模式 | BOOT0 | BOOT1 | 启动模式 | 说明 |
---|---|---|---|---|
模式1 | 0 | X | 用户闪存存储器 | 用户闪存存储器,也就是FLASH启动 |
模式2 | 1 | 0 | 系统存储器 | 系统存储器启动,用于串口下载 |
模式3 | 1 | 1 | SRAM启动 | SRAM启动,用于在SRAM中调试代码 |
!!!系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存
1)用户闪存存储器启动模式(Main Flash memory) BOOT0 = 0
将BOOT0设置为0,stm32就进入了用户闪存存储器启动模式,也就是flash启动模式。这种模式是正常的用户工作模式,通过J-TAG和SWD模式进行下载程序,重启后也直接从这启动程序。
2)系统存储器启动模式(system memory) BOOT0 = 1 BOOT1 = 0
将BOOT0设置为1,BOOT1设置为0整个系统进行进入系统存储器启动模式。从系统存储器启动,这种模式启动的程序功能是由厂家预留设置的。
系统存储器是芯片内部一块特定的区域,在STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。
一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:
STEP1: 将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader。
STEP2: 最后在BootLoader的帮助下,通过串口下载程序到Flash中。
STEP3: 程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动。
3)SRAM启动(Embedded Memory)
内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。
假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,再将程序下载到Flash中。
2、CH430G一键程序下载原理(ISP)
为了操作方便,我们直接把BOOT1通过下拉电阻接地,一直为低电平,仅通过改变BOOT0的电平高低来下载程序
STEP1:系统上电,BOOT = 0,系统进入模式1运行。上电复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,进入主闪存存储器,执行我们断电前烧录的代码;
STEP2:程序编译完成,生成HEX文件;
STEP3:烧写HEX文件时,BOOT0拉高,进入模式2,然后让系统复位一次,复位后系统重新锁存引脚,通过系统存储器BootLoader引导烧写HEX文件;
STEP4:烧写HEX文件完成,我们希望进入模式1执行代码,但我们不需要再复位和锁存BOOT引脚进入模式1啦,因为MCUISP烧录软件帮我们配置好了,程序烧录完成会自动从OX0800 0000开始运行,即进入主闪存存储器执行程序;
参考手册:从主闪存存储器启动:主闪存存储器被映射到启动空间(0x00000000),但仍然能多在’它原有的地址(0x08000000)访问它,即闪存存储器的内容可以在两个地址区域访问,0x00000000或0x08000000。
3、原理图分析
我们通过RTS#和DTR#来控制BOOT0,进而改变启动方式,其中BOO1一直为低电平
由CH340G芯片资料可以知道这两个引脚的功能都为输出,且上电后均为高电平
RTS#:信号输出,初始状态为高电平,表示芯片接收数据已经准备就绪,下载程序时会变成低电平。
DTR#:信号输出,初始状态为高电平,下载程序时会变成低电平(但是,是在RTS变为低电平之后才为低)。
三级管:NPN:基极高电平导通,低电平截止;PNP:栅极低电平导通,高电平截止;
MOS管:N-MOS:栅极高电平导通,低电平截止;P-MOS:栅极低电平导通,高电平截止。
① 上电后:DTR# RTS#都为高电平(没有压降),Q2截止,RESET为高电平(低电平有效);RTS#为高电平,Q3截止,BOOT0 = 0,进入模式1;
② 打开MCUISP后,将软件设置为“ DTR的低电平复位,RTS高电平进bootloade”
软件配置和IC操作是相反的,实际的引脚操作为:DTR为高,RTS拉低
在启用下载的时候,DTR#维持高,RTS#拉低,此时Q2和Q3都导通,那么BOOT0 = 1进入模式2,RESET为低电平复位;
然后DTR#变低,Q2不导通,复位结束。此时的BOOT0为高电平,经过4个SYSCLK,BOOT0的状态会被锁存,变成串口下载模式,那么就会启用串口下载程序;
③ 程序下载结束后,RTS#会先变成高电平,DTR#再变成高电平,由MCUISP软件配置进入主闪存存储器执行程序。
程序下载时序图如下:
4、拓展:关于flash死锁的解决办法(Flash memory启动方式)
开发调试过程中,由于某种原因导致**内部Flash锁死,无法连接SWD以及JTAG调试,无法读到设备,可以通过修改BOOT模式重新刷写代码。修改为BOOT0=1,BOOT1=0即可从系统存储器启动,ST出厂时自带Bootloader程序,**SWD以及JTAG调试接口都是专用的。重新烧写程序后,可将BOOT模式重新更换到BOOT0=0,BOOT1=X即可正常使用。