基於STM8的TIM定時器操作---STM8-第三章


1. 綜述

  STM8S提供三種類型的 TIM 定時器:高級控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定時器(TIM4/TIM6)。它們雖有不同功能但都基於共同的架構。此共同的架構使得采用各個定時器設計應用變得非常容易與方便(相同的寄存器映射,相同的基本功能)。

  本文只針對STM8S103該芯片進行介紹,該芯片的定時器個數為3個,每個類型的定時器都一個,分別為高級控制型(TIM1)、通用型(TIM2)、基本型定時器(TIM4)。

 

2. 關於STM8S103手冊的TIM簡介

  每個定時器的功能都有詳細介紹,大家可以認真看下。

 

3. TIMx詳細講解

3.1 TIM1解析

  TIM1_Prescaler          :即預分頻系數,帶有16位預分頻的16位遞增、遞減和雙向(遞增/遞減)自動重載計數器。

  TIM1_CounterMode      :即計數模式,共有3種計數模式,分別為是向上計數模式、向下計數模式、中央對齊模式(該模式又含有3種對齊模式)。

  TIM1_Period                 :自動重載值,此項可取1-65535任意數值。

  TIM1_RepetitionCounter :重復計數器值。

 

  假設我們的系統時鍾是16Mhz,我們定時1秒鍾,那我們初始化設置應該為:  

  TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1000,100);  

計算方法:定時器的頻率fcnk = 16Mhz/(15+1) = 1Mhz,說明一次計數為1us,1000次計數為1ms,而重復計數100次,則一次中斷計時時間為100ms,為了到達1s的效果,我們還需要在中斷函數里面,進行一個10次的判斷。(1MHZ = 1000KHZ = 1000000HZ, 相當於 1/1000000 = 1us)

3.2 TIM2解析

  TIM2_Prescaler :15位的預分頻系數,分頻系數可調整為1~32768之間的2次冪數值。

  TIM2_Period      :自動重載值,此項可取1-65535任意數值。

 

假設我們的系統時鍾是16Mhz,我們定時1秒鍾,那我們初始化設置應該為: 

TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000)

計算方法:定時器的頻率fcnk = 16Mhz/(16) = 1Mhz,說明一次計數為1us,1000次計數為1ms,重復計數默認1次,則中斷一次時時間為1ms,為了到達1s的效果,我們還需要載中斷函數里面,進行一個1000次的判斷。

3.3 TIM4解析

  TIM4_Prescaler :8位自動裝載可調整的預分頻系數,分頻系數可調整為1~128之間2次冪數值。

  TIM4_Period      :自動重載值,此項可取1-255任意數值。 

 

假設我們的系統時鍾是16Mhz,我們定時1秒鍾,那我們初始化設置應該為:

TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250);

計算方法:定時器的頻率fcnk = 16Mhz/(128) = 0.125Mhz,說明一次計數為8us,250次計數為2ms,重復計數默認1次,則中斷一次時時間為2ms,為了到達1s的效果,我們還需要載中斷函數里面,進行一個500次的判斷。

 

4. 例程

4.1 編譯環境

  我的編譯環境是IAR,這款軟件是現在STM8的主流平台,比較推薦。不過我打算等到STCubeMX更新出比較方便的版本后再去使用Keil5,因為在用STM32的時候就是利用Keil5編譯代碼,的確很方便。

 

4.2 主芯片

  我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一樣(外設和CPU頻率,FLASH),在代碼相同的情況下均可進行燒寫。

 

4.3 庫文件的添加

  我們的工程可以在IAR中的官方例程中復制,操作過程:打開STM8S_StdPeriph_Lib(這是一個官方的庫文件,下載IAR STM8包的時候就攜帶,里面有庫文件和相對應的例程),將Libraries文件復制到你工程所在的文件下,並將有關於ADC的庫文件添加到你的工程列表當中。添加完成后,就可以開始編寫代碼了(如果你將全部的庫文件都添加進來的話,編譯程序后庫文件還有紅點報錯的話,這是因為你選的芯片上沒有該功能,你需要將其刪掉才能不報錯。)如圖。

                   

 

4.4 代碼

 

4.4.1 TIM1

