STM32VLDiscovery定时器中断HardFault c

时间:2018-02-06 21:43:53

标签: c timer interrupt stm32

我试图在STM32VLD发现板上的stm32f100rbt6上使用stm32定时器中断编写一个短程序。

这是我到目前为止的代码(main.c):

static inline void initGPIO() {
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
    GPIO_InitTypeDef init;
    init.GPIO_Mode = GPIO_Mode_Out_PP;
    init.GPIO_Speed = GPIO_Speed_2MHz;
    init.GPIO_Pin = 0xFFFF;
    GPIO_Init(GPIOC, &init);
}

static inline void initTimer3() {
    NVIC_EnableIRQ(TIM3_IRQn);
    RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
    TIM3->SR = 0;
    TIM3->ARR = 0xFFFF;
    TIM3->PSC = 0xFFFF;
    TIM3->DIER = TIM_DIER_UIE;
    TIM3->CR1 |= TIM_CR1_CEN;
    //same problem when I enable the IRQ here
}

int main(void) {
    SCB->CCR |= SCB_CCR_STKALIGN;
    SystemInit();

    initGPIO();

    GPIOC->ODR = 0xFFFF;

    initTimer3();

    for (;;) {
        GPIOC->BSRR = ~(TIM3->CNT >> 8) & 0x7F;
        GPIOC->BRR = (TIM3->CNT >> 8) & 0x7F;
    }
}

void TIM3_IRQHandler() {
    TIM3->SR = 0;
    //GPIOC->ODR = 0xCC;
}

void HardFault_Handler() {
    GPIOC->BRR = 0x100;
    while (1)
        ;
}

每次定时器溢出时都应该调用IRQHandler。当我不启用NVIC时,程序会正常运行,只需将部分定时器值写入GPIOC。但只要调用initTimer3函数,我就会启用NVIC程序HardFaults。

到目前为止我已尝试过:

  • 在函数

    中的其他位置移动NVIC_EnableIRQ行
    • 仍然遇到同样的问题
  • 在调用initTimer3函数之前添加延迟

    • 在initTimer3函数正确执行之前的所有内容,只要调用init函数,程序就会出现故障。
  • 使用不同的计时器

    • 我已经尝试过使用TIM7和TIM6

更新

设置STKALIGN位也不会改变任何内容。一旦中断被激活,HardFault就会发生。

2 个答案:

答案 0 :(得分:1)

另一个常见问题:

启动文件中的中断例程名称必须多于此。 例如,在Cube MX生成的代码中,向量表在startup_stm32f103xb.s文件中定义。 计时器中断例程是:

  .word TIM1_BRK_IRQHandler
  .word TIM1_UP_IRQHandler
  .word TIM1_TRG_COM_IRQHandler
  .word TIM1_CC_IRQHandler
  .word TIM2_IRQHandler
  .word TIM3_IRQHandler
  .word TIM4_IRQHandler

检入文件中向量表中使用的名称。

答案 1 :(得分:-1)

你有HF可能是因为调用中断例程时的堆栈没有对齐。 F1xx系列默认情况下关闭硬件堆栈,启动或用户应用程序必须启用它。或者,您可以使用适当的属性强制正确对齐。

enter image description here