本文最值得关注的内容就是系统函数调用,导致系统进入低功耗模式,进而引起JLink下载失败。之后也就是介绍相关细节了,没有兴趣的可以直接掠过。
我在开发中遇到奇怪的下载问题,Keil5下载程序正常,JLink下载失败,但Jlink可以读芯片存储内容,可以擦除,但写入过程总是报错“Timeout while Programming sector,core does not stop... Program failed. Failed auto program target”。
硬件问题
一开始怀疑是硬件问题,怀疑电路缺少元器件(关键部分未焊接)致使电源不稳定,影响程序下载。后续,只焊接芯片最小系统,采用JTAG供电,进行调试。硬件最大的问题就是PCB板下载接口标识不清晰,下载接口需要一根一根对着原理图反复接线,引起接线错误(影响使用者心情)。这个问题没有什么好关注的,只希望大家拿到的电路板都标识清晰,有专用的接线工具。
在使用领慧公司样板的时候,同事下载失败,第二天一起看了下,样板设计了防反接的JTAG下载接口,但JLink监测不到芯片。看了领慧公司的使用说明文档,才发现整个开发板没有连接任何跳线帽,用万用表测量引脚电压才发现,MCU供电失败,按照使用说明安装跳线帽后,就可以正常工作了。
软件问题
在介绍软件问题前,本文先对JLink进行简单介绍。JLink软件默认安装位置为C:\Program Files\SEGGER\JLink\Devices。常用、外国大厂JLink默认集成它们公司的软件支持包。其它公司芯片需要手动安装设备支持包,eg:Arm Keil | FMSH FM33LE0XX_DFP。否则只能选择芯片内核进行操作,例如:Cortex-M0,Cortex-M3,RISCV等。
安装设备支持包后,就可以选中对应的芯片型号,以下图为例,安装支持包后,用户就可以直接选择 FM33LE02x(复旦微电子公司的MCU)。
芯片型号选择错误,可能也可以连接上芯片,可以擦除,但是Flash、RAM区域配置不一样,也会导致下载失败,希望开发者不要犯这种低级错误。后面的才是重头戏,主要说两种,分别是没有开启JTAG下载引脚复用,另一个就是芯片进入低功耗模式。
void pmu_init(void) { FL_PMU_SetLowPowerMode(PMU, FL_PMU_POWER_MODE_ACTIVE_OR_LPACTIVE);//active or lpactive mode FL_PMU_SetLDOLowPowerMode(PMU, FL_PMU_LDO_LPM_ENABLE);//DISABLE);//ENABLE); //lp active mode }FL_PMU_SetLowPowerMode(PMU, FL_PMU_POWER_MODE_ACTIVE_OR_LPACTIVE):将芯片电源模式设置为“活动或低功耗活动模式”。FL_PMU_SetLDOLowPowerMode(..., FL_PMU_LDO_LPM_ENABLE):使能 LDO 低功耗模式。这两个配置同时生效时,芯片会进入 LP Active(低功耗活动)模式。在此模式下,JTAG(SWD)的SWCLK 、SWIO 被配置为数字功能加上拉或外部上拉。JTAG功能引脚被取消复用,自然也就无法下载程序。最神奇的时Keil5居然可以下载,要不是使用JLink试了下,直接把带有低功耗配置的hex发给客户,就丢人丢到公司外面了。也正是因为这个函数,没有以代码形式、显式配置引脚,取消引脚复用,所以我一开始没注意到这点,只能通过控制变量,一点一点注释功能代码,花了些时间才发现这个问题。以前用STM32CubeIDE的时候忘记配置JTAG引脚复用,导致下载失败,大家要引以为戒哦。