当 TIM_RepetitionCounter 参数设置为0 时,时间周期不翻倍。

当 TIM_RepetitionCounter 参数设置为1 时,时间周期翻1倍。
当 TIM_RepetitionCounter 参数设置为2 时,时间周期翻2倍。

1

如下,定时了0.001s,然后在中断中计数1000次,点亮熄灭LED,正常情况来说,led会亮1s,然后灭1s,,,不断重复。

当 TIM_RepetitionCounter 参数设置为0 时,确实是1s。

repositories 作用 repetition的作用_#define


repositories 作用 repetition的作用_repositories 作用_02


当 TIM_RepetitionCounter 参数设置为1 时,明显感觉到亮灭的时间被延长了一倍。

所以 TIM_RepetitionCounter 应该是在本次定时结束后,再重装载定时 1次,进入中断,所以

当TIM_RepetitionCounter =1时,原本的定时0.001s ,会变成定时0.002s。也就是周期为0.002s,满0.002s进入一次中断,1000次中断计数即为2s。计时2s之后进入中断,那么led的亮灭时间就变成了2s。

当TIM_RepetitionCounter =2时,原本的定时0.001s ,会变成定时0.003s。也就是周期为0.003s,满0.003s进入一次中断,1000次中断计数即为3s。计时3s之后进入中断,那么led的亮灭时间就变成了3s。

2

这次看懂一个 定时器的通道输出PWM 用于控制 一盏小灯的亮灭。
以下是全部内容,主要是害怕作者把东西给删除了,或者说放在那里我就不会去看了,写在自己家比较安心,所以必须狠狠记下。
原文链接:http://bbs.eeworld.com.cn/thread-1076944-1-1.html

本次实验的主要目的是为后期的实战做前期准备,利用GD32E231C_START评估板上的用户按键“KEY”控制定时器"TIMER2_CH1"的PWM输出,用以改变LED1的亮度。

一、实验资源

1、GD32E231C_START评估板;
2、Keil v5.27.1.0;
3、GigaDevice.GD32E23x_DFP.1.0.0.pack;
4、GD32E23x_Demo_Suites_V1.0.1;
5、GD32E231C_START开发板相关文档;
6、逻辑分析仪。

二、实验过程

1、资源配置。

GD32E231C8T6具有非常丰富的定时器资源,这其中包括1个高级定时器TIMER0;5个通用定时器TIMER(2,13~16);1个基本定时器TIMER5,当然还包括RTC等等。

结合数据手册及评估板原理图可以看到四个LED分别受控于PA7、PA8、PA11、PA12引脚,其中的PA7引脚的复用功能包含了通用定时器TIMER2的“TIMER2_CH1”,同时PB5引脚同样也可复用为“TIMER2_CH1”,正好PB5已被“JP9”引出方便外部测试,于是本次实验的定时器资源使用了通用定时器TIMER2。

还有就是利用了接在PA0上按键“KEY”,高电平有效,用以调整PWM输出信号的占空比。

repositories 作用 repetition的作用_引脚_03

repositories 作用 repetition的作用_引脚_04

repositories 作用 repetition的作用_引脚_05

repositories 作用 repetition的作用_ci_06

2、程序实现。

参考了官方提供的例程,首先PA7引脚进行相应配置,要注意的是打开PA7引脚“TIMER2_CH1”的复用功能“AF1”;然后对TIMER2_CH1通道PWM输出进行相应配置并使能PWM输出。

下面是主函数:

int main(void)
{
	systick_config();

	KEY_PORT_Init();
	PWM_Config();
	while(1)
	{
		KEY_Scan();//用于调整PWM输出占空比
	}
}


#define PWM_OUT_PORT            GPIOA
#define PWM_OUT_PIN             GPIO_PIN_7
#define PWM_OUT_PORT_CLK        RCU_GPIOA

“TIMER2_CH1”通道PWM输出配置函数:

void PWM_Config(void)
{
		timer_oc_parameter_struct 			timer_ocintpara;
		timer_parameter_struct 				timer_initpara;
		rcu_periph_clock_enable(PWM_OUT_PORT_CLK);
		rcu_periph_clock_enable(RCU_TIMER2);

		gpio_mode_set(PWM_OUT_PORT,GPIO_MODE_AF,GPIO_PUPD_NONE ,PWM_OUT_PIN);
		gpio_output_options_set(PWM_OUT_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,PWM_OUT_PIN);//PA7(TIMER2_CH1)
		gpio_af_set(PWM_OUT_PORT,GPIO_AF_1,PWM_OUT_PIN);//配置PA7引脚复用功能为TIEMR2_CH1

		timer_deinit(TIMER2);

		/* TIMER2 configuration */
		timer_initpara.prescaler         = 719;//预分频器值72M/(719+1)=100KHz
		timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;//对齐模式
		timer_initpara.counterdirection  = TIMER_COUNTER_UP;
		timer_initpara.period            = 999;//周期值,此值确定了PWM输出的周期
		timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;//时钟分频值
		timer_initpara.repetitioncounter = 0;//计数器重复值
		timer_init(TIMER2,&timer_initpara);

		 /* CH0 configuration in PWM mode */
		timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
		timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
		timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
		timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
		timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
		timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
		timer_channel_output_config(TIMER2,TIMER_CH_1,&timer_ocintpara);

		timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,0);
		timer_channel_output_mode_config(TIMER2,TIMER_CH_1,TIMER_OC_MODE_PWM0);
		timer_channel_output_shadow_config(TIMER2,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);

		timer_primary_output_config(TIMER2,ENABLE);
		timer_auto_reload_shadow_enable(TIMER2);
		timer_enable(TIMER2);
}

按键函数:

void KEY_Scan(void)
{
	static uint8_t num=0;

	if(KEY==1)
	{
		delay_1ms(20);
		if(KEY==1)
		{
			num++;
			if(num==5)
			num=1;
		}

		switch (num)
		{
				case 1:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,900);break;        //占空比90%
				case 2:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,650);break;        //占空比65%
				case 3:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,300);break;        //占空比30%
				case 4:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,0);break;                //占空比0
				default:break;
		}
		while(KEY==1);
	}
}

3、实验结果

repositories 作用 repetition的作用_引脚_07

4、测试占空比

为方便测试,将“TIMER2_CH1”通道PWM输出功能转移至PB5引脚,直接在预定义中修改:

#define PWM_OUT_PORT                        GPIOB
#define PWM_OUT_PIN                         GPIO_PIN_5
#define PWM_OUT_PORT_CLK         			RCU_GPIOB

然后接上逻辑分析仪进行测试,通过按键“KEY”可对输出信号的占空比进行相应的调整,测试如下: