程序初始化进入HardFault_Handler

[复制链接]
7725|10
 楼主| lgcuishuang 发表于 2009-12-1 23:08 | 显示全部楼层 |阅读模式
如题:IAR+Jlink,SWD方式调试,芯片型号为STM32F101CBT6,仿真运行,执行到函数TIM2_Configuration中的TIM_Cmd(TIM2, ENABLE);就进入到HardFault_Handler,如果复位后重新运行则执行到NVIC_Configuration中的NVIC_Init(&NVIC_InitStructure);就进入到HardFault_Handler,找了好久没有找到原因,请香主帮忙分析,谢谢!
代码:
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    #ifdef VECT_TAB_RAM
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
    #else
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    #endif
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // Configure the NVIC Preemption Priority Bits
    //NVIC_InitStructure.NVIC_IRQChannel            = USART1_IRQn;
    //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    //NVIC_InitStructure.NVIC_IRQChannelCmd         = ENABLE;
    //NVIC_Init(&NVIC_InitStructure);
    //Enable the TIM2 global Interrupt
    NVIC_InitStructure.NVIC_IRQChannel            = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd         = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   
    //使能EXTI 12通道
    //NVIC_InitStructure.NVIC_IRQChannel            = EXTI15_10_IRQn;
    //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    //NVIC_InitStructure.NVIC_IRQChannelCmd         = ENABLE;
    //NVIC_Init(&NVIC_InitStructure);
}

void TIM2_Configuration(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   
    TIM_TimeBaseStructure.TIM_Period        = 5625;                 
    TIM_TimeBaseStructure.TIM_Prescaler     = 64;                  
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;      
    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Down;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);               
    TIM_ARRPreloadConfig(TIM2, ENABLE);                          
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM2, ENABLE);
}

另外进入到HardFault_Handler后观察到LR=0xFFFFFFF1
xiaoerge 发表于 2009-12-2 09:06 | 显示全部楼层
可以看一下堆栈,异常之前栈顶的一些数据可能有用
另外NVIC的寄存器也可以看一下,有一个寄存器指示当前服务的ISR序号,
看一下是否当前处理的ISR是否就是异常,

我碰到一个奇异的问题就是,并不是真正的异常,而是别的中断导致的
dfsa 发表于 2009-12-2 09:57 | 显示全部楼层
那要看你开了哪几个中断,而且高低优先级是否配置的合理
ma1986 发表于 2009-12-2 10:25 | 显示全部楼层
是伪中断吗?如果除了这个异常,还进入还进入其他异常的话,可能是数组越界了。。
ST_ARM 发表于 2009-12-2 10:29 | 显示全部楼层
贴出你的初始化的流程代码。
 楼主| lgcuishuang 发表于 2009-12-2 10:49 | 显示全部楼层
回LS,我只设置了这一个中断,其他的都屏蔽了,出现我描述的现象!
 楼主| lgcuishuang 发表于 2009-12-2 10:53 | 显示全部楼层
刚才是回3楼的,呵呵!回5楼,程序不在单位电脑里,晚上贴出,你的意思是和初始化的先后顺序有关?
ST_ARM 发表于 2009-12-2 10:58 | 显示全部楼层
仿真时不排除这种可能
 楼主| lgcuishuang 发表于 2009-12-2 19:23 | 显示全部楼层
初始化流程:
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
I2C2_Configuration();
TIM2_Configuration();
SPI2_Configuration();
 楼主| lgcuishuang 发表于 2009-12-2 21:42 | 显示全部楼层
问题找到了,是IAR工程建的有问题,刚刚用IAR5.30,并且将固件库升级到3.1.0,不太熟悉,呵呵,谢谢大家帮忙分析!
aaa2742 发表于 2011-4-10 13:52 | 显示全部楼层
乱七八糟的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部