STM32F103的FLASH当EEPROM用时写入一个小于0XFF的数时正确,写入一个大于0XFF时就错误

2019-07-21 04:10发布

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();

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
cwy0828
1楼-- · 2019-07-21 07:32
4字节对齐
login_FAE
2楼-- · 2019-07-21 13:08
[mw_shl_code=c,true]//解锁STM32的FLASH
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]
HXYDJ
3楼-- · 2019-07-21 13:40
大于8位的数据要拆分成高8位和低8位分别存储。
cwy0828
4楼-- · 2019-07-21 13:59
 精彩回答 2  元偷偷看……
cwy0828
5楼-- · 2019-07-21 14:28
HXYDJ 发表于 2019-3-18 09:50
大于8位的数据要拆分成高8位和低8位分别存储。

感谢大师的回复,我试过了用一个16位的数据是可以写进去的,感觉应该是要4字节对齐
xiedonghui258
6楼-- · 2019-07-21 16:51
cwy0828 发表于 2019-3-21 11:35
谢谢大师的解答,不过不用把一个16位的数据分成两个8位数据的,

应该是读写的时候,地址必须是32位的吧,

一周热门 更多>