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

1. 綜述html

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

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

 

2. 關於STM8S103手冊的TIM簡介ui

  每一個定時器的功能都有詳細介紹,你們能夠認真看下。spa

 

3. TIMx詳細講解設計

3.1 TIM1解析code

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

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

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

  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的00三、00五、和10三、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
版權聲明:本文原創發表於 博客園,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然視爲侵權。

 

原文出處:https://www.cnblogs.com/zhenghaoyu/p/10704702.html

相關文章
相關標籤/搜索