OpenEdv-开源电子网

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

STM32F103单片机使用FLASH模拟EEPROM问题

[复制链接]

8

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2018-5-4
在线时间
27 小时
发表于 2019-9-27 16:03:37 | 显示全部楼层 |阅读模式
1金钱
在使用STM32F103系列单片机FLASH模拟EEPROM过程中遇到一个问题,来求助各位大佬。根据原子哥的例程往FLASH里写数据,读出数据都是可以的,但是我想在下载程序时就往FLASH的某个地址存入一个原始数据,不知道要怎么实现。
例程里面是按键触发写数据,读数据。而我想在下载时就存入一个原始数据(相当于出场原始数据),当有新数据来的时候再覆盖原始数据。

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

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-9-27 16:07:59 | 显示全部楼层
第一种方法:单独写一个程序,就往FLASH里传你的原始数据,传完这个数据之后再烧录你正式运行的程序。
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-9-27 16:10:27 | 显示全部楼层
第二种方法:在正式程序里边设置标志位,把这个标志位存到FLASH里边,每次开机读取FLASH中这个标志位,如果标志位置位那就用FLASH里的数据作为你变量的值,如果没有置位就用你变量赋的原始值。
回复

使用道具 举报

8

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2018-5-4
在线时间
27 小时
 楼主| 发表于 2019-9-27 16:43:03 | 显示全部楼层
15937417823 发表于 2019-9-27 16:07
第一种方法:单独写一个程序,就往FLASH里传你的原始数据,传完这个数据之后再烧录你正式运行的程序。

因为我用的是片内FLASH,这样的话,第二次烧录程序时 会不会把上次存的数据擦除?
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-9-27 17:16:30 | 显示全部楼层
燕园技术宅 发表于 2019-9-27 16:43
因为我用的是片内FLASH,这样的话,第二次烧录程序时 会不会把上次存的数据擦除?

那就直接第二种啊
回复

使用道具 举报

3

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-1-15
在线时间
18 小时
发表于 2019-9-28 08:54:00 | 显示全部楼层
还有第三种方法:const u8 FlashData[] __attribute__ ((at(0x0800e000))) = {0x00,0x01,0x02,0x03,0x04,0x05};
直接这么写就可以了,在指定的FLASH中写入了你要写入的数据,程序在没有运行时就已经写进去了
回复

使用道具 举报

3

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-1-15
在线时间
18 小时
发表于 2019-9-28 09:07:18 | 显示全部楼层
补充一下啊,我刚提到的第三种方法,无需做标志位,烧程序就会初始FLASH数据,在程序运行过程中可以修改,并且只要你不是再次烧程序,单片机复位后FLASH数据也是你程序以往运行过程中的修改后数据,但要是重新下载数据,那么就初始化了FLASH数据,楼上说到的方法二,可以做到无论怎么重新下载数据,都不会初始FLASH数据,但前提是下载程序烧写设置不要整片擦除。
回复

使用道具 举报

3

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-1-15
在线时间
18 小时
发表于 2019-9-28 09:08:39 | 显示全部楼层
第三种方法:在程序中加入const u8 FlashData[] __attribute__ ((at(0x0800e000))) = {0x00,0x01,0x02,0x03,0x04,0x05};
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-10-3
在线时间
1 小时
发表于 2019-10-3 21:51:02 | 显示全部楼层
好帖子
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 06:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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