LPC11U34 IAP命令进入USB ISP模式

2019-03-25 20:25发布

我使用的是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 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
cc474231890
1楼-- · 2019-03-26 01:57
_NXP LPC1000_ 没有人吗?求高手指点啊!
lr2131
2楼-- · 2019-03-26 05:36
原帖由 cc474231890 于 2013-3-8 18:00 发表
没有人吗?求高手指点啊!
没有玩过USB isp的片子。

不过似乎通过修改在这个芯片里面的程序来做到在复位后软件进入bootloder是不太可能的,因为bootloder会读这个管脚,低电平才进入bootloder。但是进入bootloder下读到的电平很可能是高,除非你自己在上位机上接个管脚过来控制,要是用按键的方式那也不是软件的方式了。用户又不能修改bootloder。

IAP的方式不知道行不行,代码也没看懂。

看到这很像是CM3的,原来v6版本的和v7版本的ARM确实很像啊在汇编体系结构上。

你的复位是用硬复位还是软复位?
应该是用软复位才能做到,硬复位是不行的。
流程是:
1.PIO0_1接到另一个管脚上,设置另一个管脚为输出,现在设置为低电平。
2.软复位。

因为软复位是不修改一般的寄存器的,所以,读到那个PIO0_1时,应该是会进入对应的模式的。前提是这里的那个另外的管脚不要被bootloder使用。

一周热门 更多>