打印

求助一下GD32E103C8闪存编程FMC问题

[复制链接]
1013|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 加油吧!宝宝! 于 2020-9-23 21:59 编辑

为什么读出来的数据全是0xFFFF,是否意味着我没写成功。编程或擦除的地址是当前页的起始地址,都在闪存基地址范围内,也没有和存储代码的地址重叠,可就是读出来的数据全是0xFFFF。我百思不得其解,求各位大佬帮帮忙,谢谢!


截取自用户使用手册
闪存页大小为1KB。主存储闪存的每页都可以单独擦除。
GD32E10x闪存基地址和构成                                       

第0页      0x0800 0000~0x0800 03FF     1KB
第1页      0x0800 0400~0x0800 07FF     1KB
第2页      0x0800 0400~0x0800 0BFF     1KB
    .      
    .
    .
第127页   0x0801 FC00~0x0801 FFFF    1KB



附部分代码:
#define FMC_PAGE_SIZE                  ((uint16_t)0x400U) //1k
#define FMC_WRITE_START_ADDR    ((uint32_t)0x08010400U)
#define FMC_WRITE_END_ADDR       ((uint32_t)0x08010800U)

uint32_t *ptrd;
uint32_t address = 0x00;
uint32_t data0   = 0x01234567U;
uint32_t data1   = 0xd583179bU;

/* 计算有多少页要编程或擦除 */
uint32_t PageNum = (FMC_WRITE_END_ADDR - FMC_WRITE_START_ADDR) / FMC_PAGE_SIZE;
/* 计算有多少字要编程或擦除 */
uint32_t WordNum = ((FMC_WRITE_END_ADDR - FMC_WRITE_START_ADDR) >> 2);

void fmc_erase_pages(void)
{
    uint32_t EraseCounter;

    /* unlock the flash program/erase controller */
    fmc_unlock();

    /* clear all pending flags */
    fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR);
   
    /* erase the flash pages */
    for(EraseCounter = 0; EraseCounter < PageNum; EraseCounter++){
        fmc_page_erase(FMC_WRITE_START_ADDR + (FMC_PAGE_SIZE * EraseCounter));
        fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR);
    }

    /* lock the main FMC after the erase operation */
    fmc_lock();
}

void fmc_program(void)
{
    /* unlock the flash program/erase controller */
    fmc_unlock();

    address = FMC_WRITE_START_ADDR;

    /* program flash */
    while(address < FMC_WRITE_END_ADDR){
        fmc_word_program(address, data0);
        address += 4;
        fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR );
    }

    /* lock the main FMC after the program operation */
    fmc_lock();
}








使用特权

评论回复
沙发
加油吧!宝宝!|  楼主 | 2020-9-25 16:22 | 只看该作者
结帖!问题已解决!把固件库更新到1.04版本就可以了!

使用特权

评论回复
板凳
lvben5d| | 2020-9-28 14:27 | 只看该作者
本帖最后由 lvben5d 于 2020-9-28 14:42 编辑

GD32E103  的USB不是只支持 FS 全速模式吗?  库文件的USB库里  出现了  宏定义  全速#ifdef USE_USBHS    #define USBHS_CORE
#endif /* USE_USBHS */

如果这个器件不支持,尽量不要在对应LIB里弄这个,引起歧义。 估计是写USB的兄弟,在其他高端芯片上支持的,就套用了。


使用特权

评论回复
地板
AuroraWU| | 2020-10-12 16:06 | 只看该作者
加油吧!宝宝! 发表于 2020-9-25 16:22
结帖!问题已解决!把固件库更新到1.04版本就可以了!

固件库能否给我发一份呢?谢谢!我也是一样的问题,擦写无反应,一直都是FF

使用特权

评论回复
5
加油吧!宝宝!|  楼主 | 2020-10-13 09:22 | 只看该作者
本帖最后由 加油吧!宝宝! 于 2020-10-13 16:17 编辑
AuroraWU 发表于 2020-10-12 16:06
固件库能否给我发一份呢?谢谢!我也是一样的问题,擦写无反应,一直都是FF ...

其实固件库1.03和1.04都没问题!!!
我的MCU型号是GD32E103C8,说明书上说FMC支持16bit和32bit编程,实际上不支持16bit编程。
我当初写的代码是16bit编程,数据是写不进内置flash的,所以读取的数据都是0xFFFF。
然后我打电话问GD的技术支持,他说GD32E103C8的FMC不支持16bit编程(其他系列的不清楚),坑爹啊!
所以我又换回32bit,成功了,另外64bit也支持。

固件库在GD的官网可以下载,使用手册,例程都有的!加油!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

27

帖子

0

粉丝