STM8 TIM1(或TIM2)-外部中断事件后的5s滴答

时间:2019-03-17 13:50:13

标签: sdcc stm8

我正在尝试在STM8S103F3中实现此逻辑: 1)初始化后,控制器等待GPIOC上的外部中断(默认为高)。 2.1)触发外部中断:如果GPIOC的PIN5为低电平,则打开测试灯,并启动定时器5秒钟。 2.2)触发外部中断:如果GPIOC的PIN5为高电平,则关闭测试引线并停止定时器。 3)触发计时器中断:关闭测试指示灯。

我的代码:

#include "stm8s.h"
#include "stm8s_gpio.h"
#include "stm8s_exti.h"
#include "stm8s_tim1.h"

void tim1_update_handler() __interrupt(11)
{
    GPIO_WriteHigh(GPIOB, GPIO_PIN_5);
    TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}

void portc_ext_int_handler() __interrupt(5)
{
    uint8_t state = GPIO_ReadInputData(GPIOC);
    if (state & GPIO_PIN_5) // PORTC pin 5 high, default state, button not pressed.
    {
        TIM1_SetCounter(0);
        TIM1_Cmd(ENABLE);
    }
    else // Button pressed.
    {
        GPIO_WriteLow(GPIOB, GPIO_PIN_5);
        TIM1_Cmd(DISABLE);
    }
}

int main(void)
{
    disableInterrupts();

    GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);
    GPIO_Init(GPIOC, GPIO_PIN_ALL, GPIO_MODE_IN_PU_IT);

    EXTI_DeInit();
    EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_RISE_FALL);

    TIM1_TimeBaseInit(2000, TIM1_COUNTERMODE_UP, 5000, 0);
    TIM1_SelectOnePulseMode(TIM1_OPMODE_SINGLE);
    TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);

    enableInterrupts();

    while (1)
    {
        wfi();
    }
}

可以很好地触发外部中断,但是不会触发计时器中断。

我在使用计时器时出了什么问题,我该怎么解决呢?

1 个答案:

答案 0 :(得分:0)

此位稍晚,但可能是由于中断优先级所致,默认情况下将其设置为不中断已在进行中的ISR。更改ITC_xxx寄存器允许设置这些优先级,以便一个IRQ可以中断另一个IRQ,这是定时器所需要的。