[研电赛技术支持]

GD32F303 TIMER0 ETI外部脉冲计数怎么配置?

[复制链接]
1596|7
手机看帖
扫描二维码
随时随地手机跟帖
koukou147|  楼主 | 2022-6-26 22:38 | 显示全部楼层 |阅读模式
各位专家,以前用STM32的ETR很容易就实现了,想用GD32F303的TIMER0 ETI实现外部脉冲计数,怎么配置?好几天了,怎么配置都不行,谢谢大家!
--------------------------------------------------------------------
以前STM32是这样的:
static void tim1_counter_gpio_init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Connect PXx to ETR */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_2);
}

/* Public functions ----------------------------------------------------------*/
/***************************************************
Func: TIM1 for 外部计数器
***************************************************/
void TIM1_Counter_Init(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  
  tim1_counter_gpio_init();
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //使能TIM时钟
  
  TIM_DeInit(TIM1);
  TIM_TimeBaseInitStructure.TIM_Period = 0xFFFFFFFF;//计数到此值后, 再计1个才产生中断同时计数寄存器值清零
  TIM_TimeBaseInitStructure.TIM_Prescaler = 0; //定时器分频
  TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
  TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);//初始化TIM
  
  TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 0);//0次采样滤波  外部时钟模式2
  TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清除中断标志位,避免第一次自动进入中断一次
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

  TIM_SetCounter(TIM1, 0);//设置计数初值
  TIM_Cmd(TIM1, ENABLE); //使能定时器
}
--------------------------------------------------------------------
移植到GD32F303是这样的,但是不行
static void tim1_counter_gpio_init(void)
{
  rcu_periph_clock_enable(RCU_GPIOA);
  rcu_periph_clock_enable(RCU_AF);
  gpio_init(GPIOA,GPIO_MODE_AF_OD,GPIO_OSPEED_50MHZ,GPIO_PIN_12);
}

/* Public functions ----------------------------------------------------------*/
/***************************************************
Func: TIM1 for 外部计数器
***************************************************/
void TIM1_Counter_Init(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  
  tim1_counter_gpio_init();
  
  rcu_periph_clock_enable(RCU_TIMER0);
  
  timer_deinit(TIMER0);
  
  TIM_TimeBaseInitStructure.prescaler         = 0;
  TIM_TimeBaseInitStructure.alignedmode       = TIMER_COUNTER_EDGE;
  TIM_TimeBaseInitStructure.counterdirection  = TIMER_COUNTER_UP;
  TIM_TimeBaseInitStructure.period            = 3599;
  TIM_TimeBaseInitStructure.clockdivision     = TIMER_CKDIV_DIV1;
  TIM_TimeBaseInitStructure.repetitioncounter = 0; //计数到此值后, 再计1个才产生中断同时计数寄存器值清零
  timer_init(TIMER0,&TIM_TimeBaseInitStructure);
  
  timer_external_clock_mode1_config(TIMER0, TIMER_EXT_TRI_PSC_OFF, TIMER_ETP_RISING, 0);
  
  timer_counter_value_config(TIMER0, 0);
  
  timer_enable(TIMER0);
}

使用特权

评论回复
koukou147|  楼主 | 2022-6-27 11:53 | 显示全部楼层
这是从官网点进来的技术论坛,这里没有FAE吗?没人帮忙解答吗?

使用特权

评论回复
天天想你呦| | 2022-6-28 15:38 | 显示全部楼层
你可以看看官网资料GD32F20x_Firmware_Library_V2.3.1里timer有外部时钟的例程,f3系列应该也有

使用特权

评论回复
天天想你呦| | 2022-6-28 15:39 | 显示全部楼层
void timer_config(void)
{
    /* ----------------------------------------------------------------------------
     TIMER1 Configuration:
     TIMER1 count with external clock, the prescaler is 0, the period is 1000.
     ---------------------------------------------------------------------------- */
    timer_parameter_struct timer_initpara;
    timer_ic_parameter_struct timer_icinitpara;

    rcu_periph_clock_enable(RCU_TIMER1);

    timer_deinit(TIMER1);
    /* initialize TIMER init parameter struct */
    timer_struct_para_init(&timer_initpara);
    /* TIMER1 configuration */
    timer_initpara.prescaler         = 0;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 999;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_init(TIMER1, &timer_initpara);

    /* TIMER1 CH0 input capture configuration */
    timer_icinitpara.icpolarity  = TIMER_IC_POLARITY_RISING;
    timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
    timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
    timer_icinitpara.icfilter    = 0x01;
    timer_input_capture_config(TIMER1, TIMER_CH_0, &timer_icinitpara);

    /* slave mode selection : TIMER1 */
    /* TIMER1 input trigger : external trigger connected to CI0 */
    timer_input_trigger_source_select(TIMER1, TIMER_SMCFG_TRGSEL_CI0FE0);
    timer_slave_mode_select(TIMER1, TIMER_SLAVE_MODE_EXTERNAL0);

    /* enable the TIMER interrupt */
    timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
    timer_interrupt_enable(TIMER1, TIMER_INT_UP);

    timer_enable(TIMER1);
}


这是例程TIMER1_extclock_count的定时器代码

使用特权

评论回复
bufushaonian| | 2022-10-29 15:58 | 显示全部楼层
问一下楼主解决了,我最近也遇到,想请教一下

使用特权

评论回复
yangfrch| | 2022-12-20 19:41 | 显示全部楼层
楼主你好,可否分享下解决问题的方案,我也遇到类似问题,使用stm32的库可以跑起来,使用GD的库运行不起来

使用特权

评论回复
AnkerSong| | 2023-2-2 17:15 | 显示全部楼层
PA0进行脉冲计数,F303实测可用

void timer1_init(void)
{
    timer_parameter_struct timer_initpara = {0};
   
    /* RCU */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_TIMER1);
    rcu_periph_clock_enable(RCU_AF);
   
    /* GPIO-ETI */
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
   
    /* TIMER1 config */
    timer_deinit(TIMER1);
   
    timer_initpara.prescaler         = 0;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 0xFFFF;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER1,&timer_initpara);
   
    timer_input_trigger_source_select(TIMER1, TIMER_SMCFG_TRGSEL_ETIFP);
    timer_external_clock_mode1_config(TIMER1, TIMER_EXT_TRI_PSC_OFF, TIMER_ETP_FALLING, 15);
   
    timer_enable(TIMER1);
}

使用特权

评论回复
评论
AnkerSong 2023-2-2 17:18 回复TA
上面代码最浪费人时间的地方在于,gpio配置应为浮空输入,不能选AF。浪费一下午,就这!!! 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

10

帖子

1

粉丝