关于FLASH模拟EEPROM实验,小弟有2点疑问,恳请指教

2019-07-20 19:09发布

本帖最后由 liuchang 于 2016-11-1 00:25 编辑

如下代码是原子的F4的源码,小弟关于这个函数有2个疑问,在程序的注释部分,恳请大神帮忙指教~~~谢谢~~~

[mw_shl_code=c,true]void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{
  FLASH_Status status = FLASH_COMPLETE;
        u32 addrx=0;
        u32 endaddr=0;        
  if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;        
        FLASH_Unlock();                                                               
  FLASH_DataCacheCmd(DISABLE);
                 
        addrx=WriteAddr;               
        endaddr=WriteAddr+NumToWrite*4;        
        if(addrx<0X1FFF0000)                        
        {
                while(addrx<endaddr)        
                {
                        if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF) //问题1:这个读函数没有判断BUSY状态,也就是没有使用if(FLASH_WaitForLastOperation ==FLASH_COMPLETE),这样会不会有潜在的风险???
//我看视频也说了,在读的时候不能写,在写的时候不能读,也就是总线不能被同时占用,是这个意思吧?恳请大神指教~~~
                        {
//问题2:FLASH_EraseSector()函数是直接擦除整个扇区吧?这个没问题吧?那假设我在addrx地址和addrx+4地址,甚至addrx+8的地址的值都不是0xFFFFFFFF,
//那是不是我需要将这个指定的扇区擦除3次,我觉得,这里是不是会导致重复擦除同一个扇区的问题,恳请大神指教~~~
                                status=FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);
                                if(status!=FLASH_COMPLETE)break;
                        }else addrx+=4;
                }
        }
        if(status==FLASH_COMPLETE)
        {
                while(WriteAddr<endaddr)
                {
                        if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)
                        {
                                break;        
                        }
                        WriteAddr+=4;
                        pBuffer++;
                }
        }
  FLASH_DataCacheCmd(ENABLE);        
        FLASH_Lock();
} [/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。