打印
[应用相关]

STM32Flash擦出和编写

[复制链接]
921|6
手机看帖
扫描二维码
随时随地手机跟帖
楼主
Rangar| | 2017-11-20 20:50 | 显示全部楼层 回帖奖励 |倒序浏览
/**************************************************************************************
* FunctionName   : FLSEraseFlash()
* Description    : Flash擦除
* EntryParameter : sAddr - 起始地址,eAddr - 结束地址,pageSize - 页大小
* ReturnValue    : None
**************************************************************************************/
void FLSEraseFlash(u32 sAddr, u32 eAddr, u32 pageSize)
{
    u8 i, maxPag;
    volatile FLASH_Status fshStu = FLASH_COMPLETE;
   
    maxPag = (eAddr - sAddr) / pageSize;                                        // 页数
    FLASH_Unlock();                                                             // 解锁的闪存程序擦除控制器
    FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
   
    for (i=0; ((i
    {
        fshStu = FLASH_ErasePage(sAddr + (pageSize * i));                       // 擦除FLASH页
    }
   
    FLASH_Lock();                                                               // 锁Flash
}
复制代码
/**************************************************************************************
* FunctionName   : FLSWriteFlash()
* Description    : 写Flash
* EntryParameter : wrtAddr - 写地址,pDat - 数据,len - 数据长度
* ReturnValue    : 成功返回0,否则返回1
**************************************************************************************/
u8 FLSWriteFlash(u32 wrtAddr, u8 *pDat, u32 len)
{
    u8  times = 0;
    u16 i;
    u32 wrtDat = 0, reaDat = 0;                                                 // 读写缓冲
    u32 addr = wrtAddr;
   
    FLASH_Unlock();                                                             // 解锁的闪存程序擦除控制器
    for (i=0; i
    {
        wrtDat = (pDat[i+0]<<0) + (pDat[i+1]<<8) + (pDat[i+2]<<16) + (pDat[i+3]<<24);                           
        
        do
        {
            times++;
            FLASH_ProgramWord(addr, wrtDat);                                    // 写Flash
            reaDat = FLSReadDword(addr);                                        // 读Flash
            
        } while ((reaDat != wrtDat) && (times < 5));
        
        if (times == 0)                                                         // 读写错误
        {
            FLASH_Lock();                                                       // 锁Flash
            return 1;
        }
        
        times = 0;
        addr += 4;                                                              // 偏移地址
    }
   
    FLASH_Lock();                                                               // 锁Flash
    return 0;
}

使用特权

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

本版积分规则