GD32擦除写入内部flash的时候卡死,重启也不运行了

GD32用的STM32的标准库写的程序,在擦除写入内部flash的时候卡死,重启也不运行了,好像是程序部分被改动了,程序跑飞了似的。

经过反复查资料,好像是GD32的flash结构和STM32和flash 不太一样,所以用STM32的flash擦写函数,有的时候(应该说大多时候吧)是正常的,但是有的时候就会出现上面写的问题,甚至同一个程序下载到两块GD32芯片上,会出现一个正常,一个出错的现象。

我又下载了GD32的标准库,简单研究了一下,和STM32的定义名都不一样,如果用GD32的库又要从头研究,太费时候,最后索性把GD32标准库的flash部分移植到现有程序里面,结果还成功了。

下面分享一下代码

1、先把GD32库里的gd32_flash.c 和 gd32_flash.h复制过来(因为里面的代码太多,就不粘在这里了,直接复制加入到工程中就行了)

2、

本人花很长时候研究出来的方法,未经许可禁止转载


#define FMC_END_ADDR      ((uint32_t)0x0801FFFF)        ////flash结束地址

/////GD32专用的擦除页方法,每次调用擦除一个页

void fmc_erase_page(uint32_t Page_Address)

{

        fmc_unlock();  //解锁

    fmc_flag_clear(FMC_FLAG_BANK0_END);

    fmc_flag_clear(FMC_FLAG_BANK0_WPERR);

    fmc_flag_clear(FMC_FLAG_BANK0_PGERR);

        fmc_page_erase(Page_Address);

        fmc_flag_clear(FMC_FLAG_BANK0_END);

        fmc_flag_clear(FMC_FLAG_BANK0_WPERR);

        fmc_flag_clear(FMC_FLAG_BANK0_PGERR);

        fmc_lock();  //上锁

}



/////GD32专用的写入 address:要写入的地址,len长度,每个len写入4个字节,所以调用这个函数的时候 len的长度要设置为 str 的1/4

void fmc_program(uint32_t address,uint32_t* str, uint16_t len)

{

    fmc_unlock();

    uint8_t i = 0;

    while(address < FMC_END_ADDR && i < len){

        fmc_word_program(address, str[i]);

        address += 4;

        i++;

        fmc_flag_clear(FMC_FLAG_BANK0_END);

        fmc_flag_clear(FMC_FLAG_BANK0_WPERR);

        fmc_flag_clear(FMC_FLAG_BANK0_PGERR); 

    }

    fmc_lock();

}


-----------------------------------------------

后来测试,上面的方法好像也会出一样的问题,再后来咨询了GD公司的技术,改用GigaDevice_MCU_ISP_Programmer 这个下载软件给单片机下载程序,目前测试没发现问题

·关于我们·免责声明·服务条款·RSS订阅·dede168.com技术支持

Copyright © 1998-2015  All rights reserved.