stm32F103C写flash操作问题
在f103板子上想把用户信息保存在Flash上,用cubemx生成的库封装写函数,但是一直不能使用,主要是对FLASH_EraseInitTypeDef参数不知道怎么使用,一用就开机不了,连仿真都进不去main函数,函数如下:void testFlashWrite(void){
FLASH_EraseInitTypeDef pEraseInit={0};
uint32_t PageError = 0,dstAddr = FLASH_BASE+2048;//FLASH_BASE=0x08000000
uint32_t pdata = 0x12345678;
//FLASH_EraseInitTypeDef 参数配置是否对???
pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
pEraseInit.Banks= FLASH_BANK_1;
pEraseInit.NbPages = (dstAddr-FLASH_BASE)/FLASH_PAGE_SIZE;
pEraseInit.PageAddress =(dstAddr-FLASH_BASE)%FLASH_PAGE_SIZE;
HAL_FLASH_Unlock();
HAL_FLASHEx_Erase(&pEraseInit,&PageError);//一打开此函数,就不能开机,连仿真都进不去
//FLASH_PageErase(dstAddr);
//HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,dstAddr,(uint64_t)pdata);
HAL_FLASH_Lock();
}第一次来论坛发帖求助,不知道有没用,调试了两天没辙。。。希望有高手帮忙,谢谢!
file:///C:\Users\chuhong\AppData\Roaming\Tencent\Users\946477057\QQ\WinTemp\RichOle\_JC9VR`4%22]~ME}A1SCVRA.png
file:///C:\Users\chuhong\AppData\Roaming\Tencent\Users\946477057\QQ\WinTemp\RichOle\_JC9VR`4%22]~ME}A1SCVRA.png
HAL_FLASHEx_Erase(&pEraseInit,&PageError);//一打开此函数,就不能开机,连仿真都进不去
这个是擦除整个flash还是部分?是不是把程序空间也擦除了?我用的标准库,没出个问题 00-405686 发表于 2016-9-7 14:31
HAL_FLASHEx_Erase(&pEraseInit,&PageError);//一打开此函数,就不能开机,连仿真都进不去
这个是擦除整个f ...
谢谢答复!
HAL_FLASHEx_Erase传入的参数在上面有配置,我根据自己理解设置的,应该擦除的是页,一页1k,能不能把你的代码让我看下呢,另外flash地址是0x08000000开始是吧? flash地址是应该往后放,我都是放在最后,如flashGPRSMODULETYPE_ADDR 0x0807C000
void vSaveHWInfo(char* pBuf)
{
u32 i;
u32 tmp;
u32 addr;
FLASH_Status FLASHStatus;
FLASHStatus = FLASH_COMPLETE;
/* Unlock the Flash Program Erase controller */
FLASH_Unlock();
/* Clear All pending flags */
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
/* Erase the FLASH pages */
FLASHStatus = FLASH_ErasePage(GPRSMODULETYPE_ADDR);
if(FLASHStatus != FLASH_COMPLETE)
return ;
/*FLASH Word program of data 0x15041979 at addresses defined by StartAddr and EndAddr*/
addr = GPRSMODULETYPE_ADDR;
tmp = (u32)pBuf;
for(i = 0; i < 36; i++)
{
FLASHStatus = FLASH_ProgramWord(addr, *(u32*)tmp);
if(FLASHStatus != FLASH_COMPLETE)
return ;/* Check the corectness of written data */
addr += 4;
tmp += 4;
}
FLASH_Lock();
}
王子不赖 发表于 2016-9-7 14:42
谢谢答复!
HAL_FLASHEx_Erase传入的参数在上面有配置,我根据自己理解设置的,应该擦除的是页,一页1k, ...
起始地址是对的,不过正常情况下程序放的地址是从0x08000000开始的 oktigerxia 发表于 2016-9-7 16:10
flash地址是应该往后放,我都是放在最后,如flashGPRSMODULETYPE_ADDR 0x0807C000
void vSaveHWInfo(cha ...
谢谢答复,我查资料也看到这些操作1.FLASH_Unlock;2.FLASH_ClearFlag;3.FLASH_ErasePage;4.FLASH_ProgramWord;因为我是用cubumx生成的库,所以没有2.FLASH_ClearFlag这个接口,上网找了替代方法是是把第2,3换HAL_FLASHEx_Erase;
因为我用的是f103c8,只有64k,我也试过从后面地址写,但是没有写成功(不会死机),不知道还有其他漏掉的细节没? 00-405686 发表于 2016-9-7 16:15
起始地址是对的,不过正常情况下程序放的地址是从0x08000000开始的
谢谢,我也试过了从后面开始写 ,不过不会死机了, 就是写后没有效果,数据还是fff。。。 学习一下 自己结贴,最后发现果然是pEraseInit的参数配错,pEraseInit.NbPages =1;//这里配置为1就行了, 一直理解是从第几页开始擦除,其实他意思是擦除多少页。另外如果开了看门狗,必须在擦除和写之前关闭,操作完成之后再打开,我使能的是窗口看门狗,所以接口为HAL_WWDG_MspDeInit和HAL_WWDG_MspInit
页:
[1]