stm32程序 停在HardFault_Handler(void)的问题
提出问题:
一:程序的入口及初始化过程
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)
{
}
}
请问:我该怎么查找问题出在哪呢? 或是这是该怎么解决呢? 谢谢!