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
版權聲明:本文原創發表於 博客園,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。