一、启动模式(Boot modes) 阅读:STM32中文参考手册_V10.pdf 查看启动配置(Boot modes)。
; t. w' C9 \% W% z( k- m9 o% N0 F 在STM32F10xxx里,可以通过BOOT[1:0]引脚选择三种不同启动模式。
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: ) u7 j9 } B; t% R( d3 U' F! a0 g 在系统复位后, SYSCLK的第4个上升沿, BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。 / b3 L" E) h: u, Z 在从待机模式退出时, BOOT引脚的值将被被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。在启动延迟之后, CPU从地址0x0000 0000获取堆栈顶的地址,并从启动存储器的0x0000 0004指示的地址开始执行代码。
因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。 Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。 STM32F10xxx微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从内置SRAM启动。
根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问: ● 从内置SRAM启动:只能在0x2000 0000开始的地址区访问SRAM。 注意: 当从内置SRAM启动,在应用程序的初始化代码中,必须使用NVIC的异常表和偏移寄存器,从新映射向量表之SRAM中。 1, ST-LINK烧写 z! ?' Y3 `% z9 Q. A2 B 1.1 ST-LINK烧写的SWD模式 ST-LINK烧写的SWD模式 是ST-LINK烧写的一种方式,只需要4根接线。 分别为VCC,GND,SWCLK, SWDIO; : V7 w# P+ g5 u/ O$ ^" o6 S4 x 如果用SWD模式下载的话,只需要接:J-LINK的第1脚(VDD)、第7脚(TMS/SWDIO对应stm32的PA13)、第9脚(TCK/SWCLK对应stm32的PA14)、第4.6.8.10.12.14.16.18.20中的任意一个脚(GND地脚)、需要说明的是第15脚(RESET对应stm32的NRST)可接可不接,大家根据实际自己决定(保险起见还是建议接上,不接时可以在MDK仿真器的设置里面不使用硬件复位,而是用system reset或者vect reset)! 8 n* l4 J5 _& }$ N+ u+ l
用SWD下载参考电路图:
1.2 ST-LINK烧写的JTAG模式 . V% H7 b& }1 b' E- o) q e2 o2 ?
在JTAG模式下的程序烧写过程中需要进行单独对板子进行供电 STM32F10XXX JTAG的引脚: 9 `. ^/ p& T1 y* B! c: R$ p STM32F10XXX 芯片内部的JTAG引脚已带有内部上拉和下拉:
JTAG下载参考电路图: 8 `. G$ s9 F" ^; i6 W6 p3 O
2 ,USB转串口连接线烧写(又称ISP烧写,且使用的串口必须是串口1)2.1 方法一(该方法用于手动设置下载)& F$ v5 p1 q; ^% o% B# w7 r- i Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader;: z0 _% }6 B* k4 q4 F" r9 { 2.2 方法二(该方法用于软件一键下载) 我们想用串口下载代码,就要配置BOOT0为1,BOOT1为0,但是如果想让STM32一复位就运行代码,就要配置BOOT0为0,BOOT1配置为什么都可以,为了解决这个问题,我们可以设计一个电路,通过串口转USB芯片CH340G的DTR#和RTS#引脚的信号来控制一键下载电路,从而间接控制STM32的RESET和BOOT0引脚的信号,来达到通过串口一键下载和运行的效果。 一键下载电路参考: 2 q6 C" ?; O5 f+ j: b
串口下载软件选用的是FlyMcu或MCUISP,通过串口的DTR和RTS信号来自动配置BOOT0和RESET信号,不需要用户手动切换它们的状态,直接串口软件自动控制,可以方便的下载代码。
我们需要注意一点:CH340G上电后DTR#和RTS#都为高电平,在用MCUISP烧写软件时,我们在软件下方选择“DTR的低电平复位,RTS高电平进BootLoader”,CH340G IC在实际操作时引脚的变化为“DTR#拉高,RTS#拉低”,即软件设置和实际情况是取非的,相反的。
首先,FlyMcu软件控制DTR输出低电平,则DTR#引脚输出高, 然后RTS置高,则RTS#引脚输出低,这样Q3导通了,BOOT0被拉高,即实现设置BOOT0为1,同时Q2也会导通,STM32的复位脚被拉低,实现复位。
然后,延时100ms后,FlyMcu软件控制DTR为高电平,则DTR#引脚输出低电平,RTS维持高电平,则RTS#引脚继续为低电平,此时STM32的复位引脚,由于Q2不再导通,变为高电平,STM32结束复位,但是BOOT0还是维持为1,从而进入ISP模式,接着mcuisp就可以开始连接STM32,下载代码了,从而实现一键下载。
DTR#和RTS#信号的时序图如下图所示: 8 j" d: m t1 @7 q1 W" q& r % B" \' D% K3 E! G6 X, }3 ? 程序下载完毕后,如果设置了编程后执行,STM32会再次被复位,此时DTR#引脚为高,RTS#引脚为低,STM32复位后,DTR#引脚设置为低,RTS#引脚设置为高,那么Q2和Q3都不导通,此时,STM32重新开始启动后,检测到BOOT0为0,程序开始正常运行,一键下载至此就完成了。8 e( c7 W5 s/ \; {" m2 i ! R) j; O& H G" L3 t/ C W 7 L! B/ C# ~: A |