本帖最后由 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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>