OpenEdv-开源电子网

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

奇怪问题:stm32写入flash数据出现HardFault_Handler,百思不得其解

[复制链接]

35

主题

181

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1115
金钱
1115
注册时间
2016-8-1
在线时间
235 小时
发表于 2018-3-24 13:27:57 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 rindy 于 2018-3-24 14:07 编辑

[mw_shl_code=c,true]void add_user_log(u8 *user_log_time,u8 *user_log_custom_cardnum,u8 user_log_action,u8 user_log_door_num)//添加用户刷卡操作记录
{
        u16 i=0;
        struct User_Operation_Log *p;//定义结构体指针
        u16 j;
        u8 uu[sizeof(user_operation_log)]={0};
        
        
        printf("写进去之前user_log_current_num=%d\r\n",user_log_current_num);
        STMFLASH_Write(Adress39,&user_log_current_num,1);//写入当前最近一条存储的序号     执行这条的时候就出现HardFault_Handler,不知道怎么回事,其他的地方用这句函数都没有问题,很奇怪
        
        STMFLASH_Read(Adress39,&user_log_current_num,1);//读出当前最近一条存储的序号
        printf("读出来user_log_current_num=%d\r\n",user_log_current_num);
//        
        
        strcpy(user_operation_log[user_log_current_num].user_log_time, user_log_time);
        strcpy(user_operation_log[user_log_current_num].user_log_custom_cardnum, user_log_custom_cardnum);
        user_operation_log[user_log_current_num].user_log_action=user_log_action;
        user_operation_log[user_log_current_num].user_log_door_num=user_log_door_num;
        user_log_current_num++;


        if(user_log_current_num>Max_User_Log_Num)
                user_log_current_num=1;
        
        p=user_operation_log;//取得首地址
        for(j=0;j<sizeof(user_operation_log);j++)
        {
                uu[j]=*(((u8*)p)+j);              
        }

        STMFLASH_Write(0x8034000,(u16*)uu,sizeof(user_operation_log));
        
        
        
        
}[/mw_shl_code]

单片机型号是stm32f103vct6  flash256k
调用上面函数时候在执行到STMFLASH_Write(Adress39,&user_log_current_num,1);就出现HardFault_Handler,调用的是原子的flash函数,其他地方调用都正常的,这里不知道就出现这种情况,写入的只是一个简单的变量。有没有大神帮我解释一下,搞了一天了。
[img]file:///C:\Users\jblzky\AppData\Roaming\Tencent\Users\2292560110\QQ\WinTemp\RichOle\J0H`)8E_EOI]7M]1E3N%E@0.png[/img]





J0H`)8E_EOI]7M]1E3N%E@0.png

最佳答案

查看完整内容[请看2#楼]

我发现程序的核心原因是这个https://blog.csdn.net/l_w_zeng/article/details/73502095,现在我的程序就像文中所说,定义的结构体数据会不知所云的变化,完全不按照逻辑来,因为我在程序中定义了很多局部数组都是很大的,超过了系统的Stack_Size为栈的大小,默认为0x400,现在程序老是出现莫名其妙的问题,我已经奔溃了 现在我把定义大的局部变量全都去掉了,换成了一个全局变量大数组,问题都好了,真是找花了我三天时间啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

35

主题

181

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1115
金钱
1115
注册时间
2016-8-1
在线时间
235 小时
 楼主| 发表于 2018-3-24 13:27:58 | 显示全部楼层
本帖最后由 rindy 于 2018-3-26 12:50 编辑

我发现程序的核心原因是这个https://blog.csdn.net/l_w_zeng/article/details/73502095,现在我的程序就像文中所说,定义的结构体数据会不知所云的变化,完全不按照逻辑来,因为我在程序中定义了很多局部数组都是很大的,超过了系统的Stack_Size为栈的大小,默认为0x400,现在程序老是出现莫名其妙的问题,我已经奔溃了
现在我把定义大的局部变量全都去掉了,换成了一个全局变量大数组,问题都好了,真是找花了我三天时间啊
回复

使用道具 举报

0

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-3-14
在线时间
19 小时
发表于 2018-3-24 13:55:16 | 显示全部楼层
Adress39和user_log_current_num在哪定义的?
回复

使用道具 举报

35

主题

181

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1115
金钱
1115
注册时间
2016-8-1
在线时间
235 小时
 楼主| 发表于 2018-3-24 13:57:04 | 显示全部楼层
qinlicn 发表于 2018-3-24 13:55
Adress39和user_log_current_num在哪定义的?

是全局变量,外面定义的   #define Adress39  0x8030048              u16 user_log_current_num=1;
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-24 18:31:26 来自手机 | 显示全部楼层
stm32的片内flash,写入之前不是0xFF就会错误,写之前要擦除的
回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-3-24 19:01:31 | 显示全部楼层
写保护?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-25 01:05:41 | 显示全部楼层
仿真进入STMFLASH_Write,看看是执行哪一行出问题了?
回复

使用道具 举报

35

主题

181

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1115
金钱
1115
注册时间
2016-8-1
在线时间
235 小时
 楼主| 发表于 2018-3-26 09:35:30 | 显示全部楼层
正点原子 发表于 2018-3-25 01:05
仿真进入STMFLASH_Write,看看是执行哪一行出问题了?

原子大哥,我后来发现把函数里面的数组定义成u8 uu[sizeof(user_operation_log)+8000]={0};就不会出现HardFault_Handler,但是定义成u8 uu[sizeof(user_operation_log)+7000]={0};还是会出现HardFault_Handler,这是什么原因啊,奇怪
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-11-8
在线时间
33 小时
发表于 2018-3-26 09:38:51 | 显示全部楼层
既简单,hard fault 90%的原因就是数据访问越界,好好查吧。
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-11-8
在线时间
33 小时
发表于 2018-3-26 09:39:24 | 显示全部楼层
liweimin134 发表于 2018-3-26 09:38
既简单,hard fault 90%的原因就是数据访问越界,好好查吧。

极简单
回复

使用道具 举报

35

主题

181

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1115
金钱
1115
注册时间
2016-8-1
在线时间
235 小时
 楼主| 发表于 2018-3-26 09:47:49 | 显示全部楼层
liweimin134 发表于 2018-3-26 09:38
既简单,hard fault 90%的原因就是数据访问越界,好好查吧。

不好查呀,我都仔细反反复复看了两天了,都没找到
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-14 13:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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