初始化:

 1 /*******************************************************************************
 2 * Function Name  : MX_TIM1_Init
 3 * Description    : TIM1 Init
 4 * Input          : None
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 void MX_TIM1_Init(void)
 9 {
10   //定時器1參數初始化 (15分頻,向上計數,計數次數,重復次數)
11 TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 1000, 100); 12 13 //Clear TIM1 update flag 14 TIM1_ClearFlag(TIM1_FLAG_UPDATE); 15 16 //Enable update interrupt 17 TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE); 18 TIM1_Cmd(ENABLE); 19 20 //使能中斷 21 enableInterrupts(); 22 }

中斷服務函數:

由於IAR中庫函數工程模板的中斷都寫在 stm8s_it.c 庫文件中,所以此段代碼需要寫在stm8s_it.c庫文件相對應的芯片中才能進行中斷處理。

通過初始化所配置的參數,加上count 10次的累加,達到1S翻轉一次LED的效果,每一次進行中斷后都需要對定時器的標志位進行清零處理。

 1 INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
 2 {
 3   /* In order to detect unexpected events during development,
 4      it is recommended to set a breakpoint on the following instruction.
 5   */
 6   static uint8_t count = 0;
 7   
 8   if(count++ == 10)
 9   {
10     //翻轉LED
11     GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);
12     
13     count = 0;
14   }
15   //定時器1的標志位清零
16   TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
17 }

 

4.4.2 TIM2

初始化:

 1 /*******************************************************************************
 2 * Function Name  : MX_TIM2_Init
 3 * Description    : TIM1 Init
 4 * Input          : None
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 void MX_TIM2_Init(void)
 9 {
10   //定時器2參數初始化 (16分頻,計數次數)
11   TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000);
12 
13   //Clear TIM2 update flag
14   TIM2_ClearFlag(TIM2_FLAG_UPDATE);
15 
16   //Enable update interrupt
17   TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
18   TIM2_Cmd(ENABLE);
19   
20   //使能中斷
21   enableInterrupts();
22 }

中斷服務函數:

由於IAR中庫函數工程模板的中斷都寫在 stm8s_it.c 庫文件中,所以此段代碼需要寫在stm8s_it.c庫文件相對應的芯片中才能進行中斷處理。

通過初始化所配置的參數,加上count 1000次的累加,達到1S翻轉一次LED的效果,每一次進行中斷后都需要對定時器的標志位進行清零處理。

 1  INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
 2  {
 3   /* In order to detect unexpected events during development,
 4      it is recommended to set a breakpoint on the following instruction.
 5   */
 6   static uint16_t count = 0;
 7   
 8   if(count++ == 1000)
 9   {
10     //翻轉LED
11     GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);
12     
13     count = 0;
14   }
15   //定時器2的標志位清零
16   TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
17  }

 

4.4.3 TIM4

初始化:

 1 /*******************************************************************************
 2 * Function Name  : MX_TIM4_Init
 3 * Description    : TIM1 Init
 4 * Input          : None
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 void MX_TIM4_Init(void)
 9 {
10 
11   //定數4初始化    (128分頻,計數次數)
12   TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250);
13 
14   //Clear TIM4 update flag
15   TIM4_ClearFlag(TIM4_FLAG_UPDATE);
16 
17   //Enable update interrupt
18   TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
19   TIM4_Cmd(ENABLE);
20   
21   //使能中斷
22   enableInterrupts();
23 }

中斷服務函數:

由於IAR中庫函數工程模板的中斷都寫在 stm8s_it.c 庫文件中,所以此段代碼需要寫在stm8s_it.c庫文件相對應的芯片中才能進行中斷處理。

通過初始化所配置的參數,加上count 500次的累加,達到1S翻轉一次LED的效果,每一次進行中斷后都需要對定時器的標志位進行清零處理。

 1  INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
 2  {
 3   /* In order to detect unexpected events during development,
 4      it is recommended to set a breakpoint on the following instruction.
 5   */
 6    
 7   static uint16_t count = 0;
 8   
 9   if(count++ == 500)
10   {
11     //翻轉LED
12     GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);
13     
14     count = 0;
15   }
16   //定時器4的標志位清零
17   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
18   
19  }

 

5. 結尾 

  本博客只介紹了如何控制LED翻轉,但定時器的功能遠不止於此,詳情請大家自行去了解。

  相對來說,STM8的定時器功能還是比較有用的,希望該博客能夠幫助到大家實現TIM功能。

 

  對STM8的定時器的說明和引用到這里結束,感謝各位看官的點擊。

  如果覺得有所收獲請點下推薦,若認為該博客中存在錯誤的說明或者對博客中某方面有疑問請留言。

 

 

作 者:浩宇99✌
出 處:https://www.cnblogs.com/zhenghaoyu/p/10704702.html
版權聲明:本文原創發表於 博客園,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM