stm32程序 停在HardFault_Handler(void)的问题

lianghuiyuan 2010-07-27 04:35:24
提出问题
一:程序的入口及初始化过程
int main (void)
{
buffer_Init();
Set_System();
//Set_USBClock();
//stm32_Init();
//USB_Interrupts_Config();
//USB_Init();
// STM32 setup this must be behind the USB_Init,or the usart setting would be change;
stm32_Init ();
I2C_Initialisation();

Config_Init();
flag_int = 0;
// GPIOA->ODR |= UART2_RTS;
// GPIOA->ODR &= ~UART2_RTS;
// GPIOB->ODR |= PB2_PWREN;
// GPIOB->ODR &= ~ PB2_PWREN;

// PWR->CR |= (1<<8); // enable access to RTC, BDC registers
// BKP->DR1 = 0x55AA; // fill BKP_DR1 register
// BKP->DR2 = 0x33CC; // fill BKP_DR2 register
// PWR->CR &= ~(1<<8); // disable access to RTC, BDC registers

GPIOA->ODR &= ~UART2_RTS; //RS485 rx enable
OSInit();
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart(); /* Start multitasking */
for(;;)
{}

}
/*----------------------------------------------------------*\
| END OF FILE |
\*----------------------------------------------------------*/

/*******************************************************************************
* Function Name : Config_Init
* Description : This function .....
* Input : None
* Output : None
* Return : None
*******************************************************************************/
/*****************************************read from 24c02 to config board****************************************************/
void Config_Init()
{
sw[0].sw_value = 0;
sw[1].sw_value = 0;
gpio[0].gpio_value = 0;
gpio[1].gpio_value = 0;
gpio[2].gpio_value = 0;
gpio[3].gpio_value = 0;
BLINK_LOW();
// GPIOC->ODR |= ( 1 << 1); //INT4 PULL UP
GPIOC->ODR |= ( 1 << 4); //INT4 PULL UP
GPIOC->ODR |= ( 1 << 5); //INT5 PULL UP
led_init();
Audio_Init();
AUDSEL_0(0);
AUDSEL_1(0);
MG3500_MCOEN();
PWREN0DISEN();
PWREN1DISEN();
PWREN2DISEN();
PWREN3DISEN();
// WriteByte_PCF8575(PCF8575_GPIO_0,0x0000); //tally0_r tally0_g is low
// WriteByte_PCF8575(PCF8575_GPIO_0,0xffff); //tally0_r tally0_g is low

}

二: 程序经过初始化后,通过按键进入中断void EXTI4_IRQHandler(void),如:
/*----------------------------------------------------------*\
| EXTI4 Interrupt Handler |
\*----------------------------------------------------------*/
void EXTI4_IRQHandler(void) //SW GROUP 1
{
if (EXTI->PR & (1<<4)) { // EXTI4 interrupt pending?
OSMboxPost(SwitchMbox,&num[4]);
EXTI->PR |= (1<<4); // clear pending interrupt
}
}
三:运行完以上的中断程序后,程序就运行进入:
void OS_TaskIdle (void *p_arg)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif



