STM32F103 FLASH 读写操作

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)
            {

                ;
        
            }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值