初级会员

- 积分
- 79
- 金钱
- 79
- 注册时间
- 2018-7-10
- 在线时间
- 16 小时
|
2金钱
STM32F030 flash程序和STM32F103 flash程序一样么,我按照103的程序下进去,存不了
#include "stm32f0xx_flash.h"
#include "stmflash.h"
#include "common.h"
//¶Áȡָ¶¨µØÖ·µÄ°ë×Ö(16λÊý¾Ý)
//faddr:¶ÁµØÖ·(´ËµØÖ·±ØÐëΪ2µÄ±¶Êý!!)
//·µ»ØÖµ:¶ÔÓ¦Êý¾Ý.
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *( uint16_t*)faddr;
}
#if STM32_FLASH_WREN //Èç¹ûʹÄÜÁËд
//²»¼ì²éµÄдÈë
//WriteAddr:ÆðʼµØÖ·
//pBuffer:Êý¾ÝÖ¸Õë
//NumToWrite:°ë×Ö(16λ)Êý
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u16 i;
for(i=0;i<NumToWrite;i++)
{
FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
WriteAddr+=2; //µØÖ·Ôö¼Ó2.
}
}
//´ÓÖ¸¶¨µØÖ·¿ªÊ¼Ð´ÈëÖ¸¶¨³¤¶ÈµÄÊý¾Ý
//WriteAddr:ÆðʼµØÖ·(´ËµØÖ·±ØÐëΪ2µÄ±¶Êý!!)
//pBuffer:Êý¾ÝÖ¸Õë
//NumToWrite:°ë×Ö(16λ)Êý(¾ÍÊÇҪдÈëµÄ16λÊý¾ÝµÄ¸öÊý.)
#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; //È¥µô0X08000000ºóµÄµØÖ·
if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return; //·Ç·¨µØÖ·
FLASH_Unlock(); //½âËø
offaddr=WriteAddr-STM32_FLASH_BASE; //ʵ¼ÊÆ«ÒÆµØÖ·.
secpos=offaddr/STM_SECTOR_SIZE; //ÉÈÇøµØÖ· 0~127 for STM32F103RBT6
secoff=(offaddr%STM_SECTOR_SIZE)/2; //ÔÚÉÈÇøÄ򵀮«ÒÆ(2¸ö×Ö½ÚΪ»ù±¾µ¥Î».)
secremain=STM_SECTOR_SIZE/2-secoff; //ÉÈÇøÊ£Óà¿Õ¼ä´óС
if(NumToWrite<=secremain)secremain=NumToWrite; //²»´óÓÚ¸ÃÉÈÇø·¶Î§
while(1)
{
STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2); //¶Á³öÕû¸öÉÈÇøµÄÄÚÈÝ
for(i=0;i<secremain;i++) //УÑéÊý¾Ý
{
if(STMFLASH_BUF[secoff+i]!=0XFFFF)
break; //ÐèÒª²Á³ý
}
if(i<secremain) //ÐèÒª²Á³ý
{
FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE); //²Á³ýÕâ¸öÉÈÇø
for(i=0;i<secremain;i++) //¸´ÖÆ
{
STMFLASH_BUF[i+secoff]=pBuffer[i];
}
STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2); //дÈëÕû¸öÉÈÇø
}
else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain); //дÒѾ­²Á³ýÁ˵Ä,Ö±½ÓдÈëÉÈÇøÊ£ÓàÇø¼ä.
if(NumToWrite==secremain)
break; //дÈë½áÊøÁË
else //дÈëδ½áÊø
{
secpos++; //ÉÈÇøµØÖ·Ôö1
secoff=0; //Æ«ÒÆÎ»ÖÃΪ0
pBuffer+=secremain; //Ö¸ÕëÆ«ÒÆ
WriteAddr+=secremain; //дµØÖ·Æ«ÒÆ
NumToWrite-=secremain; //×Ö½Ú(16λ)ÊýµÝ¼õ
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2; //ÏÂÒ»¸öÉÈÇø»¹ÊÇд²»Íê
else secremain=NumToWrite; //ÏÂÒ»¸öÉÈÇø¿ÉÒÔдÍêÁË
}
};
FLASH_Lock(); //ÉÏËø
}
#endif
//´ÓÖ¸¶¨µØÖ·¿ªÊ¼¶Á³öÖ¸¶¨³¤¶ÈµÄÊý¾Ý
//ReadAddr:ÆðʼµØÖ·
//pBuffer:Êý¾ÝÖ¸Õë
//NumToWrite:°ë×Ö(16λ)Êý
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
{
u16 i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr); //¶ÁÈ¡2¸ö×Ö½Ú.
ReadAddr+=2; //Æ«ÒÆ2¸ö×Ö½Ú.
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//WriteAddr:ÆðʼµØÖ·
//WriteData:ҪдÈëµÄÊý¾Ý
void Test_Write(u32 WriteAddr,u16 WriteData)
{
STMFLASH_Write(WriteAddr,&WriteData,1); //дÈëÒ»¸ö×Ö
}
|
|