搜索
查看: 1832|回复: 8

[已解决] shm32 写内部flash之怪现象!

[复制链接]

该用户从未签到

19

主题

122

帖子

15

蝴蝶豆

金牌会员

最后登录
2021-8-19
发表于 2017-7-10 13:59:34 | 显示全部楼层 |阅读模式
本帖最后由 modu8888 于 2017-7-10 15:36 编辑

      我的产品用在工业上,需保存工作记录。选择使用STM32的内部flash储存——我使用的是较大容量产品STM32F105RBT6,已让记录存储区远离代码区和数据区。    考虑到STM32F105RBT6产品内部flash一页的大小为2k字节,加上我的一条记录规划为64字节,我选择在一页中保存32条记录,合计2048字节。
    大体上,我预留30页循环存放记录,大致可存近960条。当记录超过后,则覆盖原来的。

     现在的问题是,调用库函数写数据有问题。问题如下:
     1 调用HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)ProgramData)库函数编程有问题——仅能写入首个半字数据,其他半字给我写为0,然而插入一个条件判断则又能正确写入了。反复调试确认了该问题,非常奇怪;
     2 刚擦除一页后,写第一条记录,无论如何仅能正确写第一个半字,其他写为0.

    具体请看下面代码和我用st Link Utility读出的数据截图。
                i=Cycles%1200;
                ShiftAddress=i*64;
                ShiftAddress=ShiftAddress-64;
                ProgramAddress=0x08011000+ShiftAddress;

                FLASH_EraseInitTypeDef f;
                f.TypeErase = FLASH_TYPEERASE_PAGES;
                f.PageAddress = ProgramAddress;
                f.NbPages = 1;               
                if((i-1)%32==0)
                {
                        HAL_FLASH_Unlock();                        
                        uint32_t PageError = 0;
                        HAL_FLASHEx_Erase(&f, &PageError);                        
                        HAL_FLASH_Lock();                                                               
                }
               
                HAL_FLASH_Unlock();
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, Cycles);
                ProgramAddress+=2;
                if(Mb_Task!=0x0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Mb_Task);
                ProgramAddress+=2;               
                if(Minutes_Holding!=0x0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Minutes_Holding);        
                ProgramAddress+=2;
                if(Minutes_Dry!=0x0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Minutes_Dry);        
                ProgramAddress+=2;
                if(Seconds_of_Task!=0x0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Seconds_of_Task);               
               
                ProgramAddress+=2;
                if(StartTime[0]!=0)               
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[0]);                                
                ProgramAddress+=2;
                if(StartTime[1]!=0)               
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[1]);               
                ProgramAddress+=2;
                if(StartTime[2]!=0)               
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[2]);               
                ProgramAddress+=2;
                if(StartTime[3]!=0)               
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[3]);               
                ProgramAddress+=2;
                if(StartTime[4]!=0)               
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[4]);               
                ProgramAddress+=2;
                if(StartTime[5]!=0)               
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[5]);                                

                ProgramAddress+=2;
                if(SecondsVacuum[0]!=0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsVacuum[0]);        
                ProgramAddress+=2;                        
                if(SecondsVacuum[1]!=0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsVacuum[1]);        
                ProgramAddress+=2;
                if(SecondsVacuum[2]!=0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsVacuum[2]);                        
        
                ProgramAddress+=2;
                if(SecondsSteam[0]!=0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsSteam[0]);        
                ProgramAddress+=2;
                if(SecondsSteam[1]!=0)               
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsSteam[1]);        
                ProgramAddress+=2;
                if(SecondsSteam[2]!=0)               
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsSteam[2]);               

                ProgramAddress+=2;
                if(TemptSteam[0]!=0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)TemptSteam[0]);        
                ProgramAddress+=2;
                if(TemptSteam[1]!=0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)TemptSteam[1]);        
                ProgramAddress+=2;
                if(TemptSteam[2]!=0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)TemptSteam[2]);        
                                
                ProgramAddress+=2;
                if(Tempture_Highest!=0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Tempture_Highest);        
                ProgramAddress+=2;
                if(Tempture_Lowest!=0)
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Tempture_Lowest);
                HAL_FLASH_Lock();               
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\119080844\QQ\WinTemp\RichOle\~SQU{KDDD7TAJ@]1D{TH3DL.png 02.png         


      上面这个图片,是按照希望保持的数据。

      运行下面代码,则不是这样:

                FLASH_EraseInitTypeDef f;
                f.TypeErase = FLASH_TYPEERASE_PAGES;
                f.PageAddress = ProgramAddress;
                f.NbPages = 1;               
                if((i-1)%32==0)
                {
                        HAL_FLASH_Unlock();                        
                        uint32_t PageError = 0;
                        HAL_FLASHEx_Erase(&f, &PageError);                        
                        HAL_FLASH_Lock();                                                               
                }
               
                HAL_FLASH_Unlock();
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, Cycles);
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Mb_Task);
                ProgramAddress+=2;               
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Minutes_Holding);        
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Minutes_Dry);        
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Seconds_of_Task);               
               
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[0]);                                
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[1]);               
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[2]);               
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[3]);               
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[4]);               
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)StartTime[5]);                                

                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsVacuum[0]);        
                ProgramAddress+=2;                        
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsVacuum[1]);        
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsVacuum[2]);                        
        
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsSteam[0]);        
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsSteam[1]);        
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)SecondsSteam[2]);               

                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)TemptSteam[0]);        
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)TemptSteam[1]);        
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)TemptSteam[2]);        
                                
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Tempture_Highest);        
                ProgramAddress+=2;
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ProgramAddress, (uint64_t)Tempture_Lowest);
                HAL_FLASH_Lock();                        