(void)p_arg; /* Prevent compiler warning for not using 'parg' */
for (;;) {
OS_ENTER_CRITICAL();
OSIdleCtr++;
OS_EXIT_CRITICAL();
OSTaskIdleHook(); /* Call user definable HOOK */
}
}
四:然后程序停在了void HardFault_Handler(void)。
/*******************************************************************************
* Function Name : HardFault_Handler
* Description : This function handles Hard Fault exception.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}


请问:我该怎么查找问题出在哪呢? 或是这是该怎么解决呢? 谢谢!
...全文
14445 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wesley 2012-10-27
  • 打赏
  • 举报
回复
lz的问题关键不是运行空闲函数是停在了HardFault_Handler 而是某个任务调度时 任务里有某条语法造成溢出了,建议每个任务单独单步运行 找出溢出的语句。
STM32_START 2012-10-26
  • 打赏
  • 举报
回复
lz解决没,给传授点经验呗、
tyt 2012-10-26
  • 打赏
  • 举报
回复
偶然发现的,折腾了我半天,好郁闷!!
tyt 2012-10-26
  • 打赏
  • 举报
回复
我也遇到这种问题,不过解决了。是jlink的问题,禁止用Jlink供电就可以了(在Jlink commander中输入power off,问题解决)
q273394140 2012-08-31
  • 打赏
  • 举报
回复
肯定是数据溢出了 找数组
过日子 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 8 楼 lr2131 的回复:
好像是发生了硬件错误中断,记得是还在学校玩cortex-M3核的ARM板时也遇到了这样的错误,应该是错误的操作了硬件,当是我的情况是没有打开相应的硬件模块但操作了相应的硬件而导致了错误。没仔细看你的程序,不知道是不是也是这样的原因。


“错误的操作了硬件”是什么意思?我查看了我的LR寄存器,发现是一个未知的地址:0xfffffffe,这个地址明显不……
[/Quote]


我的LR也是指向了“0xfffffffd”不知道是什么意思

有高手解决吗?
过日子 2012-08-24
  • 打赏
  • 举报
回复
我的LR也是指向了“0xfffffffd”不知道是什么意思

有没有人解决呢?
examdog 2012-07-31
  • 打赏
  • 举报
回复
基本上是数组越界的事,但不执行,看看到哪一步之后跳入错误中断,找数组就行了
zzw925624419 2012-01-10
  • 打赏
  • 举报
回复
没有中断程序入口,但是有了中断入口,却一直在中断服务程序中出不来,是什么原因呢
sunmoonxzit 2011-12-26
  • 打赏
  • 举报
回复
指针指向系统不允许的地方,换作数组试试
liaaaaa 2011-10-21
  • 打赏
  • 举报
回复
补充一句,我用的是事件驱动。可见
http://topic.csdn.net/u/20111020/14/69e5c589-61a3-41c4-930d-28985edffd80.html
liaaaaa 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qinming033 的回复:]
这或许跟KEIL编译器有关,我碰到过两次,感觉都好像是变量定义的位置对编译器的影响造成的,最后一次是单步调试观察到底死在哪里,最终发现访问一个结构体的变量时跳入HardFault_Handler,然后把这个结构体放到其它地方定义就解决问题,相当纳闷,不知道是不是KEIL的BUG。
[/Quote]

我去尝试一下你的办法。
hb_haitao2009 2011-10-21
  • 打赏
  • 举报
回复
没有中断程序入口
liaaaaa 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lr2131 的回复:]
好像是发生了硬件错误中断,记得是还在学校玩cortex-M3核的ARM板时也遇到了这样的错误,应该是错误的操作了硬件,当是我的情况是没有打开相应的硬件模块但操作了相应的硬件而导致了错误。没仔细看你的程序,不知道是不是也是这样的原因。
[/Quote]

“错误的操作了硬件”是什么意思?我查看了我的LR寄存器,发现是一个未知的地址:0xfffffffe,这个地址明显不存在。
qinming033 2011-08-30
  • 打赏
  • 举报
回复
这或许跟KEIL编译器有关,我碰到过两次,感觉都好像是变量定义的位置对编译器的影响造成的,最后一次是单步调试观察到底死在哪里,最终发现访问一个结构体的变量时跳入HardFault_Handler,然后把这个结构体放到其它地方定义就解决问题,相当纳闷,不知道是不是KEIL的BUG。
lr2131 2011-05-05
  • 打赏
  • 举报
回复
好像是发生了硬件错误中断,记得是还在学校玩cortex-M3核的ARM板时也遇到了这样的错误,应该是错误的操作了硬件,当是我的情况是没有打开相应的硬件模块但操作了相应的硬件而导致了错误。没仔细看你的程序,不知道是不是也是这样的原因。
ffeige1984 2011-05-05
  • 打赏
  • 举报
回复
一般出现这种问题是溢出 数组越界
king_sunshine 2011-05-03
  • 打赏
  • 举报
回复
怎么知道数组是否越界?
zenmedoucunzaile 2010-12-12
  • 打赏
  • 举报
回复
有没有数组访问过界?
cz1129 2010-11-03
  • 打赏
  • 举报
回复
这个问题我现在也碰到,程序跑一段时间后进入HardFault_Handler。我没有使用OS,但是用了定时中断,ADC中断和DMA中断。还没找到原因呢。
加载更多回复(3)

21,618

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