我使用的是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 编辑 ]
此帖出自
小平头技术问答
不过似乎通过修改在这个芯片里面的程序来做到在复位后软件进入bootloder是不太可能的,因为bootloder会读这个管脚,低电平才进入bootloder。但是进入bootloder下读到的电平很可能是高,除非你自己在上位机上接个管脚过来控制,要是用按键的方式那也不是软件的方式了。用户又不能修改bootloder。
IAP的方式不知道行不行,代码也没看懂。
看到这很像是CM3的,原来v6版本的和v7版本的ARM确实很像啊在汇编体系结构上。
你的复位是用硬复位还是软复位?
应该是用软复位才能做到,硬复位是不行的。
流程是:
1.PIO0_1接到另一个管脚上,设置另一个管脚为输出,现在设置为低电平。
2.软复位。
因为软复位是不修改一般的寄存器的,所以,读到那个PIO0_1时,应该是会进入对应的模式的。前提是这里的那个另外的管脚不要被bootloder使用。
一周热门 更多>