了解Timer以及TIM_RepetitionCounter参数的作用——TimerTimer
当 TIM_RepetitionCounter 参数设置为0 时,时间周期不翻倍。
当 TIM_RepetitionCounter 参数设置为1 时,时间周期翻1倍。
当 TIM_RepetitionCounter 参数设置为2 时,时间周期翻2倍。
1
如下,定时了0.001s,然后在中断中计数1000次,点亮熄灭LED,正常情况来说,led会亮1s,然后灭1s,,,不断重复。
当 TIM_RepetitionCounter 参数设置为0 时,确实是1s。
当 TIM_RepetitionCounter 参数设置为1 时,明显感觉到亮灭的时间被延长了一倍。
所以 TIM_RepetitionCounter 应该是在本次定时结束后,再重装载定时 1次,进入中断,所以
当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输出信号的占空比。
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、实验结果
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”可对输出信号的占空比进行相应的调整,测试如下: