OpenEdv-开源电子网

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

STM32F429 FLASH如何实现掉电保存数据啊

[复制链接]

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
发表于 2018-12-12 10:24:04 | 显示全部楼层 |阅读模式
1金钱
STM32目前刚在学,试了下原子的程序只有按键按下去读和写,没有掉电保存,一时无从下手,求高手帮忙,

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

使用道具 举报

3

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2018-5-8
在线时间
22 小时
发表于 2018-12-12 10:54:37 | 显示全部楼层
楼主,按键按下去能读和写,没有掉电保存,说明这个数据是存储在SRAM里面的,这个数据并没有写进flash。原子的代码肯定是有读写flash的代码,估计是你没有找到,你再好好看看,刚开始不要心急,先好好分析分析代码吧。不要烧写了原子的程序就去看现象,然后又不是你想要的效果,就来论坛里面问,好吧。先自己分析吧
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-12-12 11:25:17 | 显示全部楼层
写进flash就实现掉电保护了啊,上电读出来就行。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-12 15:09:07 | 显示全部楼层
尹林 发表于 2018-12-12 10:54
楼主,按键按下去能读和写,没有掉电保存,说明这个数据是存储在SRAM里面的,这个数据并没有写进flash。原 ...

谢谢啊,我研究了下原子FLASH钟的函数,里面有
void STMFLASH_Unlock(void);
void STMFLASH_Lock(void);
u8 STMFLASH_GetStatus(void);       
u8 STMFLASH_WaitDone(u16 time);       
u8 STMFLASH_ErasePage(u32 paddr);
u8 STMFLASH_WriteHalfWord(u32 faddr, u16 dat);
u16 STMFLASH_ReadHalfWord(u32 faddr);       
void STMFLASH_WriteLenByte(u32 WriteAddr,u32 DataToWrite,u16 Len);
u32 STMFLASH_ReadLenByte(u32 ReadAddr,u16 Len);       
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite);       
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead);
这些,我自己写了如下函数
#define FLASH_SAVE_ADDR  0X08020000                //éèÖÃFLASH ±£′æμØÖ·(±ØDëÎażêy£¬ÇòÆäÖμòa′óóú±¾′úÂëËùÕ¼óÃFLASHμÄ′óD¡+0X08000000)
#define SAVEDATAID 0x68
u16 f,w;


void LoadParameter()  //
{
        u32 addrval= FLASH_SAVE_ADDR;
        u32 tmpdat=0;//????
        tmpdat=STMFLASH_ReadHalfWord(addrval);
        if(SAVEDATAID!=tmpdat) return;//?????????????
        f=0;w=0; //??f?w??
        addrval++; //f?????
        tmpdat=STMFLASH_ReadHalfWord(addrval);
        f=(tmpdat<<8);
        addrval++;
        tmpdat=STMFLASH_ReadHalfWord(addrval);
        f+=tmpdat;
        addrval++; //w?????
        tmpdat=STMFLASH_ReadHalfWord(addrval);
        w=(tmpdat<<8);
        addrval++;
        tmpdat=STMFLASH_ReadHalfWord(addrval);
        w+=tmpdat;       
}

void SaveParameter()//??
{
        u32 tmpdat=0;
        u32 addrval=FLASH_SAVE_ADDR;
       
        STMFLASH_ErasePage(FLASH_SAVE_ADDR);//????
        STMFLASH_WriteHalfWord(addrval,SAVEDATAID);//??
        delay_ms(1);

        addrval++;
        tmpdat=(f>>8);//????????f
        STMFLASH_WriteHalfWord(addrval,tmpdat);

        addrval++;
        tmpdat=f;
        delay_ms(1);
        STMFLASH_WriteHalfWord(addrval,tmpdat);
        delay_ms(1);

        addrval++;
        tmpdat=(w>>8);  //????????
        STMFLASH_WriteHalfWord(addrval,tmpdat);
        delay_ms(1);

        addrval++;
        tmpdat=w;
        STMFLASH_WriteHalfWord(addrval,tmpdat);
       
}
然后在主函数中调用这2个函数一点用也没有,不知道哪里错了,我想要掉电后保存频率和占空比,
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-12 15:11:37 | 显示全部楼层
szczyb1314 发表于 2018-12-12 11:25
写进flash就实现掉电保护了啊,上电读出来就行。

高手我想请教,原子哥的
u8 STMFLASH_WriteHalfWord(u32 faddr, u16 dat);
u16 STMFLASH_ReadHalfWord(u32 faddr);
这2个写一位数可以的吧,如果是很多位就用下面这个对吗
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite);        
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead);
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-12 16:18:04 | 显示全部楼层
szczyb1314 发表于 2018-12-12 11:25
写进flash就实现掉电保护了啊,上电读出来就行。

还在吗?能帮我看下吗?我查了很多资料flash掉电保存要擦除后再写,我的代码是给定一个地址和随便先写一个数值进flash,每次读这个数值,但是没有一点效果
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-12 16:18:58 | 显示全部楼层
原子哥在吗?帮我看下呢?
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-12-12 16:25:28 | 显示全部楼层
gdqxp 发表于 2018-12-12 16:18
还在吗?能帮我看下吗?我查了很多资料flash掉电保存要擦除后再写,我的代码是给定一个地址和随便先写一 ...

