2022/09/15
众所周知,当我们使用STlink或者Jlink的SWD为STM32下载程序时使用到的是PA13和PA14两个引脚,但在某些情况下我们可能会将这两个引脚复用为其它的模式,此时,我们再次使用STlink或者Jlink下载程序时可能会出现以下错误,提示Jlink并未找到目标的STM32芯片:
* JLink Info: STM32 (connect): Can not attach to CPU. Trying connect under reset.
* JLink Info: STM32 (connect): Can not attach to CPU. Trying connect under reset.
***JLink Error: STM32: Connecting to CPU via connect under reset failed.
Error: Flash Download failed - Target DLL has been cancelled
出现该问题的解决方法也很简单,大体思路就是在Jlink再次为STM32下载程序的一瞬间重启STM32,让STM32未执行到PA13和PA14复用这条语句前将代码下载进去,但该方法的最大难点在于STM32重启时间的把握。重启时间太晚,STM32并未启动,Jlink找不到目标;重启时间太早,两个引脚已经被复用,Jlink还是找不到目标。所以,这篇文章重点在于介绍重启的时间点如何把握。
方法
使用Jlink演示,STlink步骤大体相同,请自行探索
- 按照正常下载代码时的连线将STM与Jlink连接
- 在主函数中输入以下代码并且编译(该段代码的大体意思是使能时钟后将PA13和PA14等引脚设置成相应的功能,3-6行有注释,需要哪一个功能取消注释后编译即可)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
while(1);
- 等待编译完成后,先按住STM的reset键,不要松开,再按下keil5的下载按钮
- 此时,keil5的 Build Output 窗口首先会出现Jlink的序列号等,如下
此时也不要松开reset按钮 DLL: V6.32i, compiled Jul 24 2018 15:19:55
Firmware: J-Link J-Link V21 compiled Oct 24 2016 00:00:00
Hardware: V1.00
S/N : 123123123
- 稍等片刻后, Build Output 窗口会输出如下提示,证明Jlink已经开始搜寻设备并且第一次搜寻设备并未找到
* JLink Info: STM32 (connect): Can not attach to CPU. Trying connect under reset.
- 此时我们需要立刻松开reset按钮,让STM启动。一般来说
* JLink Info: STM32 (connect): Can not attach to CPU. Trying connect under reset. 提示会出现两次,我们要做的也就是要在第二次出现提示前松开reset,让Jlink在第二次搜索时能搜索到STM(一定要在第二次出现前松开,假如第二次提示前未松开reset按钮,证明Jlink第二次搜索也并未搜索到STM,并且Jlink不会进行第三次搜索,直接报错 ***JLink Error: STM32: Connecting to CPU via connect under reset failed. ,此时需要再次重复以上下载步骤) - 当我们成功在两次提示之间松开reset后Jlink会弹出以下窗口
- 此时,我们需要再次按住reset键,并且点击弹窗中的Yes,等待0.5~1秒左右 Build Output 窗口出现十几行提示时,松开reset即可(此次松开reset键时的间隔较大,不必卡到必须某一个提示出现时才能松开,一般一次就能成功,假设不成功再次执行以上操作多试几次,很容易就能找到松开reset键的时间点)
- 最后,当出现以下提示时,证明我们解锁PA13和PA14的代码已经烧录进去,之后就可以使用Jlink直接下载啦
Erase Done.
Programming Done.
Verify OK.
* JLink Info: Reset: Halt core after reset via DEMCR.VC_CORERESET.
* JLink Info: Reset: Reset device via AIRCR.SYSRESETREQ.
Application running ...
Flash Load finished at 12:29:22
|