前言
本博文基于STM32F103ZET6和MDK5以及库V3.5.0编写;
本博文以原子开发板为例;
如有不足之处,还请多多指教;
其实本没有必要写这篇文章,因为只要按照开发板配套的教程去做就可以对芯片写入程序即可,而且开发板上往往设计的都有一键下载的相关电路,能够产生DTR和RTS信号,从而将程序直接下载到芯片,对于用户来说,大大多短了下载程序的时间,提高了效率;但是毕竟以后如果要做开发这块的,总不能碰见一个项目就买一个买开发板,然后才能下载程序,这简直有点不可思议,还是要懂得脱离开发板,对一个芯片进行下载程序,从而形成一个完整的系统,这算得上是一个稍微成熟的开发;
STM32开发板下载程序的两种方式
一: 仿真器下载(J-Link,ULink等等)
步骤:
① 给开发版供电(DC5V),插上J-Link;
② 点击MDK工具栏中的Load按键就可将编译好的程序下载到开发板的Flash;
③ 下载好后根据配置可自动运行,也可以不自动运行(通过对下图中的操作控制);
** 二:** 串口USART1下载(注意,只能是USART1)
步骤:
① 给开发板供电(DC5V),拔掉J-Link,插上串口线;
② 使用FlyMcu软件下载编译好的.Hex文件,搜索串口为开发板硬件串口,一般为COMx,波特率选为115200,其配置如图;(红色箭头处要注意:因为今天我们想通过单纯的串口去下载程序,所以此选项处选择“不使用RTS和DTR”)
STM32F10x.h的存储器以及启动配置(这个知识作为对今天研究概念的补充)
STM32F10x.h的存储结构看下面这位前辈总结的:
https://blog.csdn.net/Vinfcent/article/details/78921974
BOOT0和BOOT1的不同配置决定的CPU启动模式(备注:“x”代表接高电平低电平都可)
三种启动地址所对应的内存映射地址:
图片中数字符号的含义:
1: 主闪存存储器 Flash
2: 系统存储器SYSTEMMEMORY
3: SRAM(掉电丢失);
这个启动模式类似于咱们给电脑换系统的时候,可以选择从机械硬盘,固态,或者U盘启动;
注意:虽然有三种启动模式,但是程序无论是从串口下载还是J-Link下载,最后都是下载到Flash里
针对BOOT0和BOOT1的不同接线方式(高电平,低电平,不接线),开发板的下载情况分析如下图:(“x”代表不接线,“√”代表能成功下载)
总结:
从图片中可以看出,J-Link下载的程序在勾选“Reset and Run”后直接运行,程序是一定能下载成功的,但是不一定能运行成功,并且,J-Link下载模式下,但凡BOOT0=1,都不能执行代码,为什么?因为J-Link将代码下载到Flash中,而决定启动模式的BOOT0和BOOT1配置为了启动方式不是从FLash开始的,读不到代码;
在串口下载模式下(注意不使用DTR和RTS电路下载),程序同样被写入Flash;
无论是用哪一种方式下载程序,程序存储的位置都在Flash,然而BOOT0和BOOT1决定了程序从何处开始处理(PC指针的初始值被配置成什么);所以如果程序下载好了之后,需要将BOOT0和BOOT1的接线方式配置成使程序从Flash处开始启动即可,例如:BOOT0 = 0,BOOT1=1即可;
————————————————
版权声明:本文为CSDN博主「wuyuzun」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wuyuzun/article/details/86586088
STM32F103 配置BOOT0 和BOOT1 直接接地还是经过电阻接地?
问:我的STM32F103RET6 挂了,原因是BOOT0 和BOOT1 直接接地导致的,很是奇怪,大家有没有遇到啊?
答:STM32 的硬件设计指导也是建议BOOT0、1 接电阻再接地的。
BOOT0 和BOOT1 分别通过10k 电阻接地,方便串口下载,下载器控制BOOT0 为高电平,下完后又将BOOT0
恢复为低,STM32 复位即可进入用户程序。平常上电直接进入用户程序。
boot0 接10k 电阻接地或者直接接地,都不会引起芯片损毁。
注意:如果JTAG 相关的引脚被用作普通IO,将无法下载(BOOT0 为低电平的情况下)。解决办法是用串口下载一次程序后再用JLINK 下载,或者将BOOT0 配置成高电平后下载。
————————————————
版权声明:本文为CSDN博主「石破天开」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012166958/article/details/80519740
要注意的是,一般不使用内置 SRAM 启动(BOOT1=1 BOOT0=1),因为SRAM掉电后数据就丢失。多数情况下 SRAM只是在调试时使用,也可以做其他一些用途。如做故障的局部诊断,写一段小程序加载到 SRAM中诊断板上的其他电路,或用此方法读写板上的 Flash 或 EEPROM 等。还可以通过这种方法解除内部Flash的读写保护,当然解除读写保护的同时 Flash的内容也被自动清除,以防止恶意的软件拷贝。一般 BOOT0和 BOOT1跳线都跳到 0(地)。只是在 ISP下载的情况下,BOOT0=1,BOOT1=0 ,下载完成后,把BOOT0的跳线接回0,也即BOOT0=0,BOOT1=0 。
插曲:笔者曾经做过一个项目,拿到一块别人的板子和程序来修改,后来做了块板子,烧录程序后发现:烧录后通过烧录工具的“烧录后运行”选项可以正常跑起来,但一旦使程序从FLASH开始运行,则跑不了了。后来发现别人板子上的MCU是烧录过boot的,而自己做的板子是没有烧录boot的,前者程序从0x8003000开始运行,后者程序实际从0x8000000开始运行,把0x8003000处开始运行的程序烧到0x8000000的板子上的结果就是:复位向量地址不正确,导致芯片无法启动,因为0x8003000的程序把中断向量表搬到了0x8003000处。
————————————————
版权声明:本文为CSDN博主「魏波-」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weibo1230123/article/details/80692138