标题:
Fu68xx单片机的flash读写代码如何理解?
[打印本页]
作者:
1314love
时间:
2022-8-3 14:30
标题:
Fu68xx单片机的flash读写代码如何理解?
请问各位大佬们 怎么理解这两段单片机代码
/*-------------------------------------------------------------------------------------------------
Function Name : uint8 Get4ByteFromFlash(uint8 xdata *BlockStartAddr)
Description : 从目标FLASH扇区读取4字节最新写入的数据
Input : uint8 xdata *BlockStartAddr:目标FLASH扇区
Output : 读出的数据
-------------------------------------------------------------------------------------------------*/
uint32 Get4ByteFromFlash(uint8 xdata *BlockStartAddr)
{
uint8 xdata *FlashStartAddr = BlockStartAddr;
uint8 i;
uint32 tempofFlashData;
for(i=0;i<32;i++)
{
tempofFlashData = *(uint32 code *)(FlashStartAddr + 4*i);
if(tempofFlashData==0)
{
if(i!=0)
{
tempofFlashData = *(uint32 code *)(FlashStartAddr + 4*(i-1));
return tempofFlashData;
}
else
{
return 0;
}
}
else
{
if(i==31)
{
return tempofFlashData;
}
}
}
return 0;
}
/*-------------------------------------------------------------------------------------------------
Function Name : void Write4Byte2Flash(uint8 xdata *BlockStartAddr,uint32 NewData2Flash)
Description : 写入4个字节到FLASH
Input : uint8 xdata *BlockStartAddr:目标FLASH地址 NewData2Flash:被写入数据
Output : 无
-------------------------------------------------------------------------------------------------*/
#if 1
void Write4Byte2Flash(uint8 xdata *BlockStartAddr,uint32 NewData2Flash)
{
uint8 xdata *FlashStartAddr = BlockStartAddr;
uint32 tempofFlashData=0;
uint32 tempofNewFlashData=0;
uint8 i;
FLASHUsingStatus=1; //FLASH正在使用
tempofNewFlashData = NewData2Flash;
for(i=0;i<32;i++)
{
tempofFlashData = *(uint32 code *)(FlashStartAddr+4*i);
if(tempofFlashData==0)
{
tempofFlashData = (tempofNewFlashData>>24)&0x000000ff;
Flash_Sector_Write((FlashStartAddr+4*i),(uint8)tempofFlashData);
_nop_();
tempofFlashData = (tempofNewFlashData>>16)&0x000000ff;
Flash_Sector_Write((FlashStartAddr+4*i+1),(uint8)tempofFlashData);
_nop_();
tempofFlashData = (tempofNewFlashData>>8)&0x000000ff;
Flash_Sector_Write((FlashStartAddr+4*i+2),(uint8)tempofFlashData);
_nop_();
tempofFlashData = tempofNewFlashData&0x000000ff;
Flash_Sector_Write((FlashStartAddr+4*i+3),(uint8)tempofFlashData);
_nop_();
break;
}
else
{
if(i==31)
{
Flash_Sector_Erase(FlashStartAddr);
_nop_();
tempofFlashData = (tempofNewFlashData>>24)&0x000000ff;
Flash_Sector_Write((FlashStartAddr),(uint8)tempofFlashData);
_nop_();
tempofFlashData = (tempofNewFlashData>>16)&0x000000ff;
Flash_Sector_Write((FlashStartAddr+1),(uint8)tempofFlashData);
_nop_();
tempofFlashData = (tempofNewFlashData>>8)&0x000000ff;
Flash_Sector_Write((FlashStartAddr+2),(uint8)tempofFlashData);
_nop_();
tempofFlashData = tempofNewFlashData&0x000000ff;
Flash_Sector_Write((FlashStartAddr+3),(uint8)tempofFlashData);
_nop_();
}
}
}
FLASHUsingStatus=0; //FLASH空闲
}
作者:
man1234567
时间:
2022-8-4 08:17
对照产品说明书就很好理解。
对于小众产品,除非特殊需要,一般人不会研究的
作者:
haiyang201
时间:
2022-8-5 13:44
注释里面不是写的很清楚吗?就是读写操作
作者:
1314love
时间:
2022-8-5 15:19
tempofFlashData = (tempofNewFlashData>>24)&0x000000ff就是他右移这个我不理解
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1