OpenEdv-开源电子网

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

STM32硬件错误问题

[复制链接]

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
976
金钱
976
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-8-27 10:14:46 | 显示全部楼层 |阅读模式
5金钱
       我使用STM32F103VE处理器,程序中使用了emWin+fatfs,之前把字库直接放在SPIflash里面没有跑文件系统一切正常。现在用usb+SPIflash模拟了一个U盘+fatfs文件系统,将字库存在模拟的U盘里,运行GUI_DispStringAt("上海人民欢迎您!123",10,100);
这句函数时进入了硬件错误(之前在创建字体时也发生了很多问题,不过都被我解决了),我单步调试一直跟踪到底层发现错误位置是在底层读函数结束后退出时直接退出到了硬件错误,想请问一般这种情况可能是哪里的问题?我适当调整了堆栈大小和优化级别都没能解决!!

第一张图:跟踪fatfs到ff.c中的if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break;然后运行进入图2底层读,
图3是单步运行能正常读取,包括函数中的变量参数值也没有异常,图4是函数单步运行退出后就进入错误了?

ff.c中截图

ff.c中截图

底层读函数

底层读函数
3.jpg

函数退出进入错误

函数退出进入错误
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
976
金钱
976
注册时间
2016-6-15
在线时间
474 小时
 楼主| 发表于 2016-8-27 15:05:02 | 显示全部楼层
这是我在网上找到的一篇测试文章,我按照下面的步骤测试了结果在最后面,谁能帮我看看因为我不了解ARM的寄存器?

Cortex-M3 内核HardFault错误调试定位方法
1、首先更改startup.s的启动文件,把里面的HardFault_Handler代码段换成下面的代码:
HardFault_Handler\
                                PROC
                                IMPORT  hard_fault_handler_c
                                TST LR, #4
                                ITE EQ
                                MRSEQ R0, MSP
                                MRSNE R0, PSP                               
                                B  hard_fault_handler_c
                ENDP
2、然后把hard_fault_handler_c函数放在c文件的代码中。代码如下:
void hard_fault_handler_c(unsigned int * hardfault_args)
{
        static unsigned int stacked_r0;
        static unsigned int stacked_r1;
        static unsigned int stacked_r2;
        static unsigned int stacked_r3;
        static unsigned int stacked_r12;
        static unsigned int stacked_lr;
        static unsigned int stacked_pc;
        static unsigned int stacked_psr;
        static unsigned int SHCSR;
        static unsigned char MFSR;
        static unsigned char BFSR;       
        static unsigned short int UFSR;
        static unsigned int HFSR;
        static unsigned int DFSR;
        static unsigned int MMAR;
        static unsigned int BFAR;
        stacked_r0 = ((unsigned long) hardfault_args[0]);
        stacked_r1 = ((unsigned long) hardfault_args[1]);
        stacked_r2 = ((unsigned long) hardfault_args[2]);
        stacked_r3 = ((unsigned long) hardfault_args[3]);
        stacked_r12 = ((unsigned long) hardfault_args[4]);
        /*异常中断发生时,这个异常模式特定的物理R14,lr被设置成该异常模式将要返回的地址*/
        stacked_lr = ((unsigned long) hardfault_args[5]);        
        stacked_pc = ((unsigned long) hardfault_args[6]);
        stacked_psr = ((unsigned long) hardfault_args[7]);
        SHCSR = (*((volatile unsigned long *)(0xE000ED24))); //系统Handler控制及状态寄存器
        MFSR = (*((volatile unsigned char *)(0xE000ED28)));        //存储器管理fault状态寄存器       
        BFSR = (*((volatile unsigned char *)(0xE000ED29)));        //总线fault状态寄存器       
        UFSR = (*((volatile unsigned short int *)(0xE000ED2A)));//用法fault状态寄存器               
        HFSR = (*((volatile unsigned long *)(0xE000ED2C)));  //fault状态寄存器                       
        DFSR = (*((volatile unsigned long *)(0xE000ED30)));        //调试fault状态寄存器
        MMAR = (*((volatile unsigned long *)(0xE000ED34)));        //存储管理地址寄存器
        BFAR = (*((volatile unsigned long *)(0xE000ED38))); //总线fault地址寄存器
        while (1);
}
3、执行程序后,若发生内核错误,则程序会运行到最后的while(1)处。此时观察相应的堆栈和故障寄存器值, stacked_lr即为故障发生时进入故障中断前pc的值,在MDK软件调试状态下,假如stacked_lr的值为0x1A002D08,在左下方的命令窗口输入“pc = 0x1A002D08”,回车,即可定位发生错误的代码位置。
4、根据内核错误状态寄存器的值,对应下面的说明,也可以看出是发生了何种内核错误。
附录:Cortex-M3内核错误寄存器说明
file:///C:\Users\sf\AppData\Local\Temp\ksohtml\wps2B7C.tmp.jpg
file:///C:\Users\sf\AppData\Local\Temp\ksohtml\wps2B7D.tmp.jpg
file:///C:\Users\sf\AppData\Local\Temp\ksohtml\wps2B7E.tmp.jpg
file:///C:\Users\sf\AppData\Local\Temp\ksohtml\wps2B8E.tmp.jpg
file:///C:\Users\sf\AppData\Local\Temp\ksohtml\wps2B8F.tmp.jpg
file:///C:\Users\sf\AppData\Local\Temp\ksohtml\wps2B90.tmp.jpg
file:///C:\Users\sf\AppData\Local\Temp\ksohtml\wps2B91.tmp.jpg
file:///C:\Users\sf\AppData\Local\Temp\ksohtml\wps2BA2.tmp.jpg
22.jpg
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
976
金钱
976
注册时间
2016-6-15
在线时间
474 小时
 楼主| 发表于 2016-8-27 15:37:09 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-8-27 15:40 编辑

    我调试单步运行发现进入函数后执行PUSH {r4-r6,lr},然后退出函数后POP  {r4-r6,pc}  我发现保护的数据在函数退出恢复时值已经不对了,看下图,谁帮我分析一下是什么问题要怎么解决。


