王子不赖 发表于 2016-9-7 12:02:00

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


00-405686 发表于 2016-9-7 14:31:25

HAL_FLASHEx_Erase(&pEraseInit,&PageError);//一打开此函数,就不能开机,连仿真都进不去
这个是擦除整个flash还是部分?是不是把程序空间也擦除了?我用的标准库,没出个问题

王子不赖 发表于 2016-9-7 14:42:19

00-405686 发表于 2016-9-7 14:31
HAL_FLASHEx_Erase(&pEraseInit,&PageError);//一打开此函数,就不能开机,连仿真都进不去
这个是擦除整个f ...

谢谢答复!
HAL_FLASHEx_Erase传入的参数在上面有配置,我根据自己理解设置的,应该擦除的是页,一页1k,能不能把你的代码让我看下呢,另外flash地址是0x08000000开始是吧?

oktigerxia 发表于 2016-9-7 16:10:50

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();               
}

00-405686 发表于 2016-9-7 16:15:36

王子不赖 发表于 2016-9-7 14:42
谢谢答复!
HAL_FLASHEx_Erase传入的参数在上面有配置,我根据自己理解设置的,应该擦除的是页,一页1k, ...

起始地址是对的,不过正常情况下程序放的地址是从0x08000000开始的

王子不赖 发表于 2016-9-7 17:52:05

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,我也试过从后面地址写,但是没有写成功(不会死机),不知道还有其他漏掉的细节没?

王子不赖 发表于 2016-9-7 17:53:59

00-405686 发表于 2016-9-7 16:15
起始地址是对的,不过正常情况下程序放的地址是从0x08000000开始的

谢谢,我也试过了从后面开始写 ,不过不会死机了, 就是写后没有效果,数据还是fff。。。

yfy123 发表于 2016-9-8 09:13:00

学习一下

王子不赖 发表于 2016-9-9 11:44:17

自己结贴,最后发现果然是pEraseInit的参数配错,pEraseInit.NbPages =1;//这里配置为1就行了, 一直理解是从第几页开始擦除,其实他意思是擦除多少页。另外如果开了看门狗,必须在擦除和写之前关闭,操作完成之后再打开,我使能的是窗口看门狗,所以接口为HAL_WWDG_MspDeInit和HAL_WWDG_MspInit
页: [1]
查看完整版本: stm32F103C写flash操作问题