新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2016-1-16
- 在线时间
- 5 小时
|
发表于 2016-1-16 14:10:16
|
显示全部楼层
本帖最后由 leizi163163 于 2016-1-16 14:11 编辑
我把这段完整的代码再粘一次。[mw_shl_code=c,true]#if STM32_FLASH_WREN //èç1ûê1ÄüáËD′
//2»¼ì2éμÄD′èë
//WriteAddr:Æeê¼μØÖ·
//pBuffer:êy¾YÖ¸Õë
//NumToWrite:°ë×Ö(16λ)êy
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u16 i;
for(i=0;i<NumToWrite;i++)
{
FLASH_ProgramHalfWord(WriteAddr,pBuffer);
WriteAddr+=2;//μØÖ·Ôö¼ó2.
}
}
//′óÖ¸¶¨μØÖ·¿aê¼D′èëÖ¸¶¨3¤¶èμÄêy¾Y
//WriteAddr:Æeê¼μØÖ·(′ËμØÖ·±ØDëÎa2μı¶êy!!)
//pBuffer:êy¾YÖ¸Õë
//NumToWrite:°ë×Ö(16λ)êy(¾íêÇòaD′èëμÄ16λêy¾Yμĸöêy.)
#if STM32_FLASH_SIZE<256
#define STM_SECTOR_SIZE 1024 //×Ö½ú
#else
#define STM_SECTOR_SIZE 2048
#endif
u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];//×î¶àêÇ2K×Ö½ú
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u32 secpos; //éèÇøμØÖ·
u16 secoff; //éèÇøÄúÆ«òÆμØÖ·(16λ×Ö¼ÆËã)
u16 secremain; //éèÇøÄúê£óàμØÖ·(16λ×Ö¼ÆËã)
u16 i;
u32 offaddr; //è¥μô0X08000000oóμÄμØÖ·
if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//·Ç·¨μØÖ·
FLASH_Unlock(); //½aËø
offaddr=WriteAddr-STM32_FLASH_BASE; //êμ¼êÆ«òÆμØÖ·.
secpos=offaddr/STM_SECTOR_SIZE; //éèÇøμØÖ· 0~127 for STM32F103RBT6
secoff=(offaddr%STM_SECTOR_SIZE)/2; //ÔúéèÇøÄúμÄÆ«òÆ(2¸ö×Ö½úÎa»ù±¾μ¥λ.)
secremain=STM_SECTOR_SIZE/2-secoff; //éèÇøê£óà¿Õ¼ä′óD¡
if(NumToWrite<=secremain)secremain=NumToWrite;//2»′óóú¸ÃéèÇø·¶Î§
while(1)
{
STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//¶á3öÕû¸öéèÇøμÄÄúèY
for(i=0;i<secremain;i++)//D£Ñéêy¾Y
{
if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//Dèòa2á3y
}
if(i<secremain)//Dèòa2á3y
{
FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//2á3yÕa¸öéèÇø
for(i=0;i<secremain;i++)//¸′ÖÆ
{
STMFLASH_BUF[i+secoff]=pBuffer;
}
STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//D′èëÕû¸öéèÇø
}
else
{
STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//D′òѾ-2á3yáËμÄ,Ö±½óD′èëéèÇøê£óàÇø¼ä.
}
if(NumToWrite==secremain)
break;//D′èë½áêøáË
else//D′èëÎ′½áêø
{
secpos++; //éèÇøμØÖ·Ôö1
secoff=0; //Æ«òÆÎ»ÖÃÎa0
pBuffer+=secremain; //Ö¸ÕëÆ«òÆ
WriteAddr+=secremain; //D′μØÖ·Æ«òÆ
NumToWrite-=secremain; //×Ö½ú(16λ)êyμY¼õ
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//ÏÂò»¸öéèÇø»1êÇD′2»íê
else secremain=NumToWrite;//ÏÂò»¸öéèÇø¿éòÔD′íêáË
}
};
FLASH_Lock();//éÏËø
}
#endif[/mw_shl_code]
|
|