程序下载可以运行,但是一复位就进HardFault_Handler

2019-07-21 01:33发布

各位  有个困扰1个月的问题:
我的32板子在下载程序后可以正常运行,但是断电后再开程序就会在main函数前进入HardFault_Handler中断,进入后R14(LR)为0xFFFFFFF9。
发生这个错误是因为工程越写越大,增加任意一段新的代码后,都会产生这个问题,将这个任意代码删除后,程序又恢复正常。
各位大牛又遇到过这种情况吗?

不是每次都不运行  只要SWD下载程序后  都是正常运行  但是一复位就死了


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
wms124
1楼-- · 2019-07-21 02:17
 我真的只需要删除任意一段代码  程序就可以正常复位:
删除任意代码前:



删除任意代码后:



仅仅只是Code 小了一点    就正常启动了,复位后也正常
正点原子
2楼-- · 2019-07-21 02:23
 精彩回答 2  元偷偷看……
linbeithree
3楼-- · 2019-07-21 04:32
回复【2楼】wms124:
-------------------------------
堆栈溢出,首先有没有用OS,其次检查 有没有使用c库函数,现在的C库必须告别,除了原子哥说的printf之类,memset,memcpy等等,都有可能造成栈空间爆了。
wms124
4楼-- · 2019-07-21 10:03
回复【3楼】正点原子:
---------------------------------
原子哥。
我原来使用了printf函数,经你说过后来全都如下注释了,但是程序还是那样:

/********************  printf support  ***********************/
//#ifdef EN_USART3_PRINTF
//#pragma import(__use_no_semihosting)  
// extern "C" void _sys_exit(int x)  
// {  
// x = x;  
// }
// namespace std
// {

// struct __FILE  
// {  
// int handle;  
// // Whatever you require here. If the only file you are using is  
// // standard output using printf() for debugging, no file handling  
// // is required. 
// };  
// // FILE is typedef?? d in stdio.h.  


// FILE __stdout;
// }

// int std::fputc(int ch, std::FILE *f) 
// { 
// // lace your implementation of fputc here 
// // e.g. write a character to the USART  
// while((USART3->SR&0X40)==0);//???··???,?±??·????ê±?
// USART3->DR = (u8)ch;    
// // Loop until the end of transmission   
// return ch; 
// }
//#endif //EN_USART3_PRINTF

我又仔细检查了硬件电路,确认电路没有问题。又烧写了以前的程序和其他的大工程,都可以正常运行。
所以我把错误锁定在软件上。
我也没有使用过UCOS,没有内存分配,没有文件系统,只有一个STM32F4 emulation_eeprom,用于将一部分空间用作存储器。
wms124
5楼-- · 2019-07-21 13:48
回复【4楼】linbeithree:
---------------------------------
没有操作系统,也没有内存管理之类的,有个printf也已经注释掉了。
你所说的c库函数是STM32库函数吗?我不太理解。

但是我用了《STM32F4 emulation_eeprom》这个开源代码,是将部分FLASH初始化为EEPROM用于保存数据。
正点原子
6楼-- · 2019-07-21 18:14
 精彩回答 2  元偷偷看……

一周热门 更多>