1.jpg
2.jpg
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-7-10
在线时间
15 小时
发表于 2016-8-27 16:25:31 | 显示全部楼层
把栈的大小再调大一点试试
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
976
金钱
976
注册时间
2016-6-15
在线时间
474 小时
 楼主| 发表于 2016-8-27 16:55:13 | 显示全部楼层
ctwillson 发表于 2016-8-27 16:25
把栈的大小再调大一点试试

堆栈设置到30k都不行,
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-7-10
在线时间
15 小时
发表于 2016-8-27 16:59:53 | 显示全部楼层
shuaigew88 发表于 2016-8-27 16:55
堆栈设置到30k都不行,

和堆有啥关系哦,既然恢复不了数据,先把栈值调大喽
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-7-10
在线时间
15 小时
发表于 2016-8-27 17:00:49 | 显示全部楼层
shuaigew88 发表于 2016-8-27 16:55
堆栈设置到30k都不行,

另外求上面那个修改启动代码的参考链接,想看一下,谢谢啦
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
976
金钱
976
注册时间
2016-6-15
在线时间
474 小时
 楼主| 发表于 2016-8-27 17:10:04 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-8-27 17:11 编辑
ctwillson 发表于 2016-8-27 16:59
和堆有啥关系哦,既然恢复不了数据,先把栈值调大喽

堆和栈的值都修改过解决不了这个问题,那个测试的文章是我在网上下载的一片word,你需要我可以发给你。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-8-28 23:55:15 | 显示全部楼层
检查是不是指针乱飞了,或者数组溢出了。
回复

使用道具 举报

5

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2019-10-7
在线时间
36 小时
发表于 2020-12-18 10:34:20 | 显示全部楼层
shuaigew88 发表于 2016-8-27 15:37
我调试单步运行发现进入函数后执行PUSH {r4-r6,lr},然后退出函数后POP  {r4-r6,pc}  我发现保护的数 ...

请问问题解决了吗?我也遇到了同样的问题
回复

使用道具 举报

5

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2019-10-7
在线时间
36 小时
发表于 2020-12-18 10:44:20 | 显示全部楼层
我也遇到了同样的问题。
回复

使用道具 举报

5

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2019-10-7
在线时间
36 小时
发表于 2020-12-18 10:45:27 | 显示全部楼层
shuaigew88 发表于 2016-8-27 17:10
堆和栈的值都修改过解决不了这个问题,那个测试的文章是我在网上下载的一片word,你需要我可以发给你。

你能把这篇Word发给我吗?谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-14 18:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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