STM32 JTAG失效恢复

昨天调试一块STM32L151的板子,用的是JlinkOB,调试时,出现下面的错误:
JLink Error:could not start CPU core.
JLink Warning:CPU could not be halted
这里写图片描述
这个错误出现的原因是,程序中有修改JTAG端口(PA13,PA14)的语句,当把JTAG当做普通IO口时,JLink就不能返回调试信息,JLink就读不回相应寄存器的值了。

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);    //完全失能JTAG/SWD

解决思路:
我们刚才既然把“错误”的程序写入了用户Flash,那么我们就用“正确”的程序去覆盖之间的程序。
解决方法:
1.修改BOOT0=1,BOOT1=0,STM32从system memory启动,这时用串口将程序下载进去,程序就会写入用户Flash,把之前“错误”的程序覆盖掉。
2.若BOOT已被固定,可使用芯片的RST(不是JTAG的RST),在Keil中,注意左下角的Scan,当扫描JLink SW接口的时候,我们使芯片一直处于复位状态,然后JLink就能被识别出来,这时我们把程序下进去,就可以覆盖之前的程序。这里要注意一点,JLink在芯片复位时被识别出来后,过一段时间就会又识别不出来,我们应该尽快将程序烧录进去。
3.用带有rst引脚的JLink,使用SEGGER自带的J-Link STM32 Unlock工具解锁STM32
这里写图片描述

这里写图片描述

还有关于JTAG引脚需不需要上下拉电阻的问题,由于JTAG口是和GPIO口复用的,GPIO模块是集成了上下拉电阻的,那么JTAG也是同样有着内部上下拉,复位时的上下拉情况如下:
● JNTRST: Internalpull-up
● JTDI: Internal pull-up
● JTMS/SWDIO: Internalpull-up
● TCK/SWCLK: Internalpull-down

对于有些调试器省去了RST引脚,21ic论坛的香水城版主是这样说的:
调试器拉一个信号控制目标MCU的复位引脚是个推荐的做法。抛开调试器不说,通常上位机和下位机之间除了数据通信之外,最好能够直接控制下位机复位,在出错或异常时进行直接控制。回到调试器来说,比如目标MCU上电就进入了低功耗或关闭了JTAG引脚,那么我的调试器在连接的时候,先把目标MCU复位,使得能够立刻在目标MCU运行起来到进入低功耗模式或关闭JTAG引脚之前,控制目标MCU的JTAG模块,并将目标MCU halt住。

【Reference】
http://bbs.21ic.com/icview-706970-1-1.html

原文地址:https://www.cnblogs.com/season-peng/p/6713507.html