• 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

  • 相关阅读:
    hdu 5115 Dire Wolf 区间DP
    泛型兼容的注意事项
    maven web项目不能创建src/main/java等文件夹的问题
    error the @annotation pointcut expression is only supported at Java 5
    HashSet重复元素判断
    oracle 分库分表(sharding)
    关系型数据库分库分表解决方案
    JDK7中匿名内部类中使用局部变量要加final,JDK8中不需要,但jdk会默认加上final
    eclipse中更改配置使得switch语句不出错
    java io流中怎么在一个文本中追加字符串
  • 原文地址:https://www.cnblogs.com/season-peng/p/6713507.html
Copyright © 2020-2023  润新知