MCU=STM32F103R8T6 开发环境=MDK5
FLASH空间
FLASH读写函数,直接操作寄存器
void STMFLASH_Unlock(void)
{
FLASH->KEYR=0x45670123;
FLASH->KEYR=0xCDEF89AB;
}
void STMFLASH_Lock(void)
{
FLASH->CR|=(1<<7);
}
unsigned char STMFLASH_ReadHalfWord(unsigned int faddr)
{
return *(vu8 *)faddr;
}
void STMFLASH_Read(unsigned int readaddr,unsigned char *pbuffer,unsigned short numtoread)
{
unsigned short i;
for(i=0;i<numtoread;i++)
{
pbuffer[i]=STMFLASH_ReadHalfWord(readaddr);
readaddr+=2;
}
}
unsigned char STMFLASH_GetStatus(void)
{
unsigned int res;
res=FLASH->SR;
if(res&(1<<0)) return 1; //BUSY=1
return 0; //BUSY=0
}
unsigned char STMFLASH_WaitDone(unsigned short time) //等待操作完成, time=等待时间
{
unsigned char res,i;
do
{
res=STMFLASH_GetStatus(); //查忙位
if(res==0) break;
for(i=100;i>0;i--);
time--;
}while(time);
if(time==0) res=0xff;
return res;
}
unsigned char STMFLASH_EreasePage(unsigned int PADDR) //察除页, PADDR=页地址
{
unsigned char res=0;
while((FLASH->CR&(1<<7))!=0);
res=STMFLASH_WaitDone(0x5fff);
if(res==0) //EEPROM不忙
{
FLASH->CR|=1<<1;
FLASH->AR|=PADDR; //待擦除的页
FLASH->CR|=1<<6; //开始察除操作
res=STMFLASH_WaitDone(0x5fff);
if(res==0) FLASH->CR&=~(1<<1); //停止擦除
}
return res;
}
//faddr=待写入地址 dat=待写入数据
unsigned char STMFLASH_WriteHalfWord(unsigned int faddr,unsigned short dat)
{
unsigned char res;
while((FLASH->CR&(1<<7))!=0);
res=STMFLASH_WaitDone(0xff);
if(res==0)
{
FLASH->CR|=1<<0; //PG=1 写FLASH
*(vu16 *)faddr=dat;
res=STMFLASH_WaitDone(0xff);
if(res==0) FLASH->CR&=~(1<<0);
}
return res;
}
void STMFLASH_Write(unsigned char a)
{
unsigned short add[6];
add[0]=a;
__ASM("CPSID I"); //关总中断
STMFLASH_Unlock();
STMFLASH_EreasePage(PAGE_ADDR); //察除页, PADDR=页地址
STMFLASH_WriteHalfWord(PAGE_ADDR+0,add[0]);
STMFLASH_Lock();
__ASM("CPSIE I"); //开总中断
}
void STMFLASH_read_address(void)
{
pcb_address=STMFLASH_ReadHalfWord(PAGE_ADDR+0);
}
MAIN函数
#define PAGE_ADDR ((u32)0x08000000+60*1024+100) //读写起始地址63K (0x08000000+63*1024+100)必须偶数<64K
#define FLASH_SIZE 64 //64页 STM32F103R8T6 中小型存储器每页1K
#if FLASH_SIZE < 256
#define SECTOR_SIZE 1024 //中小型存储器每页1K
#else
#define SECTOR_SIZE 2048
#endif
u8 pcb_address=0;
int main(void) //主函数
{
u16 i;
STMFLASH_Write(pcb_address);
for(i=60000;i>0;i--);
STMFLASH_read_address();
while(1)
{
;
}
}