STM32F103 在KEIL环境下使用ST-LINK不能自动复位运行,不能调试,完全断电,再上电就可以运行了。

STM32F103在KEIL下使用ST-LINK问题解析

STM32F103 在KEIL环境下使用ST-LINK不能自动复位运行,不能调试,完全断电,再上电就可以运行了。

自己画了个板子,从头进行调试,测试流水灯时发现了问题。

现象

 点击烧录,在keil上确实是显示运行了,但是LED并没有闪烁。而且点击调试直接就跑飞了,但是并没崩溃。复位后也依旧不能调试。

解决方式

  1. KEI5软件配置问题。
  2. 硬件问题。
  3. ST-LINK问题。
  4. STM32启动方式问题。

总结网上的解决方法

1、KEIL5 软件配置

  1. flah 勾选 r e s e t − a n d − r u n \color{red}{reset - and - run} resetandrun
  2. Pack 取消勾选 E n a b l e \color{red}{Enable} Enable

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/727fd4c6130745718069224b99e3b3ff.png在这里插入图片描述

"烧录之后,依旧不能解决问题。而且我没有Pack选项,我看很多人也没有
在这里插入图片描述

2、硬件问题

  1. 以为是供电电压不够,只使用烧录器供电是3.3V。测量也确实是3.3V。使用type-c 5V供电
    依旧不能解决问题。

3、ST-LINK 问题

不需要装驱动,keil自带的,而且烧录也没有问题,基本排除了ST-LINK 问题。

4、STM32启动问题

STM32启动方式

启动模式选择引脚启动模式说明
BOOT1BOOT0
x0主闪存存储器主闪存存储器被选为启动区域
01系统存储器系统存储器被选为启动区域
11内置SRAM内置SRAM 被选为启动区域
  1. 启动地址:0x08000000 是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
  2. 第二种方式(boot0 = 1;boot1 = 0):System memory启动方式
  • 启动地址:0x1FFF0000从系统存储器启动,这种模式启动的程序功能是由厂家设置的。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,出厂后无法修改。,我们选用这种启动模式时,是为了从串口下载程序

