STM32F103的FLASH当EEPROM用时写入一个小于0XFF的数时正确,写入一个大于0XFF时就错误,请大师们帮忙给解答一下,先谢谢了
void My_Flash_Read_16bit(uint32_t FLASH_ADR,uint16_t *pp,uint8_t unm9)
{//读数据
uint8_t x1;
for(x1=0;x1<unm9;x1++)
{
pp[x1]=*(vu16*)(FLASH_ADR); /* 读取地址中的16位数据 */
FLASH_ADR +=2;
}
}
void My_Flash_Write_16bit(uint32_t FLASH_ADR,uint16_t *FLASH_DATA, uint8_t unm9)
{//写数据
uint8_t x8;
FLASH_Unlock(); /* 每次擦除Flash中数据时得先解锁 */
FLASH_ErasePage(FLASH_ADR);//擦除
for(x8=0;x8<unm9;x8++)
{
FLASH_ProgramHalfWord(FLASH_ADR,FLASH_DATA[x8]); /* 写16位半字 */
FLASH_ADR +=2;
}
FLASH_Lock();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
void STMFLASH_Unlock(void)
{
FLASH->KEYR=FLASH_KEY1;//写入解锁序列.
FLASH->KEYR=FLASH_KEY2;
}
//flash上锁
void STMFLASH_Lock(void)
{
FLASH->CR|=1<<7;//上锁
}
//得到FLASH状态
u8 STMFLASH_GetStatus(void)
{
u32 res;
res=FLASH->SR;
if(res&(1<<0))return 1; //忙
else if(res&(1<<2))return 2; //编程错误
else if(res&(1<<4))return 3; //写保护错误
return 0; //操作完成
}
//等待操作完成
//time:要延时的长短
//返回值:状态.
u8 STMFLASH_WaitDone(u16 time)
{
u8 res;
do
{
res=STMFLASH_GetStatus();
if(res!=1)break;//非忙,无需等待了,直接退出.
delay_us(1);
time--;
}while(time);
if(time==0)res=0xff;//TIMEOUT
return res;
}
//擦除页
//paddr:页地址
//返回值:执行情况
u8 STMFLASH_ErasePage(u32 paddr)
{
u8 res=0;
res=STMFLASH_WaitDone(0X5FFF);//等待上次操作结束,>20ms
if(res==0)
{
FLASH->CR|=1<<1;//页擦除
FLASH->AR=paddr;//设置页地址
FLASH->CR|=1<<6;//开始擦除
res=STMFLASH_WaitDone(0X5FFF);//等待操作结束,>20ms
if(res!=1)//非忙
{
FLASH->CR&=~(1<<1);//清除页擦除标志.
}
}
return res;
}
//在FLASH指定地址写入半字
//faddr:指定地址(此地址必须为2的倍数!!)
//dat:要写入的数据
//返回值:写入的情况
u8 STMFLASH_WriteHalfWord(u32 faddr, u16 dat)
{
u8 res;
res=STMFLASH_WaitDone(0XFF);
if(res==0)//OK
{
FLASH->CR|=1<<0; //编程使能
*(vu16*)faddr=dat; //写入数据
res=STMFLASH_WaitDone(0XFF);//等待操作完成
if(res!=1)//操作成功
{
FLASH->CR&=~(1<<0); //清除PG位.
}
}
return res;
}
//读取指定地址的半字(16位数据)
//faddr:读地址
//返回值:对应数据.
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *(vu16*)faddr;
}[/mw_shl_code]
感谢大师的回复,我试过了用一个16位的数据是可以写进去的,感觉应该是要4字节对齐
应该是读写的时候,地址必须是32位的吧,
一周热门 更多>