本帖最后由 小恩GG 于 2018-9-21 13:57 编辑
ISP“二进宫”问题 Ø 问题描述 客户碰到如下问题: LPC1549 IAP 指令集中的ReinvokeISP指令可以将MCU从application重新跳转到ISP bootloader内,具体内容如图1所示,客户按照图1的要求调用Reinvoke ISP想实现跳转回ISP USB bootloader,具体代码如下,代码被执行后,MCU连接PC的USB口,但LPC1549并没有被PC识别出(如图2所示)。 图1 ReinvokeISP - // ============================================================================
- // Reset with USB ISP mode selected
- // ============================================================================
- uint32_t command_param[5] = { IAP_REINVOKE_ISP_CMD, 2, 0, 0, 0 }; // 2=USB
- uint32_t status_result[5];
- void AppReset_Enter_USB_ISP_mode(void)
- {
- __disable_irq();
- // make sure USB clock is turned on before calling ISP
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_USB);
- // make sure GPIO clocks are turned on before calling ISP
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO0);
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO1);
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO2);
- // make sure IO configuration clock is turned on before calling ISP
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON);
- // make sure AHB clock divider is 1:1
- Chip_Clock_SetSysClockDiv(1);
- iap_entry (command_param,status_result);
- }
复制代码图2 USB识别错误 Ø 问题解决
经测试,只要将__disable_irq();代码行注释后,AppReset_Enter_USB_ISP_mode即可工作,推测在ROMbootloader里的代码有使用到中断,而当执行__disable_irq();后,会禁止掉全部的可编程中断,导致ROM bootloader代码无法正常工作。 |