GD32F407系列单片机使用FATFS文件系统调试SD卡导致HARD FAULT故障

http://t.csdn.cn/dlndk
接上片,在使用Keil5和GD32F407单片机时出现了如下故障。

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

经过研究发现是在使用FATFS文件系统的f_open,f_close等函数进行txt文件的写入时造成。具体的FATFS文件系统使用有很多帖子,我在这主要记录一下自己的问题出现和解决。
在完成了一系列查找和调试后,我可以在sd里通过fatfs文件写东西了,但紧接着发现退出包含了f_open,f_close等函数的子函数时,系统会直接掉进HardFault_Handler的死循环。针对这个硬件故障自己查了很多帖子,最共性的点都是说
在这里插入图片描述
自己检查一番后,感觉只能是堆栈溢出的问题,然而本人作为新手菜鸡,没遇到过这类问题不知道哪里为什么溢出了,查找无果后,本人直接搜“fatfs sd卡 Hardfault”这几个关键字组合起来,果然找到了更进一步的东西。
http://t.csdn.cn/UbNz4(文章出处)
在这里插入图片描述
据此找到了一个修改堆栈大小的帖子,在startup_gd32f407.s文件中,修改了堆栈的大小
在这里插入图片描述
然而,问题并没有结局,仍然会溢出。那么根据第一张图中说,Fatfs中有两个结构体非常大那么我便将

FATFS FileSys;
FIL File;

这两个结构体都放在了全局变量中,然而。。。依然无效。根据原理现在变量从栈区到了全局静态区,但是还会溢出,至此本人求助了一同事。同事通过如下操作解决了问题即:将FATFS生命的变量开辟在全局,而具体文件的FIle开辟在了局部。。。 然后就ok了。

FATFS FileSys;
void function()
{FIL File;}

个人分析,全放在全局变量同样导致了内存相应存储区的溢出,而把他们分开一个在全局变量,一个在局部变量,两个空间就都不会冲突了。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值