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.