自学内容网 自学内容网

【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模式

具体的:

//输入频率引脚配置,选择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);

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


原文地址:https://blog.csdn.net/baowxz/article/details/143875060

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!