你用的原子的板子吗?F429的?原子的那个例程刷进去看看先,原子就是写内部FLASH然后读出来,跟你的要求一模一样啊
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-12-12 16:28:19 | 显示全部楼层
gdqxp 发表于 2018-12-12 16:18
还在吗?能帮我看下吗?我查了很多资料flash掉电保存要擦除后再写,我的代码是给定一个地址和随便先写一 ...

自己做的板子的话你得先去看原子出的手册了,跟你的供电电压有关系,原子3.3V供电所以只能一次读写4byte的数据即一次操作一个U32型数据。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2018-12-12
在线时间
16 小时
发表于 2018-12-12 16:54:18 | 显示全部楼层
好像不能乱写的吧  你只能按着芯片偏移量来写吧
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-12 16:56:17 | 显示全部楼层
szczyb1314 发表于 2018-12-12 16:28
自己做的板子的话你得先去看原子出的手册了,跟你的供电电压有关系,原子3.3V供电所以只能一次读写4byte ...

是自己做的板子原子的程序我也下到开发板里面去看了,比如按1可以读,按2可以写。网上我查了点资料,还需要自己再做程序比如要先擦除,然后再写,上电读,我写一个值进去不判断电压,上电后直接看是不是这个值,通过比较实现储存,我写的这个在STC12c5a60s中可以用,但是在stm32中不可以用,我理解原子哥写的flash,分为是否是半字读写,半字读写就调用半字的程序,字符串读写就用字符串的程序,不知道对不对?我是通过按键按了改变频率和占空比,想要按键改变频率和占空比后保存起来,还希望指点一二啊,谢谢了
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-12 17:04:36 | 显示全部楼层
Yefeng是叶峰 发表于 2018-12-12 16:54
好像不能乱写的吧  你只能按着芯片偏移量来写吧

必须只能在void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite);                //′ó&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;D′è&#235;&#214;&#184;&#182;¨3¤&#182;èμ&#196;êy&#190;Y
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead);                   //′ó&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;&#182;á3&#246;&#214;&#184;&#182;¨3¤&#182;èμ&#196;êy&#190;Y
这2个里面操作吗?我感觉我的频率最大值不会超过65535,用u8 STMFLASH_WriteHalfWord(u32 faddr, u16 dat);//D′è&#235;°&#235;×&#214;
u16 STMFLASH_ReadHalfWord(u32 faddr);                  //&#182;á3&#246;°&#235;×&#214;  
这2个函数不是就可以了吗
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2018-12-12
在线时间
16 小时
发表于 2018-12-12 17:19:11 | 显示全部楼层
gdqxp 发表于 2018-12-12 17:04
必须只能在void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite);                //′ó&#214;&#184;&#182 ...

这两个函数我没用过,但是我用过后面两个,是库函数,前面的应该是原子哥写的有保护机制的,估计里面也有用库函数的,如果用后面的你要注意写入地址,安全性要自己考虑,前面两个封装过的就不用考虑那么多。
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-13 08:07:25 | 显示全部楼层
Yefeng是叶峰 发表于 2018-12-12 17:19
这两个函数我没用过,但是我用过后面两个,是库函数,前面的应该是原子哥写的有保护机制的,估计里面也有 ...

好的谢谢啊,我再研究研究,
回复

使用道具 举报

0

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2018-9-26
在线时间
8 小时
发表于 2018-12-13 09:40:59 | 显示全部楼层
6666666666666666
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-13 10:06:42 | 显示全部楼层
有高手吗?帮俺看看呢,我测试了很多次都以失败告终,
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-14 02:38:25 | 显示全部楼层
掉电保存,你得有掉电检测,然后还有在检测到掉电后,能执行flash写入,就需要有后备电池。都考虑好了你自然就能实现。
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-15 10:46:16 | 显示全部楼层
原子哥我感觉用后备电池不是很好,后备电池万一没电了,到时候数据就会丢失了。原子哥这个flash可以先写一个数据进去,通过判断上电后读到的是不是这个数据进行保存吗,我初接触STM32有点理解不了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-16 02:16:59 | 显示全部楼层
gdqxp 发表于 2018-12-15 10:46
原子哥我感觉用后备电池不是很好,后备电池万一没电了,到时候数据就会丢失了。原子哥这个flash可以先写一 ...

其实一个大点的电容都够,比如1000uf的电容,可以最够保持STM32运行上百ms的,完成flash写入足够。
而且电容又没有充电次数限制。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-11-7
在线时间
11 小时
 楼主| 发表于 2018-12-17 10:52:23 | 显示全部楼层
正点原子 发表于 2018-12-16 02:16
其实一个大点的电容都够,比如1000uf的电容,可以最够保持STM32运行上百ms的,完成flash写入足够。
而且 ...

谢谢原子哥,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 19:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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