问答

汇集网友智慧,解决技术难题

21ic问答首页 - gd32f103高级定时器0无法进入中断服务函数

gd32f103高级定时器0无法进入中断服务函数

刘云海2022-03-05
按照例程所给的定时器中断(1ms)进行改写,定时器2是可以正常输出的但是把参数均换成定时器0以后无法输出,请大家帮忙看看是哪里的问题。


#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"

void delay(int time)
{
    while(time--);

    return;
}

void gpio_config(void)
{
    rcu_periph_clock_enable(RCU_GPIOB);
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);


}


void nvic_config(void)
{
        nvic_irq_enable(TIMER0_Channel_IRQn, 0);
  timer_interrupt_enable(TIMER0,  TIMER_INT_UP);
}
void timer_config(void)
{
    /* -----------------------------------------------------------------------
    TIMER1 configuration: generate 3 PWM signals with 3 different duty cycles:
    TIMER1CLK = SystemCoreClock / 72 = 1MHz
    TIMER1 channel 2 duty cycle =  50%
    ----------------------------------------------------------------------- */
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER0);

    timer_deinit(TIMER0);

    /* TIMER1 configuration */
    timer_initpara.prescaler         = 71;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 999;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER0,&timer_initpara);

       
    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER0);
    /* auto-reload preload enable */
    timer_enable(TIMER0);
}
int main(void)
{    rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1);
          systick_config();
    gpio_config();
          nvic_config();
    timer_config();
       
    while(1)
    {

    }

}
/*******************************************中断源文件如下***********************************/
uint32_t Timcounter;
uint8_t  LedFlag;
void TIMER0_Channel_IRQHandler(void)
{
        if(timer_flag_get(TIMER0,TIMER_FLAG_UP)!=RESET)
        {
  timer_flag_clear(TIMER0,TIMER_FLAG_UP);
        Timcounter++;
        if(Timcounter>=1)
         {
                Timcounter=0;
                LedFlag^=0x01;

         }
        if(LedFlag)
         {
                gpio_bit_set(GPIOB,GPIO_PIN_4);
         }else
         {
                gpio_bit_reset(GPIOB,GPIO_PIN_4);
        }
}
}


回答 +关注 20
1457人浏览 3人回答问题 分享 举报
3 个回答
  • 问题已经解决
    void timer2_config(unsigned int time,unsigned int period)
    {
    timer_parameter_struct timer_parameter;

        rcu_periph_clock_enable(RCU_TIMER2);

         timer_deinit(TIMER2);
       
        timer_parameter.prescaler = 83;
        timer_parameter.alignedmode = TIMER_COUNTER_EDGE;
        timer_parameter.counterdirection = TIMER_INT_UP;
        timer_parameter.period = 10000;
        timer_parameter.repetitioncounter = 0;
        timer_parameter.clockdivision = TIMER_CKDIV_DIV2;
       
        timer_init(TIMER2,&timer_parameter);

        timer_counter_value_config(TIMER2,0);

        timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);  

        timer_interrupt_enable(TIMER2,TIMER_INT_UP);

        nvic_irq_enable(TIMER2_IRQn,0,2);

        timer_enable(TIMER2);
                    timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);  

    }
    //void TIMER0_BRK_UP_TRG_COM_IRQHandler(void)

    void TIMER2_IRQHandler(void) {
            if(SET == timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP)){               
                    ix++;
                    if(ix<50)               
                    gpio_bit_reset(GPIOB, GPIO_PIN_1);
                    else
                    {gpio_bit_set(GPIOB, GPIO_PIN_1); if(ix>100) {ix=0;} }
                    timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);

            }
    }



    void timer0_config(unsigned int time,unsigned int period)
    {
    timer_parameter_struct timer_parameter;

        rcu_periph_clock_enable(RCU_TIMER0);

         timer_deinit(TIMER0);
       
        timer_parameter.prescaler = 83;
        timer_parameter.alignedmode = TIMER_COUNTER_EDGE;
        timer_parameter.counterdirection = TIMER_INT_UP;
        timer_parameter.period = 1000;
        timer_parameter.repetitioncounter = 0;
        timer_parameter.clockdivision = TIMER_CKDIV_DIV2;
       
        timer_init(TIMER0,&timer_parameter);

        timer_counter_value_config(TIMER0,0);

        timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);  

        timer_interrupt_enable(TIMER0,TIMER_INT_UP);

        nvic_irq_enable(TIMER0_BRK_UP_TRG_COM_IRQn,0,2);

        timer_enable(TIMER0);
                    timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);  

    }
    //void TIMER0_BRK_UP_TRG_COM_IRQHandler(void)

    //void TIMER0_IRQHandler(void)
    void         TIMER0_BRK_UP_TRG_COM_IRQHandler(void)

    {
            if(SET == timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_UP)){               
                    ix++;
                    if(ix<50)               
                    gpio_bit_reset(GPIOB, GPIO_PIN_1);
                    else
                    {gpio_bit_set(GPIOB, GPIO_PIN_1); if(ix>100) {ix=0;} }
                    timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);

            }
    }
  • 我也遇到同样问题,你找到解决方案了吗? 可以分享一下
  • 中断方式用的不对吧,你的要求不应该是使用更新中断吗,你选的是通道捕获比较中断,试试用这个:TIMER0_BRK_UP_TRG_COM_IRQn搜索
    复制


您需要登录后才可以回复 登录 | 注册