OpenEdv-开源电子网

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

stm32中flash存储和读取有问题,我把flash存储和读取程序放在时钟初始化里了,结果下电再上电程序好像跳过初始化了????

[复制链接]

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
发表于 2016-11-23 10:41:27 | 显示全部楼层 |阅读模式
4金钱
本帖最后由 zjs123 于 2016-11-23 10:50 编辑

我的目的是限制程序使用次数,即下电上电4次后,程序就不运行了,我的想法是把4作为判断条件,每次上电,从flash读取上次存储进来的数据n,然后n++,再把n和4比较,小于4程序接着往下正常运行,大于4就进入while{1}死循环,让程序死在里面,同时把n存储到flash里,我把flash读和写的程序写到时钟初始化里,实验时发现,没有起作用,但是我用jlink硬件仿真时,却清楚的看到n从0-4,而且大于4程序就不运行了,是正确的,可是不用jlink硬件仿真,直接下载到stm32单片机里却不行了,n大于4也还在正常运行,这是怎么回事呢???? 1.png 这是flash读和写的程序,因为我是限制上电下点次数,所以我把flash读写和4判断语句放在时钟初始化里了,这样每次上电初始化时钟时就会执行flash读写和4判断,实现上电次数小于4正常运行,大于4不运行

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

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 10:45:49 | 显示全部楼层
C:\Users\Administrator.EIT-20160724VEA\Desktop
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 11:16:11 | 显示全部楼层
自己顶,有知道怎么回事的吗
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-23 11:58:18 | 显示全部楼层
倒第二句的
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

可以去掉
shop60994719.taobao.com
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-11-23 12:04:29 | 显示全部楼层
你怎么确定大于4还可以运行,还有在擦出前加一句        FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-23 12:05:27 | 显示全部楼层
不行的话,就是硬件检测有问题的,,如电源回路电容量小,时间来不及。。你插调试器实际不存在掉电的问题
shop60994719.taobao.com
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 15:08:16 | 显示全部楼层
密耳 发表于 2016-11-23 12:05
不行的话,就是硬件检测有问题的,,如电源回路电容量小,时间来不及。。你插调试器实际不存在掉电的问题

这个我们也想到了,下电后,我们用示波器看了,单片机电源确实很快就从3.3降到0v左右,我们也试过下电1分钟再上电,可是都不行。对了,有一个奇怪现象,开环控制可以实现运行3次就不运行,闭环就不行
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 15:10:12 | 显示全部楼层
止天 发表于 2016-11-23 12:04
你怎么确定大于4还可以运行,还有在擦出前加一句        FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数 ...

仿真时,可以在硬件仿真界面看到n值变化,n大于4程序就不运行,死在里面了,实验调试,上电下电超过4次,程序还是在正常运行
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 15:20:49 | 显示全部楼层
止天 发表于 2016-11-23 12:04
你怎么确定大于4还可以运行,还有在擦出前加一句        FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数 ...

加FLASH_DataCacheCmd(DISABLE);编译报错..\OBJ\CAR.axf: Error: L6218E: Undefined symbol FLASH_DataCacheCmd (referred from timer.o).这是怎么回事,头文件#include "stm32f10x_flash.h"我也包括了啊
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 15:21:23 | 显示全部楼层
密耳 发表于 2016-11-23 11:58
倒第二句的
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

去了也不行
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-11-23 16:15:33 | 显示全部楼层
zjs123 发表于 2016-11-23 15:08
这个我们也想到了,下电后,我们用示波器看了,单片机电源确实很快就从3.3降到0v左右,我们也试过下电1分 ...

在你的代码中我没有看到flash擦除相关的代码,那我是不是可以理解为你没有擦除就写入了新数据,那3次不就说的通了。
开始是全1,如果date = 1,写入,变成11111111110,再读出来是date = 1,date++后再写入变成11111111100,而不是11111111101,因为你没有擦除,这样再读出来是date = 3,然后date++后的4再写入就是11111111000了,再读出就是7已经大于4
自在随心
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 16:48:57 | 显示全部楼层
yuzeyuan1 发表于 2016-11-23 16:15
在你的代码中我没有看到flash擦除相关的代码,那我是不是可以理解为你没有擦除就写入了新数据,那3次不就 ...

有擦除程序啊,void FLASH_WriteByte(u32 addr ,u16 data)函数里不是有擦除语句吗——FLASHstatus=FLASH_ErasePage(addr);
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 16:50:12 | 显示全部楼层
yuzeyuan1 发表于 2016-11-23 16:15
在你的代码中我没有看到flash擦除相关的代码,那我是不是可以理解为你没有擦除就写入了新数据,那3次不就 ...

而且我读出来的数和4比较,大于4就死循环,7也大于4也应该死循环啊
回复

使用道具 举报

3

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
586
金钱
586
注册时间
2016-5-13
在线时间
106 小时
发表于 2016-11-23 17:02:21 | 显示全部楼层
不知道你用的是什么芯片,我用的F407,也用过自带的FLASH做EEPROM,每次写入要求是4字节,没有看到你有读取的函数,读取也要求读出来4字节,否则会出错,你可以试试把DATA存如到一个全局数组中用来记录次数,写入和读取都以数组元素为单位就好了.
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 17:22:37 | 显示全部楼层
abdfgh 发表于 2016-11-23 17:02
不知道你用的是什么芯片,我用的F407,也用过自带的FLASH做EEPROM,每次写入要求是4字节,没有看到你有读取的函 ...

我用的是stm32f103rbt6
回复

使用道具 举报

3

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
586
金钱
586
注册时间
2016-5-13
在线时间
106 小时
发表于 2016-11-23 17:48:37 | 显示全部楼层
zjs123 发表于 2016-11-23 17:22
我用的是stm32f103rbt6

读取长度和写入长度要和4字节对齐,用Flash_Read()函数读取,判断,然后自++然后Flash_Write()写入,写入地址要避开你的程序部分.
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
12 小时
 楼主| 发表于 2016-11-23 19:45:11 | 显示全部楼层
abdfgh 发表于 2016-11-23 17:48
读取长度和写入长度要和4字节对齐,用Flash_Read()函数读取,判断,然后自++然后Flash_Write()写入,写入地址 ...

地址我选的是flash最后一页,肯定避开了程序代码占用的空间,rbt6flash是128K,和F407空间大小不一样,我是16位写入和读出,应该没问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 12:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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