//擦除扇区
//sectoraddr:扇区地址,范围是:0~11.
//0~3,16K扇区;4,64K扇区;5~11,128K扇区.
//返回值:执行情况
u8 STMFLASH_EraseSector(u32 sectoraddr)
{
u8 res=0;
//res=STMFLASH_WaitDone(200000);//等待上次操作结束,最大2s
res=STMFLASH_WaitDone(400000);//等待上次操作结束,最大2s
if(res==0)
{
FLASH->CR&=~(3<<8); //清除PSIZE原来的设置
FLASH->CR|=2<<8; //设置为32bit宽,确保VCC=2.7~3.6V之间!!
FLASH->CR&=~(0X1F<<3);//清除原来的设置
FLASH->CR|=sectoraddr<<3;//设置要擦除的扇区
FLASH->CR|=1<<1; //扇区擦除
FLASH->CR|=1<<16; //开始擦除
//res=STMFLASH_WaitDone(200000);//等待上次操作结束,最大2s
res=STMFLASH_WaitDone(400000);//等待操作结束,最大2s
if(res!=1) //非忙
{
FLASH->CR&=~(1<<1);//清除扇区擦除标志.
}
}
return res;
}
//在FLASH指定地址写一个字
//faddr:指定地址(此地址必须为4的倍数!!)
//dat:要写入的数据
//返回值:0,写入成功
// 其他,写入失败
u8 STMFLASH_WriteWord(u32 faddr, u32 dat)
{
u8 res;
//res=STMFLASH_WaitDone(0xFF);
res=STMFLASH_WaitDone(0X200);
if(res==0)//OK
{
FLASH->CR&=~(3<<8); //清除PSIZE原来的设置
FLASH->CR|=2<<8; //设置为32bit宽,确保VCC=2.7~3.6V之间!!
FLASH->CR|=1<<0; //编程使能
*(vu32*)faddr=dat; //写入数据
//res=STMFLASH_WaitDone(0XFF);//等待操作完成,一个字编程,最多100us.
res=STMFLASH_WaitDone(0X200);//等待操作完成,一个字编程,最多100us.//0xff
if(res!=1)//操作成功
{
FLASH->CR&=~(1<<0);//清除PG位.
}
}
return res;
}
|