【MCU】GD32H7定时器使用外部时钟源

1、定时器可以使用系统内部的mcuclk,也可以通过管脚使用外部输入的时钟源
2、GD32H7怎么使用外部的源来驱动定时器呢
3、GD32H7通用定时器的框图如下:

这是官方手册上的图,不得不说,画的不够详细,只是一个大概的框图,内部细节完全不知。具体的通路如下:

4、选择与配置:

我们选择这个模式

看寄存器TSCFG6[4:0],,说明如下:

滤波后的通道只有0,1啊,没有2,3通道。

所以CH2,CH3通道没法选择,实测也是这样,选择2通道时,定时器无法正常工作,在这里调试浪费了很多时间,大坑啊

5、代码

1》配置外部管脚属性:Timer3的CH1通道,映射到PD13上

2》配置定时器,通用的

3》配置通道采样属性

4》选择通道和模式:这里选择CI1通道,外部事件0模式

具体的:

cpp 复制代码
	//输入频率引脚配置,选择PD13-af2,作为定时器3的ch1通道为时钟输入源
	rcu_periph_clock_enable(RCU_GPIOD);
	gpio_mode_set(IO_MCUTM3_ExTCLK_Port, GPIO_MODE_AF, GPIO_PUPD_NONE, IO_MCUTM3_ExTCLK_Num);
	gpio_output_options_set(IO_MCUTM3_ExTCLK_Port, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, IO_MCUTM3_ExTCLK_Num);
	gpio_af_set(IO_MCUTM3_ExTCLK_Port, GPIO_AF_2, IO_MCUTM3_ExTCLK_Num);		//TIMER3_CH1

	//timer2
	timer_parameter_struct timer_initpara;
	rcu_periph_clock_enable(RCU_TIMER3);	//开时钟,(TM1是CK_APB1;TM0是CK_APB2)*1/2/4,最大是300M
	rcu_periph_clock_enable(RCU_SYSCFG);
	//	nvic_irq_enable(TIMER1_IRQn, 2, 0);		//设置中断优先级
	timer_deinit(STP_Timer);
	/* TIMER configuration */
	timer_struct_para_init(&timer_initpara);
	//timer_initpara.prescaler = 19999;						//预分频值,300M/20k = 300 000 000 /20 000 = 300 000/20 = 15 000HZ=15khz
	timer_initpara.prescaler = 999;//29999;						//10k,1个clk周期100us
	timer_initpara.alignedmode = TIMER_COUNTER_EDGE;		//边沿对齐
	timer_initpara.counterdirection = TIMER_COUNTER_UP;		//往上++计数,从0+到19999共 20000个周期
	//timer_initpara.period = 14999;							//周期?:10000/15k=666.6667ms
	timer_initpara.period = (15000 - 1);						//中断1s钟,1.5s试试:配置的是自动重装寄存器CAR
	timer_initpara.clockdivision = TIMER_CKDIV_DIV1;		//clk分频系数,1分频
	timer_initpara.repetitioncounter = 200;					//更新事件的产生速率,重复计数器计数值减为 0 时产生更新事件,TM1好像没有,这里无需配置
	timer_init(STP_Timer, &timer_initpara);	//600多ms的中断



	/* TIMER3 CH1 input capture configuration */
	timer_ic_parameter_struct timer_icinitpara;
	//timer_channel_input_struct_para_init(&timer_icinitpara);
	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(STP_Timer, TIMER_CH_0, &timer_icinitpara);

	/* slave mode selection : TIMER3 */
	/* TIMER3 input trigger : external trigger connected to CI1*/
	timer_input_trigger_source_select(STP_Timer, /*TIMER_SMCFG_TRGSEL_CI0FE0*/TIMER_SMCFG_TRGSEL_CI1FE1);
	timer_slave_mode_select(STP_Timer, TIMER_SLAVE_MODE_EXTERNAL0);
	
	/* auto-reload preload enable */
	timer_auto_reload_shadow_enable(STP_Timer);

	/* auto-reload preload enable */
	timer_enable(STP_Timer);

这里没有配置中断,可以自己添加中断使能

相关推荐
JWASX1 个月前
定时/延时任务-Timer用法
java·定时器·timer
草上爬2 个月前
C++笔试题之实现一个定时器
c++·c++11·定时器·timer
阑梦清川2 个月前
JavaEE初阶---多线程(五)---定时器/线程池介绍
java·java-ee·线程池·定时器
景天科技苑2 个月前
【Golang】关于Go语言中的定时器原理与实战应用
后端·golang·定时器·timer·go定时器·go定时任务·ticker
GGBondlctrl2 个月前
【JavaEE初阶】多线程案列之定时器的使用和内部原码模拟
java·开发语言·定时器·timer的使用·定时器代码模拟
三玖诶3 个月前
Qt 中 `QTimer`定时器的使用方法详解
开发语言·qt·定时器·qtimer
林多3 个月前
【Qnx】使用ClockCycles完成计时功能
超时·定时器·时钟周期·qnx·clockcycles
中草药z4 个月前
【JavaEE】线程池和定时器
java·开发语言·java-ee·线程池·多线程·定时器
栗克5 个月前
C# 6.定时器 timer
c#·倒计时·定时器·winform·timer