我使用的是LPC11U34通过USB接收PC端的命令,在最开始的时候,如果MCU内没有firmware,那么,MCU会进入到默认的bootloader,即MCU枚举成一个MSC设备,然后通过将bin文件放到这个MSC设备内,来实现firmware的更新,我知道很多开发板上面都是使用一个按键在MCU复位时拉低PIO0_1以使MCU进入到bootloader从而枚举成MSC设备,但是现在我想要通过软件设置,当我通过USB接收到PC端的一个命令后(比如说接受到命令07 30 00 00 00 00 00 00 ),然后软件拉低PIO0_1,然后执行复位,但是,复位后并没有进入到bootloader即没有枚举成MSC设备,后来我发现,原因可能是MCU复位的时候,所有的IO都默认为输入高电平,这个时候我在复位之前将PIO0_1输出低电平没有意思,那么,请问各位,我要怎样做才能通过软件进入到bootloader呢?
补充:
经过查找资料,发现可以使用IAP命令强制进入到USB ISP模式,但是,将代码写好之后仍然不能进入到bootloader,代码如下:
static U32 u32BootCommand[5],u32BootResult[4];
/* IAP boot ROM location and access function */
#define IAP_ROM_LOCATION 0x1FFF1FF1UL
#define IAP_EXECUTE_CMD(a, b) ((void (*)())(IAP_ROM_LOCATION))(a, b)
#define IAP_CMD_REINVOKE_ISP 57
void msAPI_Flash_ReinvokeISP(void)
{
__disable_irq();
__set_MSP(*((uint32_t *) 0x1FFF0000));
u32BootCommand[0] = IAP_CMD_REINVOKE_ISP;
IAP_EXECUTE_CMD(u32BootCommand , u32BootResult);
__enable_irq();
}
void main(void)
{
/* make sure USB clock is turned on before calling ISP */
LPC_SYSCON->SYSAHBCLKCTRL |= 0x04000;
/* make sure 32-bit Timer 1 is turned on before calling ISP */
LPC_SYSCON->SYSAHBCLKCTRL |= 0x00400;
/* make sure GPIO clock is turned on before calling ISP */
LPC_SYSCON->SYSAHBCLKCTRL |= 0x00040;
/* make sure IO configuration clock is turned on before calling ISP */
LPC_SYSCON->SYSAHBCLKCTRL |= 0x10000;
/* make sure AHB clock divider is 1:1 */
LPC_SYSCON->SYSAHBCLKDIV = 1;
/*select IRC clock source*/
LPC_SYSCON->CLKOUTSEL = 0;
LPC_SYSCON->CLKOUTUEN = 1;
msAPI_Flash_ReinvokeISP();
}
[
本帖最后由 cc474231890 于 2013-3-7 16:51 编辑 ]
此帖出自
小平头技术问答
一周热门 更多>