ISP“二进宫”问题(后续) Ø 问题描述
前些时候,小编曾分享过 《ISP“二进宫”问题》,文章里介绍了如何调用IAP 指令集中的Reinvoke ISP指令(如图1所示),使得LPC1549能够成功地从application重新跳回到USB ISP bootloader中,而这次的MCU主角换成了LPC54114,虽然问题相似,但造成的原因却是有差异的。具体问题如下:客户使用LPC54114过程中,想实现程序从应用程序到ROM bootloader的跳转,FLASHIAP_Reinvoke()跳转函数如下所示,函数内就调用的是Reinvoke ISP指令,跳转函数执行后,代码会一直停留在0x03004d2e,表明程序确已跳转到ROM bootloader区域,紧跟着连接USB口,USB MSC枚举并没有成功(如图2所示),使得MCU真正进入到USB ISP 模式。 图1 ReinvokeISP指令 - static status_t translate_iap_status(uint32_t status)
- {
- /* Translate IAP return code to sdk status code */
- if (status == kStatus_Success)
- {
- return status;
- }
- else
- {
- return MAKE_STATUS(kStatusGroup_FLASHIAP, status);
- }
- }
- static INLINE void iap_entry1(unsigned int cmd_param[5], unsigned int status_result[4])
- {
- ((IAP_ENTRY_T)0x03000205)(cmd_param, status_result);
- }
- status_t FLASHIAP_Reinvoke()
- {
- uint32_t command[5], result[4];
- command[0] = 57;
- command[1] = 2;
- command[2] = 0;
- command[3] = 0;
- iap_entry1(command, result);
- return translate_iap_status(result[0]);
- }
复制代码图2 枚举失败 Ø 问题解决 经测试发现,让MCU成功地从应用工程再次进入USB ISP 模式,需要以下两个条件:1.USB口需要提前连接(在调用FLASHIAP_Reinvoke()函数之前);2.时钟配置复原为默认形式,即使用FRO 12 MHz启动的初始状态。 |