OpenEdv-开源电子网

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

STM32G031G8U6 flash读写问题

[复制链接]

12

主题

72

帖子

0

精华

高级会员

Rank: 4

积分
530
金钱
530
注册时间
2019-7-3
在线时间
165 小时
发表于 2021-12-2 14:43:29 | 显示全部楼层 |阅读模式
1金钱
主频:64M
stlink V2进行写flash。通过debug可以看到地址上写入了正确的数据,在单片机不重启的情况下,读取数据也是正常的如下图
QQ截图20211202143722.jpg
写入了6个32位的数据,可以在线仿真看到数据,断电之后读取不到数据。读写函数如下


void STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)       
{
        FLASH_EraseInitTypeDef FlashEraseInit;
        HAL_StatusTypeDef FlashStatus=HAL_OK;
        uint32_t PageError=0;
        uint32_t addrx=0;
        uint32_t endaddr=0;       
        if(WriteAddr<FLASH_BASE||WriteAddr%4)return;        //非法地址

        HAL_FLASH_Unlock();             //解锁       
        addrx=WriteAddr;                                //写入的起始地址
        endaddr=WriteAddr+NumToWrite*8;        //写入的结束地址
        if(addrx<0X1FFF0000)
        {
                while(addrx<endaddr)                //扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
                {
                         if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)        //有非0XFFFFFFFF的地方,要擦除这个扇区
                         {   
                                FlashEraseInit.TypeErase=FLASH_TYPEERASE_PAGES;    //擦除类型,页擦除
                                FlashEraseInit.Page=30;                                                      //我的flash大小为64K.最后两页擦除带重新进行写
                                FlashEraseInit.NbPages=2;                          //一次擦除2页数据
                                if(HAL_FLASHEx_Erase(&FlashEraseInit,&PageError)!=HAL_OK)
                                {
                                        break;//发生错误了       
                                }
                        }else addrx+=4;
                        FLASH_WaitForLastOperation(FLASH_WAITETIME);            //等待上次操作完成
                }
        }
        FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME);        //等待上次操作完成
        if(FlashStatus==HAL_OK)
        {
                 while(WriteAddr<endaddr)                                                                        //写数据
                 {
                        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,WriteAddr,*(uint64_t*) pBuffer)!=HAL_OK)//写入数据
                        {
                                break;                                                                                                //写入异常
                        }
                        WriteAddr+=8;
                        pBuffer+=2;
                }  
        }
        HAL_FLASH_Lock();                                                                                   //上锁
}

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

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2021-12-2 14:44:56 | 显示全部楼层
回复

使用道具 举报

12

主题

72

帖子

0

精华

高级会员

Rank: 4

积分
530
金钱
530
注册时间
2019-7-3
在线时间
165 小时
 楼主| 发表于 2021-12-2 22:03:36 | 显示全部楼层
顶一下,这个资料好少啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-12-3 01:50:12 | 显示全部楼层
帮顶
回复

使用道具 举报

12

主题

72

帖子

0

精华

高级会员

Rank: 4

积分
530
金钱
530
注册时间
2019-7-3
在线时间
165 小时
 楼主| 发表于 2021-12-3 20:41:49 | 显示全部楼层
有没有人知道啊,弄了两天还是不行
回复

使用道具 举报

12

主题

72

帖子

0

精华

高级会员

Rank: 4

积分
530
金钱
530
注册时间
2019-7-3
在线时间
165 小时
 楼主| 发表于 2021-12-14 15:17:44 | 显示全部楼层
再顶一下
回复

使用道具 举报

14

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2018-4-24
在线时间
41 小时
发表于 2022-2-22 11:20:11 | 显示全部楼层
你好,问题解决了吗? 具体是什么问题导致?
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2022-3-9
在线时间
26 小时
发表于 2022-3-24 16:55:53 | 显示全部楼层
楼主问题解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 21:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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