ch32v208 flash读写问题

我在使用了蓝牙协议栈的工程中想实现iap功能,目前遇到的问题是从flash中读n字节数据,再写到flash时(例如将0x8030000做为起始地址,将后面0x10000个数据复制到0x8010000处)在下面程序中卡死。请问是不能同时对flash读写还是其他问题造成的?



Fun_Return dc_dfu_flash_write(uint32_t dest,  void const * p_src, uint32_t len)

{

    const char *p = p_src;

    uint32_t addr = dest;


//    __disable_irq();


    FLASH_Unlock_Fast();

    if(len >= 256){

        FLASH_ROM_WRITE(addr, (uint32_t*)p, len & ~0xFF);

        addr += len & ~0xFF;

        p += len & ~0xFF;

        len &= 0xFF;

    }

    FLASH_Lock_Fast();


    if(len){

        uint32_t word_buf;

        uint32_t world_len = (len + 3) / 4;

        FLASH_Unlock();

        for(uint32_t i = 0; i < world_len; i++){

            word_buf = (*(const uint32_t*)p);

            FLASH_ProgramWord(addr, word_buf);

            addr += 4;

            p += 4;

        }

        FLASH_Lock();

    }

//    __enable_irq();

    return FUN_SUCCESS;

}


1、蓝牙有OTA的无线升级功能,可以参考使用;

2、查看代码的编译结果,操作FLASH的地址大于编译的大小,如操作0x10000,则正好是蓝牙运行代码,可能会出现问题;


优化后已能写入任意字节,本函数使用时需要提前擦除写地址。

void dc_dfu_flash_write(uint32_t dest,  void const * p_src, uint32_t len)

{

    const char *p = p_src;

    uint32_t addr = dest;

    uint8_t data_buff[256];

//    __disable_irq();



    if(len >= 256)

        for (int var = 0; var < (len / 256); var++)

        {

            FLASH_Unlock_Fast();

            tmos_memcpy(data_buff, p, 256);

            FLASH_ProgramPage_Fast(addr, (uint32_t *)data_buff);

            FLASH_Lock_Fast();

            addr += 256;

            p += 256;

            len -= 256;

        }

    if(len){

        uint32_t word_buf;

        uint32_t world_len = (len + 3) / 4;

        FLASH_Unlock();

        for(uint32_t i = 0; i < world_len; i++){

            word_buf = (*(const uint32_t*)p);

            FLASH_ProgramWord(addr, word_buf);

            addr += 4;

            p += 4;

        }

        FLASH_Lock();

    }

//    __enable_irq();

}



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