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