CH582运行时进入ISP的方法

把这段代码加入到你的工程里,可以实现不断电,不下拉PB22,直接进入ISP模式做USB升级。

void run_romisp(void)
{
    // 这里读一下CSR, 触发异常进入机器模式。
    // 如果已经是机器模式则继续运行。
    PRINT("mstatus=%08x\n", read_csr(mstatus));

    PFIC->IRER[0] = 0xffffffff;
    PFIC->IRER[1] = 0xffffffff;

    // 复制固件代码到ram
    memcpy((void*)0x20003800, (void*)0x000780a4, 0x2500);
    // 0x200038be是检测PB22的。这里让它强制返回1,跳过检测。
    *(uint16_t*)0x200038be = 0x4505; // li a0, 1
    // 清BSS
    memset((void*)0x20005c18, 0, 0x04a8);

    // 设置运行环境并跳转
    __asm__("la gp, 0x20006410\n");
    __asm__("la sp, 0x20008000\n");
    write_csr(mstatus, 0x88);
    write_csr(mtvec, 0x20003801);
    write_csr(mepc, 0x20004ebc);
    __asm__("mret");
    __asm__("nop");
    __asm__("nop");
}


void HardFault_Handler(void)
{
    run_romisp();
    while(1);
}

另外经测试:

  1. Bootloader并没有检测复位类型,即非上电复位也可进入ISP。

  2. ISP超时时间是1分钟,而不是10s。

运行时跳入boot,可以通过将FLASH前4字节擦除,则认为芯片无APP代码,并在boot中等待10s,可以使用软复位。

超时时间为1min,是使用了有数据线的供电如typec给开发板供电,因此boot等待了1min。如果仅供电无数据线传输则等待时间为10s。

用户程序跳转进入boot参考:

CH573 CH582 用户程序跳转进BOOT - debugdabiaoge - 博客园 (cnblogs.com)


弄这个主要是考虑到,内置电池供电的产品,用户无法实现断电再上电的操作。如果擦除了flash又没有及时升级,产品就废了。我这个方式是安全的。

之前有搜索到这个帖子: https://www.wch.cn/bbs/thread-91177-1.html


直接调用软复位,就可以进入到原厂的boot。务必注意FLASH擦除的返回值判断是否生效。

针对产品开发功能,建议是写一个iap升级程序,然后根据功能进行调整。原厂的boot会有超时时间,超时时间到则会退出boot,需要重新上电才会进入。因此如果需要一直在boot中可以自己写一个iap升级,参考例程iap,这也是我们所推荐的方式。


很好的经验


只有登录才能回复,可以选择微信账号登录