TIM2是STM8的通用定時器,除了具有TIM4基本定時器具有的定時功能外,還具有PWM輸出和捕獲功能.

從上圖可以看到,當TIM2作為捕獲或這PWM輸出時,共有兩個通道,CH1和CH2.
本例程使用TIM2的捕獲功能,來測量CCO的輸出頻率,根據程序測量到的頻率和實際頻率對比,來學習TIM2的捕獲功能.
程序的編寫,主要參考STM8S的中文參考手冊.STM8L的這一部分和STM8S相同,所以參考了下這個中文手冊,畢竟英文的不是太容易看懂.

測量PWM信號時,實際上只用到了一個引腳,本例程的捕獲輸入引腳為PB0.但用到了兩個測量通道,本例程中通道1檢測到PB0為高電平時,將此時計數器的數據寫入TIM2_CCR1寄存器.通道2檢測到PB0為低電平時,將此時的計數器的數據寫入TIM2_CCR2寄存器.
由于捕獲模式為復位觸發模式,即檢測到高電平(本例程設置是高電平)時,數據寫入寄存器后,計數器復位,重新從0開始計數,所以通道2檢測到低電平時,存入到TIM2_CCR2寄存器中的數據為高電平脈沖時間.

PB0為輸入捕獲引腳,PC4為CCO輸出引腳,所以需要用杜邦線,將PC4連到PB0.同時用邏輯分析儀測量PC4輸出的波形,和程序計算值進行對比,從下圖可以看到IAR中tmp的值為3.38983039E+1,即程序測量到的頻率為3.38983KHz,與邏輯分析測量到的32.7869KHz相似,但誤差還是很大,主要原因為是HSI不精確,如果使用HSE,會精確一些,同時提供給定時器的頻率不高,增大定時器的頻率,結果會接近邏輯分析儀測量值.

