STM32F103 在KEIL环境下使用ST-LINK不能自动复位运行,不能调试,完全断电,再上电就可以运行了。
自己画了个板子,从头进行调试,测试流水灯时发现了问题。
现象
点击烧录,在keil上确实是显示运行了,但是LED并没有闪烁。而且点击调试直接就跑飞了,但是并没崩溃。复位后也依旧不能调试。
解决方式
- KEI5软件配置问题。
- 硬件问题。
- ST-LINK问题。
- STM32启动方式问题。
总结网上的解决方法:
1、KEIL5 软件配置
- flah 勾选 r e s e t − a n d − r u n \color{red}{reset - and - run} reset−and−run 。
- Pack 取消勾选 E n a b l e \color{red}{Enable} Enable。
:System memory启动方式
- 启动地址:0x1FFF0000从系统存储器启动,这种模式启动的程序功能是由厂家设置的。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,出厂后无法修改。,我们选用这种启动模式时,是为了从串口下载程序
1、将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
2、最后在BootLoader的帮助下,通过串口下载程序到Flash中
3、程序下载完成后,需要将BOOT0设置为GND,手动复位,便可以运行。
- 第三种方式(boot0 = 1;boot1 = 1):SRAM启动方式。
启动地址:0x20000000 内置SRAM,没有程序存储的能力了,这个模式一般用于程序调试。用于快速的程序调试。
我的板子是GD32F103CBT6,没找到BOOT1引脚,只有BOOT0引脚,
我将
B
O
O
T
0
引脚接地后,便可以直接运行了,前提是勾选了前面的复位。
\color{red}{我将BOOT0引脚接地后,便可以直接运行了,前提是勾选了前面的复位。}
我将BOOT0引脚接地后,便可以直接运行了,前提是勾选了前面的复位。
原因是什么呢?
当 MCU flash 被檫除,之后又执行了断电上电过程,“empty check”标志会被置位(IC 为 空),这种情况下内部 bootloader 代码将被执行。“empty check”标志是在装载 option bytes 时置位的,option bytes 在 power-on 和 OBL_LAUNCH 复位时会进行装载。在客户的应用中 ST-Link Utility 对 IC 进行编程结束时复位了 IC,但“empty check”标志仍然是置位的。因此在“emptycheck”置位的情况下即使客户应用代码存在,但仍会运行 bootloader 代码。如果要刷新“empty check”标志只能通过断电上电过程或是执行 OBL_LAUNCH 复位命令。ST-Link Utility 在编程后没有执行 OBL_LAUNCH 复位命令,因此客户的应用程序不会被执行。