打印

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

[复制链接]
875|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刘云海|  楼主 | 2022-3-5 19:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按照例程所给的定时器中断(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);
        }
}
}


使用特权

评论回复
沙发
呐咯密密| | 2022-3-7 10:52 | 只看该作者

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

中断方式用的不对吧,你的要求不应该是使用更新中断吗,你选的是通道捕获比较中断,试试用这个:TIMER0_BRK_UP_TRG_COM_IRQn搜索
复制

使用特权

评论回复
板凳
yuyechenai| | 2022-3-22 20:21 | 只看该作者
我也遇到同样问题,你找到解决方案了吗? 可以分享一下

使用特权

评论回复
地板
yuyechenai| | 2022-3-22 21:59 | 只看该作者
问题已经解决
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);

        }
}

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