01.png




回复

使用道具 举报

该用户从未签到

19

主题

122

帖子

15

蝴蝶豆

金牌会员

最后登录
2021-8-19
 楼主| 发表于 2017-7-10 13:59:51 | 显示全部楼层
请问为什么?
回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

122

帖子

15

蝴蝶豆

金牌会员

最后登录
2021-8-19
 楼主| 发表于 2017-7-10 15:41:34 | 显示全部楼层
     我想应该是写flash的时序问题,也就是HAL库函数的问题。
     请有经验的朋友指教哟~
回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

122

帖子

15

蝴蝶豆

金牌会员

最后登录
2021-8-19
 楼主| 发表于 2017-7-10 18:33:29 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

30

主题

1058

帖子

12

蝴蝶豆

金牌会员

最后登录
2021-11-9
发表于 2017-7-11 08:36:59 | 显示全部楼层
我用hal做过在线升级,编程十几k都没问题呢
回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

122

帖子

15

蝴蝶豆

金牌会员

最后登录
2021-8-19
 楼主| 发表于 2017-7-11 13:36:35 | 显示全部楼层
海迹天涯 发表于 2017-7-11 08:36
我用hal做过在线升级,编程十几k都没问题呢

谢回复。

我平常写几个字节,都没问题。

回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

122

帖子

15

蝴蝶豆

金牌会员

最后登录
2021-8-19
 楼主| 发表于 2017-7-12 12:03:55 | 显示全部楼层
    结贴了。非HAL库问题!
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

226

帖子

0

蝴蝶豆

高级会员

最后登录
2023-5-4
发表于 2017-7-13 08:29:52 | 显示全部楼层
郁闷,结贴了,也不说明问题的原因!
回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

122

帖子

15

蝴蝶豆

金牌会员

最后登录
2021-8-19
 楼主| 发表于 2017-7-15 10:42:35 | 显示全部楼层
shuolang126 发表于 2017-7-13 08:29
郁闷,结贴了,也不说明问题的原因!

是FreeRTOS的导致出错。系统复位后,创建的信号量的值都自动为1,也就使得我的任务自动执行一次!也就错误的写入一次~

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 13:58 , Processed in 1.245750 second(s), 46 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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