靈動微電子ARM Cortex M0 MM32F0010 Timer定時器中斷定時功能的配置
目錄:
1、Timer1高級定時器Timer3通用定時器Timer14基本定時器簡介
2、Timer1高級定時器Timer3通用定時器Timer14基本定時器功能特性
3、Timer1高級定時器Timer3通用定時器Timer14基本定時器實現基本定時中斷功能的初始化配置
4、Timer1高級定時器Timer3通用定時器Timer14基本定時器實現基本定時中斷功能,分別定時1ms/5ms/1s並分別翻轉LED1/LED2/LED3的狀態
1、Timer1高級定時器Timer3通用定時器Timer14基本定時器簡介:
(1)高級控制定時器 (TIM1) 由一個 16 位的自動裝載計數器組成,它由一個可編程的預分頻器驅動,適合多種用途,包含測量輸入信號的脈沖寬度 (輸入捕獲),或者產生輸出波形 (輸出比較、PWM、嵌入死區時間的互補PWM 等)。使用定時器預分頻器和 RCC 時鍾控制預分頻器,可以實現脈沖寬度和波形周期從幾個微秒到幾個毫秒的調節。高級控制定時器 (TIM1) 和通用定時器 (TIMx)是完全獨立的,它們不共享任何資源。它們可以同步操作。
(2)通用定時器(TIM3)是一個通過可編程預分頻器驅動的 16 位自動裝載計數器構成,適用於多種場合,包括測量輸入信號的脈沖長度 (輸入捕獲) 或者產生輸出波形 (輸出比較和 PWM)。使用定時器預分頻器和 RCC 時鍾控制器預分頻器,脈沖長度和波形周期可以在幾個微秒到幾個毫秒間調整。TIMx 定時器是完全獨立的,而且沒有互相共享任何資源。它們可以一起同步操作。
(3)基本定時器TIM14由一個16位的自動裝載計數器組成,它由一個可編程的預分頻器驅動,適合多種用途,包含測量輸入信號的脈沖寬度(輸入捕獲),或者產生輸出波形(輸出比較和 PWM)。使用定時器預分頻器和 RCC 時鍾控制預分頻器,可以實現脈沖寬度和波形周期從幾個微秒到幾個毫秒的調節。基本定時器 TIM14 是完全獨立的,不共享任何資源。
2、Timer1高級定時器Timer3通用定時器Timer14基本定時器功能特性:
(1)TIM1 定時器的功能特性包括:
• 16 位向上、向下、向上/下自動裝載寄存器
• 16位可編程(可以實時修改)預分頻器,計數器時鍾頻率的分頻系數為1~65536 之間的
任意數值
• 多達 4 個獨立通道
– 輸入捕獲
– 輸出比較
– PWM 生成 (邊緣或中間對齊模式)
– 單脈沖模式輸出
• 死區時間可編程的互補輸出
• 使用外部信號控制定時器和定時器互聯的同步電路
• 允許在指定數目的計數器周期之后更新定時器寄存器的重復計數器
• 剎車輸入信號可以將定時器輸出信號置於復位狀態或者一個已知狀態
• 支持針對定位的增量 (正交) 編碼器和霍爾傳感器電路
• 觸發輸入作為外部時鍾或者按周期的電流管理
(2)通用 定時器(TIM3) 定時器功能特性:
• 16 位向上、向下、向上/向下自動裝載計數器
• 16 位可編程 (可以實時修改) 預分頻器,計數器時鍾頻率的分頻系數為 1~65536 之間
的任意數值
• 3 個獨立的通道
– 輸入捕獲
– 輸出比較
– PWM 生成 (邊緣或中間對齊模式)
– 單脈沖模式輸出
• 使用外部信號控制定時器和定時器互連的同步電路
• 支持針對定位的增量 (正交) 編碼器和霍爾傳感器電路
• 觸發輸入作為外部時鍾或者按周期的電流管理
(3)基本 定時器(TIM14) 定時器功能特性:
• 16 位自動裝載計數器
• 16 位可編程 (可以實時修改) 預分頻器,計數器時鍾頻率的分頻系數為 1~65536 之間
的任意數值
• 獨立通道
– 輸入捕獲
– 輸出比較
– PWM 生成 (邊緣對齊模式)
• 如下事件發生時產生中斷
– 更新:計數器溢出,計數器初始化 (通過軟件)
– 輸入捕獲
– 輸出比較
3、Timer1高級定時器Timer3通用定時器Timer14基本定時器實現基本定時中斷功能的初始化配置:
(1)在MDK Keil工程中新建bsp_timerx.c和bsp_timerx.h文件,在bsp_timerx.c中包含bsp_timerx.h文件,
(2)編寫Timer1實現1ms定時中斷初始化函數以及中斷函數
1 #include "bsp_timerx.h" 2 3 //Timer1 1ms Flag 4 u8 TIM1_1ms_Flag = 0; 5 //Timer3 5ms Flag 6 u8 TIM3_5ms_Flag = 0; 7 //Timer14 1s Flag 8 u8 TIM14_1s_Flag = 0; 9 10 /** 11 *********************************************************************************************************************** 12 *@函數名稱:void Bsp_TIM1_Init(u16 Prescaler,u16 Period) 13 *@功能描述:TIM1 Init 14 *@輸入參數:Prescaler:預分頻系數1-65536、Period:周期值 15 *@返回參數:None 16 *********************************************************************************************************************** 17 */ 18 void Bsp_TIM1_Init(u16 Prescaler,u16 Period) 19 { 20 TIM_TimeBaseInitTypeDef TIM_StructInit; 21 NVIC_InitTypeDef NVIC_StructInit; 22 23 //使能TIM1外設時鍾 24 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM1, ENABLE); 25 //配置TIM1重載計數周期值 26 TIM_StructInit.TIM_Period = Period; 27 //配置TIM1 預分頻系數 28 TIM_StructInit.TIM_Prescaler = Prescaler; 29 //配置TIM1時鍾分割 30 TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1; 31 //向上計數模式 32 TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up; 33 //配置脈沖周期計數 34 TIM_StructInit.TIM_RepetitionCounter = 0; 35 //根據以上配置參數初始化 TIM1結構體成員參數 36 TIM_TimeBaseInit(TIM1, &TIM_StructInit); 37 //使能TIM1 NVIC中斷優先級通道 38 NVIC_StructInit.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn; 39 //配置TIM1 NVIC中斷優先級 40 NVIC_StructInit.NVIC_IRQChannelPriority = 0; 41 //使能NVIC中斷優先級 42 NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE; 43 //根據配置的中斷優先級參數初始化TIM1中斷優先級 44 NVIC_Init(&NVIC_StructInit); 45 //TIM1計時之前清向上計數標志 46 TIM_ClearFlag(TIM1, TIM_FLAG_Update); 47 //使能TIM1向上計時中斷 48 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); 49 //使能TIM1 工作 50 TIM_Cmd(TIM1, ENABLE); 51 }
1 /** 2 *********************************************************************************************************************** 3 *@函數名稱:void TIM1_BRK_UP_TRG_COM_IRQHandler(void) 4 *@功能描述:TIM1中斷服務程序 5 *@輸入參數:None 6 *@返回參數:None 7 *********************************************************************************************************************** 8 */ 9 void TIM1_BRK_UP_TRG_COM_IRQHandler(void) 10 { 11 if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) 12 { 13 TIM_ClearITPendingBit(TIM1, TIM_IT_Update); 14 //1ms 15 TIM1_1ms_Flag = 1; 16 } 17 }
(3)編寫Timer3實現5ms定時中斷初始化函數以及中斷函數
1 /** 2 *********************************************************************************************************************** 3 *@函數名稱:void Bsp_TIM3_Init(u16 Prescaler,u16 Period) 4 *@功能描述:TIM3 Init 5 *@輸入參數:Prescaler:預分頻系數1-65536、Period:周期值 6 *@返回參數:None 7 *********************************************************************************************************************** 8 */ 9 void Bsp_TIM3_Init(u16 Prescaler,u16 Period) 10 { 11 TIM_TimeBaseInitTypeDef TIM_StructInit; 12 NVIC_InitTypeDef NVIC_StructInit; 13 14 //使能TIM3外設時鍾 15 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 16 //配置TIM3重載計數周期值 17 TIM_StructInit.TIM_Period = Period; 18 //配置TIM3 預分頻系數 19 TIM_StructInit.TIM_Prescaler = Prescaler; 20 //配置TIM3時鍾分割 21 TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1; 22 //向上計數模式 23 TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up; 24 //配置脈沖周期計數 25 TIM_StructInit.TIM_RepetitionCounter = 0; 26 //根據以上配置參數初始化 TIM3結構體成員參數 27 TIM_TimeBaseInit(TIM3, &TIM_StructInit); 28 29 //使能TIM3 NVIC中斷優先級通道 30 NVIC_StructInit.NVIC_IRQChannel = TIM3_IRQn; 31 //配置TIM3 NVIC中斷優先級 32 NVIC_StructInit.NVIC_IRQChannelPriority = 1; 33 //使能NVIC中斷優先級 34 NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE; 35 //根據配置的中斷優先級參數初始化TIM3中斷優先級 36 NVIC_Init(&NVIC_StructInit); 37 38 //TIM3計時之前清向上計數標志 39 TIM_ClearFlag(TIM3, TIM_FLAG_Update); 40 //使能TIM3向上計時中斷 41 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); 42 //使能TIM3 工作 43 TIM_Cmd(TIM3, ENABLE); 44 }
1 /** 2 *********************************************************************************************************************** 3 *@函數名稱:void TIM3_IRQHandler(void) 4 *@功能描述:TIM3中斷服務程序 5 *@輸入參數:None 6 *@返回參數:None 7 *********************************************************************************************************************** 8 */ 9 void TIM3_IRQHandler(void) 10 { 11 if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) 12 { 13 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); 14 //5ms 15 TIM3_5ms_Flag = 1; 16 } 17 }
(4)編寫Timer14實現1s定時中斷初始化函數以及中斷函數
1 /** 2 *********************************************************************************************************************** 3 *@函數名稱:void Bsp_TIM14_Init(u16 Prescaler,u16 Period) 4 *@功能描述:TIM14 Init 5 *@輸入參數:Prescaler:預分頻系數1-65536、Period:周期值 6 *@返回參數:None 7 *********************************************************************************************************************** 8 */ 9 void Bsp_TIM14_Init(u16 Prescaler,u16 Period) 10 { 11 TIM_TimeBaseInitTypeDef TIM_StructInit; 12 NVIC_InitTypeDef NVIC_StructInit; 13 14 //使能TIM14外設時鍾 15 RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM14, ENABLE); 16 //配置TIM14重載計數周期值 17 TIM_StructInit.TIM_Period = Period; 18 //配置TIM14預分頻系數 19 TIM_StructInit.TIM_Prescaler = Prescaler; 20 //配置TIM14時鍾分割 21 TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1; 22 //向上計數模式 23 TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up; 24 //配置脈沖周期計數 25 TIM_StructInit.TIM_RepetitionCounter = 0; 26 //根據以上配置參數初始化 TIM14結構體成員參數 27 TIM_TimeBaseInit(TIM14, &TIM_StructInit); 28 29 //使能TIM14 NVIC中斷優先級通道 30 NVIC_StructInit.NVIC_IRQChannel = TIM14_IRQn; 31 //配置TIM14 NVIC中斷優先級 32 NVIC_StructInit.NVIC_IRQChannelPriority = 2; 33 //使能NVIC中斷優先級 34 NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE; 35 //根據配置的中斷優先級參數初始化TIM14中斷優先級 36 NVIC_Init(&NVIC_StructInit); 37 38 //TIM14計時之前清向上計數標志 39 TIM_ClearFlag(TIM14, TIM_FLAG_Update); 40 //使能TIM14向上計時中斷 41 TIM_ITConfig(TIM14, TIM_IT_Update, ENABLE); 42 //使能TIM14 工作 43 TIM_Cmd(TIM14, ENABLE); 44 }
1 /** 2 *********************************************************************************************************************** 3 *@函數名稱:void TIM14_IRQHandler(void) 4 *@功能描述:TIM14中斷服務程序 5 *@輸入參數:None 6 *@返回參數:None 7 *********************************************************************************************************************** 8 */ 9 void TIM14_IRQHandler(void) 10 { 11 if(TIM_GetITStatus(TIM14, TIM_IT_Update) != RESET) 12 { 13 TIM_ClearITPendingBit(TIM14, TIM_IT_Update); 14 //1s 15 TIM14_1s_Flag = 1; 16 } 17 }
(5)編寫bsp_timerx.h頭文件
1 #ifndef __BSP_TIMX__H__ 2 #define __BSP_TIMX__H__ 3 4 #include "mm32_device.h" 5 #include "hal_conf.h" 6 #include "bsp_gpio_led.h" 7 8 //Timer1 1ms Flag 9 extern u8 TIM1_1ms_Flag; 10 //Timer3 5ms Flag 11 extern u8 TIM3_5ms_Flag; 12 //Timer14 1s Flag 13 extern u8 TIM14_1s_Flag; 14 15 //聲明初始化TIM1 16 void Bsp_TIM1_Init(u16 Prescaler,u16 Period); 17 //聲明初始化TIM3 18 void Bsp_TIM3_Init(u16 Prescaler,u16 Period); 19 //聲明初始化TIM14 20 void Bsp_TIM14_Init(u16 Prescaler,u16 Period); 21 22 #endif
4、Timer1高級定時器Timer3通用定時器Timer14基本定時器實現基本定時中斷功能,分別定時1ms/5ms/1s並分別翻轉LED1/LED2/LED3的狀態:
(1)在main.c文件中包含#include "bsp_gpio_led.h"和#include "bsp_timerx.h"頭文件
(2)在main函數中分別調用LED、TIM1、TIM3、TIM14定時器中斷初始化函數,並在 "bsp_timerx.h"頭文件包含的mm32_device.h頭文件中對SystemCoreClock參數作extern聲明,while(1)大循環中分別判斷TIM1_1ms_Flag、TIM1_5ms_Flag、TIM1_1s_Flag的時間標志,時間到即分別
翻轉LED1、LED2、LED3的電平狀態,代碼如下所示:
1 #include "bsp_gpio_led.h" 2 #include "bsp_timerx.h" 3 4 /** 5 *********************************************************************************************************************** 6 *@函數名稱:int main(void) 7 *@功能描述:main函數,主函數入口代碼在這里開始執行 8 *@輸入參數:None 9 *@返回參數:int:0(和編譯器有關) 10 *********************************************************************************************************************** 11 */ 12 int main(void) 13 { 14 //LED Init 15 Bsp_LED_Init(); 16 //TIM1 Init Config 1ms 17 Bsp_TIM1_Init(SystemCoreClock/100000-1,100-1); 18 //TIM3 Init Config 5ms 19 Bsp_TIM3_Init(SystemCoreClock/100000-1,500-1); 20 //TIM14 Init Config 1s 21 Bsp_TIM14_Init(SystemCoreClock/1000-1,1000-1); 22 23 while(1) 24 { 25 //1ms Flag 26 if(TIM1_1ms_Flag == 1) 27 { 28 LED1_TOGGLE(); 29 TIM1_1ms_Flag = 0; 30 } 31 //5ms Flag 32 if(TIM3_5ms_Flag == 1) 33 { 34 LED2_TOGGLE(); 35 TIM3_5ms_Flag = 0; 36 } 37 //1s Flag 38 if(TIM14_1s_Flag == 1) 39 { 40 LED3_TOGGLE(); 41 TIM14_1s_Flag = 0; 42 } 43 } 44 45 }
結束語:
關於Timx定時器的初始化配置可參考MM32F0010的庫函數外設:hal_tim.c和hal_tim.h以及hal_rcc.c和hal_rcc.h的描述。