OpenEdv-开源电子网

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

STM32F103ZET6 FLASH模拟EEPROM读取数据出现硬件错误

[复制链接]

11

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2013-9-2
在线时间
9 小时
发表于 2013-10-21 11:30:46 | 显示全部楼层 |阅读模式
在使用FLASH模拟EEPROM读取数据时发生硬件错误,经过跟踪,发现问题出在*pBuffer=(*(unsigned char*)(ReadAddr+i))这一句上,不论我是改为16位读取还是32位读取,还是会出现硬件错误,请教各位大侠,接下来应该向哪个方向找原因呢?先谢谢各位了,对应的函数如下所示:



众人划桨开大船!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-10-21 12:30:24 | 显示全部楼层
1.pBuffer是不是传入了非法指针,比如指向了不能写入的地址.
2.对于16位和32位读取,要注意字节对齐问题.比如对着0x08000000读取4字节是可以的,但0x08000001读取4字节就会出现精确数据访问错误.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

11

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2013-9-2
在线时间
9 小时
 楼主| 发表于 2013-10-21 13:00:59 | 显示全部楼层
回复【2楼】shihantu:
---------------------------------
1、pBuffer指向的是uint_8类型的一个数组
2、对于读取的地址ReadAddr也是FLASH读写的地址0x08080000,应该不存在字节对齐的问题
众人划桨开大船!!!
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-10-21 13:16:44 | 显示全部楼层
1.(*(unsigned char*)(ReadAddr+i))就不对齐了.

2.检查是否有访问yue,比如是不是第一次循环就出错,还是循环几次才出错.

3.看看错误类型和工作区的数值,会有帮助.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

11

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2013-9-2
在线时间
9 小时
 楼主| 发表于 2013-10-21 18:02:08 | 显示全部楼层
回复【4楼】shihantu:
---------------------------------
1、对于你说的对齐问题,我也有考虑到,我也试过读出一个字,然后分四个字节赋值,但是还是会出现硬件错误。
2、第一次循环就出错。

我觉得,主要就是将一个地址转换为指向uint_8类型的指针时出现了问题,我曾尝试着改为uint_16或uint_32类型的指针,但是还是一样的问题,不知道怎么改,望指教!
众人划桨开大船!!!
回复 支持 反对

使用道具 举报

11

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2013-9-2
在线时间
9 小时
 楼主| 发表于 2013-10-21 18:06:43 | 显示全部楼层
回复【4楼】shihantu:
---------------------------------

    内置闪存模块可以在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。读接口在闪存端包含一个读控制器,还包含一个AHB接口与CPU衔接。这个接口的主要工作是产生读闪存的控制信号并预取CPU要求的指令块,预取指令块仅用于在I-Code总线上的取指操作,数据常量是通过D-Code总线访问的。这两条总线的访问目标是相同的闪存模块,访问D-Code将比预取指令优先级高。
这里要特别留意一个闪存等待时间,因为CPU运行速度比FLASH快得多,STM32F103的FLASH最快访问速度≤24Mhz,如果CPU频率超过这个速度,那么必须加入等待时间,比如我们一般使用72Mhz的主频,那么FLASH等待周期就必须设置为2,该设置通过FLASH_ACR寄存器设置。
例如,我们要从地址addr,读取一个半字(半字为16为,字为32位),可以通过如下的语句读取:
                    data=*(vu16*)addr;
将addr强制转换为vu16指针,然后取该指针所指向的地址的值,即得到了addr地址的值。类似的,将上面的vu16该位vu8,即可读取指定地址的一个字节。


看相关示例都是直接寻址的,真是不知道原因出在哪?
众人划桨开大船!!!
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-10-21 18:59:55 | 显示全部楼层
回复【5楼】I6believe:
---------------------------------
1.建议先把数据读到局部变量,再从局部变量保存到缓存区,看看是哪句话有问题.

2.字节对齐的问题,单字节访问可以随便访问,双字节访问的地址必须能被2整除,4字节访问必须能被4整除,比如你上面的例子,i是0的时候能对其,++了就不对齐了.

3.还是看看错误类型吧.不然1里的操作到底是哪个的问题都不清楚.

4.建议增加数据合法性检查,可以参考ST库的assert,可以快速定位异常,不用这里猜猜那里想想.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

11

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2013-9-2
在线时间
9 小时
 楼主| 发表于 2013-10-22 09:39:24 | 显示全部楼层
回复【7楼】shihantu:
---------------------------------
谢谢你的解答,按照你1说的方法,我将出错的那一句话进行了拆分,具体如下:

unsigned long addr = (ReadAddr + 0);
unsigned char *pAddr = (unsigned char *)(ReadAddr + 0);
unsigned char num = *(    (unsigned char *)(ReadAddr + 0)   );

把问题定位到了最后一句,强制类型转换都成功了,再取地址中的数据进行赋值为什么会出错呢?

即使我把最后一句改为unsigned char num = *pAddr;也还是会出现硬件错误,期待你进一步的指导。
众人划桨开大船!!!
回复 支持 反对

使用道具 举报

11

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2013-9-2
在线时间
9 小时
 楼主| 发表于 2013-10-22 11:55:21 | 显示全部楼层
回复【7楼】shihantu:
---------------------------------
我已经找到原因就是读取的地址0X08080000有问题,我想问一下,在对闪存模拟EEPROM时,对于地址有什么要求?

关于KEIL中target中的IROM1的起始地址我设为0x08000000,size设为0x80000,没有超过范围,为什么不可以读取0x08080000,谢谢啦!
众人划桨开大船!!!
回复 支持 反对

使用道具 举报

19

主题

302

帖子

2

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2011-11-22
在线时间
10 小时
发表于 2013-10-22 12:43:30 | 显示全部楼层
回复【9楼】I6believe:
---------------------------------
flash 地址512k的才0-0x7ffff,你怎么读0x80000
世界如此美好,好好珍惜每一天吧!
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-10-22 13:17:33 | 显示全部楼层
如8L所述.

如果按前面的做法,可以查到错误是精确数据访问错误,如果做数据合法性检查直接就停在对应的错误提示位置而不会去hardfault了.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

11

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2013-9-2
在线时间
9 小时
 楼主| 发表于 2013-10-23 14:41:48 | 显示全部楼层
谢谢楼上各位的帮忙,现在我已经解决问题了,就如9楼所说,是因为超出了FLASH的范围,将IROM1对应的SIZE减小一些,但是必须确保设置之后的SIZE的大小要大于代码的大小,然后分一部分空间模拟EEPROM就可以了。
众人划桨开大船!!!
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
发表于 2016-1-4 17:17:10 | 显示全部楼层
I6believe 发表于 2013-10-23 14:41
谢谢楼上各位的帮忙,现在我已经解决问题了,就如9楼所说,是因为超出了FLASH的范围,将IROM1对应的SIZE减 ...

你好 我也遇到了你一样的问题,然而到现在已经过去两年了,不知道楼主现在可以帮帮我
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 00:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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