1、将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
2、最后在BootLoader的帮助下,通过串口下载程序到Flash中
3、程序下载完成后,需要将BOOT0设置为GND,手动复位,便可以运行。

  1. 第三种方式(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 复位命令,因此客户的应用程序不会被执行。

查到的连接地址

https://shequ.stmicroelectronics.cn/thread-633557-1-1.html

<think>嗯,用户遇到了STM32F103VET6在Keil环境下第二次下载程序失败的问题,报错Cortex-M3。这确实是个典型的调试器连接问题,需要一步步排查。 用户可能已经尝试过重新插拔调试器或重启Keil,但问题依旧存在。深层需求其实是希望找到一劳永逸的解决方案,避免每次下载都要折腾。从报错类型看,核心矛盾点应该在调试器与芯片的通信稳定性上。 首先想到SWD接口的复用问题。STM32的SWDIO和SWCLK常与GPIO复用,如果用户程序初始化时误配置了这些引脚,第二次下载时调试端口就被锁死了。这个解释最符合"首次成功二次失败"的特征现象。不过用户是工程师的话,应该会注意避免配置调试口才对…… 接着考虑硬件因素:劣质USB线接触不良、板载滤波容老化、复位路设计缺陷都可能导致通信断续。尤其是长距离杜邦线连接的情况,信号完整性很难保证。不过用户没描述硬件环境,这点需要后续确认。 软件配置方面也值得深挖:Keil的"Reset and Run"选项如果关闭,芯片可能停留在异常状态;调试器固件过旧也会出现兼容性问题;甚至杀毒软件拦截USB通信这种边缘情况也要纳入考量。 最关键的突破点应该是SWD端口解锁方案。准备推荐三种方法:1)最稳妥的断电复位 2)最快捷的BOOT0上拉复位 3)技术流的手动复位命令。用户如果是产线工程师,可能更倾向硬件复位方案;若是研发人员则可能想用OpenOCD命令彻底研究原理。 突然想到还有个隐藏陷阱:STM32的nRST引脚如果被程序配置为GPIO,会导致无法硬件复位。这种情况只能依靠BOOT0救砖了。不过VET6这种大容量芯片比较少见这种极端配置。 最后要提醒预防措施。用户既然遇到这个问题,后续开发时最好在代码开头添加解除SWD锁的指令,或者避免使用那几个关键GPIO。毕竟每次下载都要按复位键太影响效率了。 对了,还要强调连接器检查——之前就见过用户因为SWD接口的排针虚焊,折腾了一整天呢……</think>好的,针对您遇到的STM32F103VET6在Keil中首次下载成功,但第二次下载失败并报错“Cortex-M3”的问题,以下是详细的排查和解决方案: **核心问题分析:** “Cortex-M3”错误通常表示调试器(如ST-Link, J-Link)无法与目标芯片的Cortex-M3内核建立或维持可靠的通信连接。首次成功而第二次失败的现象非常典型,通常指向以下原因: 1. **SWD/JTAG引脚被复用或锁定 (最常见原因):** * STM32调试接口(SWDIO, SWCLK, nRST)通常与普通GPIO引脚复用。 * 第一次下载程序后,如果用户的程序代码(尤其是`main()`函数开头)初始化了这些调试引脚所在的GPIO端口(例如配置为输出、输入、复用功能等),就会覆盖调试器所需的SWD功能。 * 当尝试第二次下载时,调试器无法通过这些被“占用”的引脚与内核通信,导致“Cortex-M3”错误。 * **关键点:** 第一次下载时芯片是“干净”的(调试接口可用),下载后用户程序运行并可能禁用了调试接口。第二次下载时,调试器无法连接被禁用的接口。 2. **复位路/行为问题:** * **硬件复位路不完善:** 开发板上的复位路(RC网络)可能设计不当,导致复位信号不稳定或复位时间不足,影响调试器在连接时的初始化。 * **调试复位能力不足:** 某些调试器配置或连接线过长/质量差,导致其发出的复位信号未能有效到达芯片或未能将芯片完全复位调试器可识别的状态。 * **用户程序阻塞复位:** 用户程序可能意外禁用了调试端口或进入了低功耗模式、死循环、看门狗复位等状态,使得调试器无法通过标准复位流程恢复连接。 3. **供问题:** * 源不稳定(纹波过大、压跌落)或流不足,尤其是在用户程序运行时功耗增加,可能导致芯片工作异常或与调试器的通信不稳定。 * 使用USB供调试器(如ST-Link V2)给目标板供时,如果目标板功耗较大,USB端口可能无法提供足够的流。 4. **连接问题:** * SWD/JTAG连接线(杜邦线)接触不良、过长或质量差,导致信号完整性下降。 * 调试器接口(如排针、连接器)虚焊或氧化。 5. **Keil配置/调试器驱动问题 (相对少见):** * Keil调试器配置(如速度、复位方式)不当。 * 调试器固件过旧或损坏。 * Keil软件本身临时故障。 **解决方案:** 按照优先级和常见程度排序: 1. **手动硬件复位 (最常用有效的方法):** * 在尝试第二次下载**之前**,**先断开目标板的源**(拔掉USB线或关闭源开关)。 * 等待几秒钟(确保容放)。 * **重新上**。 * 立即在Keil中点击`Load` / `Download`按钮。这通常能成功。 * **原理:** 断电复位彻底清除了芯片状态,包括用户程序对调试引脚的配置,使芯片以默认状态(调试接口启用)启动,调试器得以重新连接。 2. **利用BOOT0引脚复位 (无需断电):** * 找到目标板上的`BOOT0`引脚(通常标记为`BOOT0`或`B0`)。 * 在尝试第二次下载**之前**,**将BOOT0引脚通过跳线帽连接到3.3V (高平)**。 * **按一下目标板上的`NRST`复位键**(或者通过Keil的`Reset`按钮发送复位信号)。 * 芯片复位后会进入系统存储器启动模式(通常内置了串口/USB DFU引导程序)。**此时调试接口是默认可用的!** * **立即在Keil中点击`Load` / `Download`按钮**。下载应该能成功。 * 下载完成后,**将BOOT0跳线帽重新接回GND (低平)**。 * 按复位运行新下载的程序。 * **原理:** 上拉BOOT0并复位,强制芯片进入Bootloader模式,该模式不会运行用户程序,因此用户程序对调试引脚的配置无效。下载器可以连接并重新下载程序覆盖Flash。 3. **修改用户代码 (根本解决方案):** * **避免初始化调试引脚:** 检查程序代码(尤其是`main()`函数开始处,HAL/LL库初始化之后,用户代码之前),确保**没有**对`PA13`(SWDIO), `PA14`(SWCLK), `PA15`(JTDI, 常作为SWDIO备用), `PB3`(JTDO, 常作为SWCLK备用), `PB4`(NJTRST), `nRST`等引脚进行任何配置(如GPIO_Init)。让它们保持复位后的默认状态(复用功能调试)。 * **添加调试引脚解锁代码 (推荐):** 在`main()`函数的**最开头**(任何其他外设初始化之前),添加以下代码,显式解除调试引脚的锁定: ```c // 对于STM32F1 (Cortex-M3), 释放PA13(SWDIO), PA14(SWCLK), PA15(JTDI), PB3(JTDO), PB4(NJTRST) __HAL_AFIO_REMAP_SWJ_DISABLE(); // 慎用! 会完全禁用JTAG/SWD // 更推荐仅释放不再用于调试的引脚,保留SWD: __HAL_AFIO_REMAP_SWJ_NOJTAG(); // 释放PB3, PB4, PA15 (JTAG引脚)为普通GPIO,保留PA13/PA14为SWD ``` * 使用`__HAL_AFIO_REMAP_SWJ_NOJTAG();`是最安全常用的,它释放了JTAG占用的引脚(PA15, PB3, PB4),但保留了SWD功能(PA13, PA14)。如果确定只使用SWD且不需要JTAG,这是最佳选择。 * `__HAL_AFIO_REMAP_SWJ_DISABLE();`会禁用所有调试端口(SWD和JTAG),**除非你非常确定后续不需要再通过调试器下载或调试,否则绝对不要在产品代码中使用!** 仅在特殊需求下使用。 * **重要:** 添加此代码并重新编译后,你需要使用**方法1 (断电复位)** 或**方法2 (BOOT0复位)** 来成功下载**这个新固件**一次。之后,由于新固件保护了调试引脚,后续下载就应该正常了。 4. **检查并优化Keil配置:** * **复位方式:** 在Keil的`Options for Target` -> `Debug` -> `Settings` -> `Reset`选项卡中,尝试不同的复位方式: * `Autodetect` (首选) * `Hardware Reset` (如果支持且硬件复位路可靠) * `Software Reset` (尝试,但有时不够彻底) * `VECTRESET` (Core reset) / `SYSRESETREQ` (System reset) - 尝试不同的软件复位类型。 * **连接速度:** 在`Debug` -> `Settings` -> `Port`选项卡中,尝试降低`SW Device`的`Clock`速度(例如从4MHz降到1MHz或更低),尤其是在连接线较长或质量一般时。 * **“Reset and Run”:** 确保`Options for Target` -> `Debug` -> `Settings` -> `Reset`选项卡中的`Reset and Run`选项是勾选的(通常推荐)。这确保下载后程序自动运行。 * **更新调试器固件:** 检查并更新你使用调试器(ST-Link, J-Link等)的固件到最新版本。 5. **检查硬件:** * **源:** * 使用万用表测量目标板的3.3V压是否稳定且在要求范围内。 * 确保源能提供足够的流。尝试使用更可靠的源(如实验室源)而非仅靠调试器USB供。 * 检查板上源滤波容是否完好。 * **复位路:** 检查复位引脚(nRST)的路(通常是10K上拉阻 + 0.1uF容到地 + 复位按键)。确保元件值合适且焊接良好。nRST信号应稳定在3.3V(高平)。 * **连接:** * 检查SWD(GND, SWCLK, SWDIO, +3.3V(可选), nRST(可选))的所有连接线是否牢固、无虚焊、无短路断路。尝试更换更短、质量更好的连接线。 * 检查调试器和目标板上的接口(排针、连接器)是否清洁、无弯曲、接触良好。 * **旁路容:** 确保芯片的VDD/VSS引脚附近有足够且合适的去耦容(通常每个源对至少一个0.1uF陶瓷容靠近引脚放置)。 6. **其他软件措施:** * **重启Keil / 脑:** 有时简单的重启可以解决临时软件故障。 * **更换USB口 / USB线:** 尝试使用主板背面的USB口或更换USB线,排除USB接口供或通信问题。 * **检查后台程序:** 关闭可能占用USB端口或干扰调试通信的后台程序(如某些串口助手、杀毒软件等)。 **总结排查流程建议:** 1. **立即尝试:** 使用**方法1 (断电复位)** 或**方法2 (BOOT0复位)** 来恢复第二次下载。这是最快捷的临时解决方案。 2. **根本解决:** 应用**方法3 (修改用户代码)**,在`main()`开头添加`__HAL_AFIO_REMAP_SWJ_NOJTAG();`。使用步骤1的方法下载这个新固件一次。之后下载应恢复正常。 3. **若问题持续:** 仔细检查**硬件(源、复位、连接)** 和**Keil配置(复位方式、速度)**。 4. **最后手段:** 尝试更新调试器固件、更换调试器或连接线。 通过以上方法,特别是正确处理调试引脚配置,应该能彻底解决STM32F103VET6在Keil中第二次下载失败报“Cortex-M3”错误的问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值