[研电赛技术支持] GD32F303 TIMER0 ETI外部脉冲计数怎么配置?

[复制链接]
3315|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 | 显示全部楼层
  1. void timer_config(void)
  2. {
  3.     /* ----------------------------------------------------------------------------
  4.      TIMER1 Configuration:
  5.      TIMER1 count with external clock, the prescaler is 0, the period is 1000.
  6.      ---------------------------------------------------------------------------- */
  7.     timer_parameter_struct timer_initpara;
  8.     timer_ic_parameter_struct timer_icinitpara;

  9.     rcu_periph_clock_enable(RCU_TIMER1);

  10.     timer_deinit(TIMER1);
  11.     /* initialize TIMER init parameter struct */
  12.     timer_struct_para_init(&timer_initpara);
  13.     /* TIMER1 configuration */
  14.     timer_initpara.prescaler         = 0;
  15.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  16.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  17.     timer_initpara.period            = 999;
  18.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  19.     timer_init(TIMER1, &timer_initpara);

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

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

  30.     /* enable the TIMER interrupt */
  31.     timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
  32.     timer_interrupt_enable(TIMER1, TIMER_INT_UP);

  33.     timer_enable(TIMER1);
  34. }


这是例程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实测可用

  1. void timer1_init(void)
  2. {
  3.     timer_parameter_struct timer_initpara = {0};
  4.    
  5.     /* RCU */
  6.     rcu_periph_clock_enable(RCU_GPIOA);
  7.     rcu_periph_clock_enable(RCU_TIMER1);
  8.     rcu_periph_clock_enable(RCU_AF);
  9.    
  10.     /* GPIO-ETI */
  11.     gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
  12.    
  13.     /* TIMER1 config */
  14.     timer_deinit(TIMER1);
  15.    
  16.     timer_initpara.prescaler         = 0;
  17.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  18.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  19.     timer_initpara.period            = 0xFFFF;
  20.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  21.     timer_initpara.repetitioncounter = 0;
  22.     timer_init(TIMER1,&timer_initpara);
  23.    
  24.     timer_input_trigger_source_select(TIMER1, TIMER_SMCFG_TRGSEL_ETIFP);
  25.     timer_external_clock_mode1_config(TIMER1, TIMER_EXT_TRI_PSC_OFF, TIMER_ETP_FALLING, 15);
  26.    
  27.     timer_enable(TIMER1);
  28. }

评论

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

本版积分规则

6

主题

10

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部