當 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 ,計時1S滿3次之后進入中斷,那么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”可對輸出信號的占空比進行相應的調整,測試如下: