遇到一个奇葩的问题:CH32V203C8T6做IAP程序,一下载就死机。

此芯片共64K Flash,分区如下:

//0x08000000 - 0x08007800 : IAP - 30K - bootloader

//0x08007800 - 0x0800F800 : APP - 32K - 储存本ROM运行内容

//0x0800F800 - 0x08010000 : DAT - 2K -  用户数据


在IAP的程序里面,在下载之前会先清掉原来的APP部分程序:

    //save to the location

    FLASH_Unlock_Fast();

    FLASH_EraseBlock_32K_Fast(0x08007800);

    FLASH_Lock_Fast();

------------------------
非常奇怪,一运行到这行  FLASH_EraseBlock_32K_Fast(0x08007800)就死机了。
而且下面的回调没有被执行,只能强制断电才能恢复。

void HardFault_Handler(void)

{

    printf("mepc  :%08x\r\n", __get_MEPC());

    printf("mcause:%08x\r\n", __get_MCAUSE());

    printf("mtval :%08x\r\n", __get_MTVAL());

    while(1);

}


注:IAP的编辑的信息

image.png

IAP的fd信息

FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K


IAP设置跳转的信息:

void SW_Handler(void)

{

    printf("start user APP\r\n");

    __asm("li  a6, 0x7800");

    __asm("jr  a6");

    while(1);

}


但使用相同思想,在CH32V307上没有问题(已经量产了)。


您好,目前从提供信息没看出什么问题,若方便可将可复现问题的工程发我邮箱(lzs@wch.cn)具体看一下。解锁擦除之后,可在写入完成后再上锁,可将32K字节的擦除换成256字节擦除试一下,具体可参考EVT IAP例程中的擦写方式;注意一下程序中系统主频的大小设置,若设置为144MHz的话,注意进行一下2分频,如下图。此外,可单步调试看一下具体是卡死在哪个位置。

image.png


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