OpenEdv-开源电子网

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

《原子库函数版》 31章 FLASH模拟EEPROM 读取函数 STMFLASH_Read ,当 读取数据 数目较大时出错。 不知道怎么回事

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-3-22
在线时间
0 小时
发表于 2014-3-22 22:15:11 | 显示全部楼层 |阅读模式
照着书本写的。
void STMFLASH_Read(u16* pBuffer, u32 ReadAddr, u16 NumToRead)
{

    u16 i;
    for(i=0; i < NumToRead; i++)
    {
        pBuffer = STMFLASH_ReadHalfWord(ReadAddr);
        //地址指向下一个半字
        ReadAddr += 2;
    }
}

NumToRead 等于 700时没有错 , 等于800就出错了。
然后我的板是 107VC   FLASH 是 256K大小  每页 2K
#define STM_SECTOR_SIZE                        2048
u16 STMFLASH_BUF[1024];
#define StartAdress ((u32)0x08038800)
我是这么调用的STMFLASH_Read(STMFLASH_BUF, StartAdress , 1024);



帮帮忙,谢谢。


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

使用道具 举报

3

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2015-4-14
在线时间
62 小时
发表于 2015-9-5 21:50:49 | 显示全部楼层
顶起,我也遇到类似的问题,也是调用flash读写函数时,程序会跑到硬件错误的死循环中.........求解
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-22 23:00:13 | 显示全部楼层
这个手头没有107板,不好帮你测试啊。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-3-22
在线时间
0 小时
 楼主| 发表于 2014-3-23 10:51:07 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------

站长好,现在发现了新问题。
是这样的,直接在main()函数里面这样调用,没有出错。 

u16 Rbuffer[1024];
u16 *pRbuffer = Rbuffer;
STMFLASH_Read(pRbuffer, 0x08038800, 1024);

当写了个函数
void p()
{
u16 Rbuffer[1024];
u16 *pRbuffer = Rbuffer;
STMFLASH_Read(pRbuffer, StartAdress, 1024);
}

在main()里面在调用 p();  时, 就会出错,跳转到这个函数。

void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

也就是说按照书本上  在   STMFLASH_Write(...)里面调用 STMFLASH_Read(pRbuffer, StartAdress, 1024);  就出错。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-23 11:02:47 | 显示全部楼层
回复【3楼】我要当警察了:
---------------------------------
啥意思?
在STMFLASH_Write里面调用STMFLASH_Read???
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-3-22
在线时间
0 小时
 楼主| 发表于 2014-3-23 11:07:01 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
书本上的 STMFLASH_Write(...)里面 就调用 STMFLASH_Read(...);读取一扇区数据 
因为写数据,所以要先把对应扇区的数据读出来,校验,是否需要擦除。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-23 13:47:06 | 显示全部楼层
额,确实是有这个。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-3-22
在线时间
0 小时
 楼主| 发表于 2014-3-25 16:26:15 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
站长好,现在我遇到一个问题。  在34章flash模拟EEPROM中
执行写函数STMFLASH_Write(...) ,单步调试,箭头到最后大括号后,再点击下一步,程序就死掉不动了,不懂是怎么回事。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-25 21:02:20 | 显示全部楼层
回复【7楼】我要当警察了:
---------------------------------
直接是我们的源码,没有修改么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-8-22
在线时间
22 小时
发表于 2015-10-14 17:14:44 | 显示全部楼层
原子哥,我也遇到这个问题了。。。
回复 支持 反对

使用道具 举报

16

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-8-22
在线时间
22 小时
发表于 2015-10-14 17:16:04 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥,我也遇到这个问题了,在STMFLASH_Write中STMFLASH_Read,一跳出STMFLASH_Read 就近HardFault_Handler了。
回复 支持 反对

使用道具 举报

16

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-8-22
在线时间
22 小时
发表于 2015-10-14 17:29:09 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
解决了,也给楼上兄弟说一声,堆栈空间不够,改大一点。
回复 支持 反对

使用道具 举报

62

主题

275

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1155
金钱
1155
注册时间
2012-3-4
在线时间
80 小时
发表于 2016-4-22 11:22:53 | 显示全部楼层
shangwudong 发表于 2015-10-14 17:29
回复【8楼】正点原子:
---------------------------------
解决了,也给楼上兄弟说一声,堆栈空间不够,改 ...

我今天也遇到了,堆栈都是够的啊
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-4-22
在线时间
1 小时
发表于 2016-4-22 18:34:02 | 显示全部楼层
我也遇到了这个问题
/*main里面
u8 *Parity = (u8*)"even";
AT24CXX_Read(6,Parity,4);
运行 ,死在
void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
{
        while(NumToRead)
        {
                *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);       
                NumToRead--;
        }
}  

进入AT24CXX_Read函数,第一次经过NumToRead--;后就HardFault_Handler
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-4-22
在线时间
1 小时
发表于 2016-4-22 19:42:09 | 显示全部楼层
找到原因了,
把"abc"赋给一个字符指针变量时,如
       char* ptr = "abc";
因为定义的是一个普通指针,并没有定义空间(注意!)来存放"abc",所以编译器得帮我们找地方来放"abc",显然,把这里的"abc"当成常量并把它放到程序的常量区是编译器最合适的选择。所以尽管ptr的类型不是const char*,并且ptr[0] = 'x';也能编译通过,但是执行ptr[0] = 'x';就会发生运行时异常,因为这个语句试图去修改程序常量区中的东西。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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