- /*硬件連接*/
- // PB0<----PC4
- /****************************************************************************************
- *開發環境:IAR for stm8 v6.5.3
- *硬件平臺:STM8L-DISCOVERY
- *功能說明:本例程,通過CC0輸出32.768KHz的方波,提供給TIM2的捕獲輸入引腳PB0測量
- *作 者:茗風
- ****************************************************************************************/
- #include"iostm8l152c6.h"
- #include"stdint.h"
- uint16_t tim2_ccr1=0,tim2_ccr2=0;
- uint8_t f_finish=0;
- /******************************************************************************************************
- * 名 稱:void CLOCK_Init(void)
- * 功 能:通過PC4輸出選擇的時鐘
- * 入口參數:無
- * 出口參數:無
- * 說 明:PC4輸出32.768KHz的方波,提供給TIM2的捕獲引腳PB0測量
- * 范 例:無
- ******************************************************************************************************/
- void CLOCK_Init(void)
- {
- PC_CR1_C14 =1;//推挽輸出
- PC_CR2_C24 =1;//高速輸出
- PC_DDR_DDR4 =1;//PC4輸出
-
- CLK_CCOR_CCODIV=0x00;//選擇分頻值
-
- /*
- *0x00 CCO divided by 1
- *0x01 CCO divided by 2
- *0x02 CCO divided by 4
- *0x03 CCO divided by 8
- *0x04 CCO divided by 16
- *0x05 CCO divided by 32
- *0x06 CCO divided by 64
- *0x07 CCO divided by 64
- */
- CLK_CCOR_CCOSEL =0x08;//選擇輸出時鐘,這里選擇外部32.768KHz的時鐘做測試
- /*
- *0x01 HSI clock output clock source
- *0x02 LSI clock output clock source
- *0x04 HSE clock output clock source
- *0x08 LSE clock output clock source
- */
- }
- /******************************************************************************************************
- * 名 稱:void TIMER2_Init(void)
- * 功 能:STM8定時器2捕獲功能初始化
- * 入口參數:無
- * 出口參數:無
- * 說 明:PB0為捕獲輸入引腳,使用通道0
- * 范 例:無
- ******************************************************************************************************/
- void TIMER2_Init(void)
- {
- PB_DDR_DDR0 =0;//輸入
- PB_CR1_C10 =0;//浮空輸入
- // PB_CR1_C10 =1;//上拉輸入
- PB_CR2_C20 =0;//禁止外部中斷功能
-
- CLK_PCKENR1_PCKEN10=1;//打開定時器2時鐘
-
- //------設置TIM2時鐘分頻值------
- TIM2_PSCR_PSC=0;//分頻值 2M/2^0=2M/1=2000000Hz
-
- //-重裝值,TIM2從0計數到此值,發生溢出-
- // TIM2_ARRH=0;
- // TIM2_ARRL=100;
-
- //----AUTO_RELOAD 預裝載使能----
- TIM2_CR1_ARPE =0;//不通過預裝載寄存器
-
- TIM2_CR1_URS=1;//僅當計數器溢出時才發生中斷請求
-
- TIM2_CR1_UDIS=1;//禁止更新事件//計數器溢出屬于更新事件
-
- TIM2_CR1_DIR=0;//向上計數
-
- // TIM2_CCER1_CC1E=0;//清零使能位,為了配置寄存器
- // TIM2_CCER1_CC2E=0;//清零使能位,為了配置寄存器
-
- TIM2_CCMR1=0;
- // TIM2_CCMR1=0x00; //IC1F=0000 輸入信號不分頻
- TIM2_CCMR1 |=0x01;//CC1S=01 IC1 is mapped on TI1FP1
- /*00: CC1 channel is configured as output
- 01: CC1 channel is configured as input, IC1 is mapped on TI1FP1
- 10: CC1 channel is configured as input, IC1 is mapped on TI2FP1
- 11: Reserved */
-
- TIM2_CCMR2=0;
- // TIM2_CCMR2=0x00;//IC1PSC=0 輸入信號不分頻
- TIM2_CCMR2 |=0x02;// TIM2_CCMR2_CC2S=0x2
- /* 00: CC2 channel is configured as output
- 01: CC2 channel is configured as input, IC2 is mapped on TI2FP2
- 10: CC2 channel is configured as input, IC2 is mapped on TI1FP2
- 11:CC2 channel is configured as input, IC2 is mapped on TRC */
-
- TIM2_CCER1_CC1P=0;//上升沿時發生捕獲
- TIM2_CCER1_CC2P=1;//下降沿時發生捕獲
-
- TIM2_SMCR=0x54;//
- // TIM2_SMCR_TS=0x05;//101 iput 1(TI1FP1) 頭文件有錯誤
- // TIM2_SMCR_SMS=0x04;//復位觸發模式
-
- TIM2_CCER1_CC1E=1;//使能捕獲功能
- TIM2_CCER1_CC2E=1;//使能捕獲功能
-
- TIM2_IER_CC1IE=1;//開啟捕獲中斷
- TIM2_IER_CC2IE=1;//開啟捕獲中斷
- TIM2_CR1_CEN=1;//開啟計數
- }
- void main(void)
- {
- static float tmp=0;
- CLOCK_Init();
- TIMER2_Init();
- asm("rim"); //enable interrupts
- while(1)
- {
- if(f_finish==0x01)
- {
- //1000000us/2000000=0.5us
- //測量到的周期為 0.5us*59=29.5us
- //測量到的周期為 1000000us/29.5us=33.898KHz
- //實際CCO輸出的頻率為32.768KHz
- tmp=1000/((float)tim2_ccr1*0.5);//tmp的值為測量到的頻率
- f_finish=0;
- asm("nop");
- }
- // asm("wfi");
- }
- }
- #pragma vector=TIM2_CAPCOM_CC1IF_vector
- __interrupt void TIM2_CAPCOM_CC1IF_ISR (void)
- {
- if(TIM2_SR1_CC1IF)
- {
- tim2_ccr1=TIM2_CCR1H;
- tim2_ccr1<<=8;
- tim2_ccr1+=TIM2_CCR1L;
- TIM2_SR1_CC1IF=0;//清除中斷標志位
- f_finish=1;
- //tim2_ccr1得到的時間為整個周期的時間
- }
- else if(TIM2_SR1_CC2IF)
- {
- tim2_ccr2=TIM2_CCR2H;
- tim2_ccr2<<=8;
- tim2_ccr2+=TIM2_CCR2L;
- TIM2_SR1_CC2IF=0;//清除中斷標志位
- //tim2_ccr2得到的時間為高電平持續時間
- }
- }
復制代碼
|