- //擦除扇区
- //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;
- }
|