一.基本定時器簡介
??STM32F1 系列共有 8 個定時器,分別為:基本定時器、通用定時器、高級定時器。基本定時器 TIM6 和 TIM7 是一個 16 位的只能向上計數的定時器,只能定時,沒有外部IO。
二.基本定時器功能
上圖為基本定時器的功能框圖。
-
時鐘源:定時器時鐘TIMxCLK,即內部時鐘CK_INT。
-
計數器時鐘:定時器時鐘經過PSC預分頻器后,即CK_CNT,用于驅動計數器計數 。
計數器時鐘計算方式:CK_CNT=TIMxCLK/(PSC+1)。 -
計數器:CNT是一個16位的計數器,最大計數值是65535。當計數達到自動重載寄存器的時候產生更新事件,并清零重頭開始計數。
-
自動重裝載寄存器:自動重裝載寄存器 ARR 是一個 16 位的寄存器,這里面裝著計數器能計數的最大數值。當計數到這個值的時候,如果使能了中斷的話,定時器就產生溢出中斷。
-
定時時間的計算:定時時間=計數器的中斷周期*中斷的次數 = 1/CK_CNT * (ARR+1)。
三.定時器初始化結構體
typedef struct {uint16_t TIM_Prescaler; // 預分頻器uint16_t TIM_CounterMode; // 計數模式(基本定時器只能使用向上計數)uint32_t TIM_Period; // 定時器周期uint16_t TIM_ClockDivision; // 時鐘分頻(基本定時器不用設置)uint8_t TIM_RepetitionCounter; // 重復計算器(基本定時器不用設置)
} TIM_TimeBaseInitTypeDef;
- TIM_Prescaler:定時器預分頻器設置,時鐘源經過預分頻器后才是定時器時鐘。
- TIM_CounterMode:定時器計數方式,包含:向上計數、向下計數、中心對齊模式。基本定時器只能是向上計數(從0開始遞增)。
- TIM_Period:定時器周期,設定自動重載寄存器的值。
四.源代碼
1.定時器初始化設置和中斷初始化設置
//baseTimer.c
#include "baseTimer.h"
void INIT_NVIC_CONFIG(void)
{NVIC_InitTypeDef NVIC_InitStructure;//設置中斷分組NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;//設置中斷源 基本定時器 6,7NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void INIT_BASETimer_CONFIG(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//開啟定時器時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);TIM_TimeBaseInitStructure.TIM_Prescaler = 71;//分頻因子 CLK/(pre+1) 72MHZ/72 = 1MHZ =10^6HZ 周期是1usTIM_TimeBaseInitStructure.TIM_Period = 1000-1;//定時1ms中斷 (per+1)*計數周期//初始化定時器TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStructure);//清除計數器中斷標志位TIM_ClearFlag(TIM6,TIM_FLAG_Update);//開啟計數器中斷TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//使能計數器TIM_Cmd(TIM6,ENABLE);
}
2.中斷處理函數
//stm32f10x_it.h
void TIM6_IRQHandler(void)
{if(TIM_GetITStatus(TIM6,TIM_IT_Update) == SET){Time_Count++;TIM_ClearITPendingBit(TIM6,TIM_FLAG_Update);if(Time_Count == 1000){Time_Count = 0;if(FLAG == 0){FLAG = 1;}else if(FLAG == 1){FLAG = 0;}}}
}
3.主函數
//main.c
#include "stm32f10x.h"
#include "bsp_colorled.h"
#include "baseTimer.h"uint8_t FLAG=0;int main(void)
{INIT_LED_CONFIG();CLOSE_LED();INIT_NVIC_CONFIG();INIT_BASETimer_CONFIG();while(1){if(FLAG == 0){OPEN_GREEN();}else{CLOSE_LED();}}
}
五.實驗現象
- 每隔1s RGB燈綠色交替顯示和熄滅
- 工程下載鏈接:STM32-基本定時器