打印

请教香主

[复制链接]
1738|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hb_haitao2009|  楼主 | 2011-9-15 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用STM32F103芯片,配置Timer模块和相应中断时出现HardFault。代码如下:
void board_init(void)
{
stm32f10x_cfg_sysclk();
stm32f10x_cfg_gpio();
stm32f10x_cfg_usart();
stm32f10x_cfg_adc1();
stm32f10x_cfg_spi();
stm32f10x_cfg_exti(); //在此函数中有配置相应Timer的中断允许位
stm32f10x_cfg_tim(); //此函数完成Timer的一些必要的设置
stm32f10x_cfg_fsmc();

#if SYS_WDT_ENABLE
stm32f10x_cfg_iwdg();
#endif
#if SYS_USB_ENABLE
stm32f10x_cfg_usb();
#endif
}

问题:如果在stm32f10x_cfg_exit()中设置全局中断允许位后,另在stm32f10x_cfg_tim()中调用TIM_ITConfig()设置模块中断允许,程序在这时产生HardFault
沙发
hb_haitao2009|  楼主 | 2011-9-15 10:54 | 只看该作者
唉,没人回答。

使用特权

评论回复
板凳
hb_haitao2009|  楼主 | 2011-9-15 12:59 | 只看该作者
神马

使用特权

评论回复
地板
香水城| | 2011-9-15 14:14 | 只看该作者
估计没有中断处理程序。

使用特权

评论回复
5
hb_haitao2009|  楼主 | 2011-9-15 14:32 | 只看该作者
还没有进入中断,开始以为是固件库的问题,但使用比较早的固件库任然会有同样的问题。
在设置相关Timer的DIER寄存器后,再设置NVIC中的ISER寄存器就会出现这个问题,如果不开启ISER或DIER中的任一个程序不会有HardFault.

使用特权

评论回复
6
hb_haitao2009|  楼主 | 2011-9-15 14:43 | 只看该作者
贴出完整的代码:
void stm32f10x_cfg_tim(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
#if SYS_USE_BEEP
        TIM_OCInitTypeDef TIM_OCInitStruct;
#endif

        TIM_TimeBaseInitStructure.TIM_Period = 125;     
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_Prescaler= (36 - 1);
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
       
        TIM_ClearFlag(TIM2, TIM_FLAG_Update);
                TIM_ITConfig(TIM2,TIM_FLAG_Updata,ENABLE);        TIM_Cmd(TIM2,ENABLE);
       
#if SYS_USE_BEEP
        TIM_TimeBaseInitStructure.TIM_Period = 13035;                        //abour output 2.778KHz
          TIM_TimeBaseInitStructure.TIM_Prescaler = 0;         // TIMCLK/2
          TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
          TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);

        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_OutputNState = TIM_OutputNState_Enable;
        TIM_OCInitStruct.TIM_Pulse = 6518;                                        //TIM_OCInitStruct.TIM_Plus = TIM_TimeBaseInitStruct.TIM_Period/2
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OCInitStruct.TIM_OCNPolarity = TIM_OCNPolarity_Low;
        TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Set;
        TIM_OCInitStruct.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
        TIM_OC1Init(TIM3,&TIM_OCInitStruct);
       
        TIM_ARRPreloadConfig(TIM3, ENABLE);
          TIM_Cmd(TIM3, ENABLE);
#endif
}

void stm32f10x_cfg_nvic(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

           /* Enable extern interrupt line */
        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;        //网络数据接收中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        board_dbg("\r\n Setting EXTI4_IRQn trig!");
       
            NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;  //网口休眠中断
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
            NVIC_Init(&NVIC_InitStructure);
       
        board_dbg("\r\n Setting EXTI9_5_IRQn!");       

        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;   //红外开盖信号中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        board_dbg("\r\n Setting EXTI15_10_IRQn!");

        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;        //shutdown INT
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        board_dbg("\r\n Setting EXTI2_IRQn!");
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                //采样周期中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        board_dbg("\r\n Setting TIM2_IRQn!");
       
#if SYS_USB_ENABLE
        NVIC_InitStructure.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
#endif

        NVIC_SetVectorTable(0x08000000, 0x00);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    /* Configure the Priority Group to 2 bits */
}

使用特权

评论回复
7
hb_haitao2009|  楼主 | 2011-9-15 16:31 | 只看该作者
在进行Timer的NVIC设置时当向ISER写入位值将LR寄存器的地址修改为0xfffffff1,从而引起Hardfault。

使用特权

评论回复
8
hb_haitao2009|  楼主 | 2011-9-16 21:52 | 只看该作者
不管是使用哪个定时器,只要一设置IDER寄存器或ISER寄存器中的相关位就会引起HardFault,如果在设置定时器时不设置IDER或ISER中任一个则不会出现Hardfault。但实现不了采样周期中断,请香主帮忙看下。

使用特权

评论回复
9
hb_haitao2009|  楼主 | 2011-9-16 21:52 | 只看该作者
:@

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

36

帖子

1

粉丝