在使用MCU的过程中,在开发环境正常已正常搭建(在Keil、J-Link驱动、packet包都已正确按照的情况下)、且可以正常烧录代码、正常运行程序的情况下,由于调整硬件电路、或者调整代码,在使用过程中遇到了无法识别J-Link、能识别但是无法烧录,或者烧录其它的简单代码可以运行,烧录自己编写的代码无法正常运行,以下总结了可能的异常情况及处理方法。
都是些基础的情况,然而实际应用中,会遇到各种各样的奇葩问题,光以下几点还远远不够。
1、自己的板子无法识别J-Link,用其它的板子可以识别J-Link
1.1检查MCU最小系统是否正常
1.1检查MCU最小系统是否正常
具体排查问题点 | 具体方案 |
VDDA电压、VDD电压是否正常 | 如果电压是3.3V,可以使用万用表测量到3.32V |
常见的电容是否连接上 |
对照最小系统电路,常见的稳压电容、滤除高频噪声信号的电容是否按推荐电路设计
|
复位电路 | 复位引脚电压是否为高电平、复位电路是否是按照手册常规电路 |
Boot电路 | Boot0引脚连接GND(虽然不会影响识别J-Link,也一起附加检查) |
时钟电路 | HSE时钟电路是否按照参考电路设计(如果有使用的话,也附加一起检查) |
JTAG电路 | JATG电路是否按照推荐的设计 |
1.2检查J-Link的复位引脚和MCU的NRST引脚是否正常连接
在keil中点击识别MCU、或者烧录的时候,JTAG会产生一个复位信号,如果一上电就立刻运行低功耗代码,或者一上电就立刻运行把调试引脚都配置为GPIO模式的代码,该复位信号复位MCU,在程序运行前识别J-Link。
如果该JTAG的复位信号未连接MCU的复位信号,又是一上电就运行上述提到的代码,可手工按键复位,然后立刻擦除Flash中的代码。擦除MCU Flash后,可识别J-Link。
2、能识别J-Link但是无法烧录
2、能识别J-Link但是无法烧录
具体排查问题点 | 具体方案 |
因为pack冲突,会显示无法下载 | 选择MCU对应的型号、对应的Flash烧录文件烧录 |
Flash读写保护,无法下载 |
a、可通过J-Flash的解除写保护
b、调整Boot引脚,从系统存储区启动,连接ISP软件,擦除选项字节中的写保护
c、编写“擦除修改选项中的写保护”代码,将代码烧录至SRAM运行(比较麻烦,建议使用上述2中)
|
3、能烧录,但是烧录后无法正常运行
具体排查问题点 | 具体方案 |
Flash等待周期异常 |
(1)超频情况下
例如,超频到120MHz时,需要配置4-5个Flash的等待周期
(2)降频情况下
例如频率降低到48MHz时,先进行时钟复位,Flash等待周期需要重新配置为1,而实际代码忘记配置。
|
数组越界访问 |
例如,明明定义了10个成员变量的数组,在读写时超过10个,此时会进入HardFault_Handler。
|
栈设置的太小 |
例如:调用的函数中定义了大的数组,但这个数组的范围大于栈的大小,程序在运行过程中可能会栈异常,进入HardFault_Handler。
可在startup_apm32f10x_hd.s文件中,结合MCU的SRAM大小、全局变量和静态变量的占用空间、程序中定义的局部变量代销调大Stack_Size。
|