OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2437|回复: 6

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

[复制链接]

7

主题

19

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1321
金钱
1321
注册时间
2015-12-26
在线时间
117 小时
发表于 2019-3-16 17:12:46 | 显示全部楼层 |阅读模式
20金钱
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();

}

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

19

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1321
金钱
1321
注册时间
2015-12-26
在线时间
117 小时
 楼主| 发表于 2019-3-16 17:12:47 | 显示全部楼层
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2019-3-16 18:53:10 | 显示全部楼层
[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]
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-3-18 09:50:14 | 显示全部楼层
大于8位的数据要拆分成高8位和低8位分别存储。
回复

使用道具 举报

7

主题

19

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1321
金钱
1321
注册时间
2015-12-26
在线时间
117 小时
 楼主| 发表于 2019-3-21 11:35:38 | 显示全部楼层
本帖最后由 cwy0828 于 2019-3-21 11:39 编辑
login_FAE 发表于 2019-3-16 18:53
[mw_shl_code=c,true]//解锁STM32的FLASH
void STMFLASH_Unlock(void)
{

谢谢大师的解答,不过不用把一个16位的数据分成两个8位数据的,感觉应该是要4字节对齐
回复

使用道具 举报

7

主题

19

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1321
金钱
1321
注册时间
2015-12-26
在线时间
117 小时
 楼主| 发表于 2019-3-21 11:38:46 | 显示全部楼层
HXYDJ 发表于 2019-3-18 09:50
大于8位的数据要拆分成高8位和低8位分别存储。

感谢大师的回复,我试过了用一个16位的数据是可以写进去的,感觉应该是要4字节对齐
回复

使用道具 举报

8

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-4-6
在线时间
234 小时
发表于 2019-3-21 11:39:14 | 显示全部楼层
cwy0828 发表于 2019-3-21 11:35
谢谢大师的解答,不过不用把一个16位的数据分成两个8位数据的,

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 03:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表