7349|8

144

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

STM32+nand flash调试程序进入HardFault_Handler() [复制链接]

本帖最后由 qiwan 于 2015-3-10 19:59 编辑

调试STM32读写nand flash K9F1G08U0D的程序,程序实现的功能是对nand flash的第一块的前两页
写数据,且从第一页的第一个字节地址开始写,写完之后,对两页的数据进行读取,若读取得到的
数据之前写入的数据一致,则执行其他操作。

通过函数 FSMC_NAND_WriteSmallPage(TxBuffer, WriteReadAddr, PageNumber)对nand flash写;
然后通过函数FSMC_NAND_ReadSmallPage (RxBuffer, WriteReadAddr, PageNumber)对之前写的两页
进行读。
调试中发现,当程序执行到语句:
status = FSMC_NAND_ReadSmallPage (RxBuffer, WriteReadAddr, PageNumber);
时,便会进入到HardFault_Handler()函数中,不断地执行while(1)中的空语句。
如图1和12所示。



通过网上提供的“解决stm32进入HardFault_Handler的定位方法,将错误定位到了语句:

status = FSMC_NAND_ReadStatus();

如图123所示:



但还是找不出问题出在哪里。

先将程序附件呈上,希望有机会讨论一下,先谢过!



1.PNG (14.29 KB, 下载次数: 0)

1.PNG

12.PNG (9.6 KB, 下载次数: 0)

程序进入HardFault_Handler()中

程序进入HardFault_Handler()中

123.PNG (53.67 KB, 下载次数: 0)

将错误定位在FSMC_NAND_ReadStatus()

将错误定位在FSMC_NAND_ReadStatus()

stm32 nand flash.rar

4.49 MB, 下载次数: 31

此帖出自stm32/stm8论坛

最新回复

学习受教了。有时候的确是栈设置小  详情 回复 发表于 2016-5-25 11:32
点赞 关注
 

回复
举报

144

帖子

2

TA的资源

一粒金砂(高级)

沙发
 
程序进入HardFault_Handler()函数可能的原因通常是:堆栈溢出或数组过界或指针指飞。
虽然FSMC_NAND_ReadStatue()中涉及到指针,但我并不认为指针指飞了。
因为程序中有很多 status。不论是对flash的写函数
FSMC_NAND_WriteSmallPage(TxBuffer, WriteReadAddr, PageNumber);
还是对flash 的读函数
FSMC_NAND_ReadSmallPage (RxBuffer, WriteReadAddr, PageNumber);
或者对flash的块擦除函数:
FSMC_NAND_EraseBlock(WriteReadAddr);
或者状态读取函数:
FSMC_NAND_GetStatus();
它们的返回参数都用名称相同的status保存,
程序在main()函数之前定义了一个全部变量,但有时也是某个函数中的局部变量,
虽然status这个变量名在程序中出现很多次,但我觉得应该也不会影响程序的正确运行。
还是找不到方向
此帖出自stm32/stm8论坛
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

板凳
 
重新设置一下堆栈空间看看。
此帖出自stm32/stm8论坛

点评

非常感谢版主的提醒,问题解决了。 方法:修改启动文件startup_stm32f10x_hs.d中堆栈段的大小改大点,如下图所示。  详情 回复 发表于 2015-3-11 10:23
 
个人签名我的博客
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

4
 
zhaojun_xf 发表于 2015-3-11 10:06
重新设置一下堆栈空间看看。

非常感谢版主的提醒,问题解决了。
方法:修改启动文件startup_stm32f10x_hs.d中堆栈段的大小改大点,如下图所示。


重新设置堆栈空间.PNG (6.88 KB, 下载次数: 1)

重新设置堆栈空间.PNG
此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

5
 
补充一下:
当;Stack_Size EQU 0x00000400  //栈
      Heap_Size EQU 0x00000200  //堆
这时,堆栈溢出,程序就会进入HardFault_Handler();
于是,将堆栈空间设置的大一点:
比如:
     Stack_Size EQU 0x00000400  //栈
     Heap_Size EQU 0x00000400  //堆
或者
     Stack_Size EQU 0x00000800  //栈
     Heap_Size EQU 0x00000200  //堆
再次谢谢版主的帮忙,thx
此帖出自stm32/stm8论坛
 
 
 

回复

1万

帖子

16

TA的资源

版主

6
 
学习啦
此帖出自stm32/stm8论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

7
 
这种问题很多人遇到,设置为精华,方便大家借鉴。。。。
此帖出自stm32/stm8论坛

点评

恩,这里也分享一下正点原子的一个链接:http://www.openedv.com/posts/list/0/24152.htm 大家一起学习进步  详情 回复 发表于 2015-3-11 13:09
 
个人签名我的博客
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

8
 
zhaojun_xf 发表于 2015-3-11 11:30
这种问题很多人遇到,设置为精华,方便大家借鉴。。。。

恩,这里也分享一下正点原子的一个链接:http://www.openedv.com/posts/list/0/24152.htm
大家一起学习进步

此帖出自stm32/stm8论坛
 
 
 

回复

483

帖子

0

TA的资源

一粒金砂(中级)

9
 
学习受教了。有时候的确是栈设置小
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表