/*
名稱:STM32定時器之控制LED燈循環顯示
說明:對於STM32來說,其定時器要比C51的定時器要多,功能也更復雜。
就數目來說來說,STM32的定時器可以分爲基本定時器,通用定時器和高級定時器(還包括Systick、看門口定時器和窗口定時器)。就STM32F103,一般來說,它有2個高級定時器TIM1和TIM8、4個通用定時器TIM2/3/4/5、2個基本定時器TIM6和TIM7。而C51一般只有幾個定時器。
就功能來說,
STM32中:
對於基本定時器,其功能就是和C51差不多,只有定時功能。
對於通用定時器,它的功能有定時、輸出比較、輸入捕獲。雖然目前,我也不知道後面兩個功能是幹啥的。
對於高級定時器,它還比通用定時器多了個互補輸出(我也不知道是什麼)。
C51中:它的定時器一般功能比較單一,最常用的就是其定時功能。
就輸入的時鐘源來說,C51單片機的是來自外部晶振。機器週期爲晶振週期的12倍,是一個固定的數。 而STM32的輸入源來自系統時鐘,其可以通過預分頻進行變換。
不過就本質上來說,定時器的功能就是對脈衝的計數。無論是C51還是STM32。不同的是,後者在定時器的基本功能(定時和計數)上又加了一些其他的功能,就像上面所說的輸出比較,輸入捕獲等。
就程序來說: 本實驗是用的F103C8系列單片機,它沒有基本定時器,所以這裏使用TIM2通用定時器來使LED燈每隔1s變換狀態一次。
就使用定時器的基本步驟來說,有如下:
1.定時器基本配置。配置其定時週期,預分頻等屬性。
2.中斷基本配置。 配置NVIC控制器中和定時器相關的內容。
3.編寫中斷服務函數。
*/
主要代碼如下:
//基本定時器模式配置
void BASIC_TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//開啓定時器2的時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//配置基本的定時器2
TIM_TimeBaseStructure.TIM_Period = 1000; //定時週期
TIM_TimeBaseStructure.TIM_Prescaler = 71; //預分頻爲71+1
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//
// 初始化定時器
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 清除計數器中斷標誌位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
// 開啓計數器中斷
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
// 使能計數器
TIM_Cmd(TIM2, ENABLE);
//暫時關閉定時器2的時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,DISABLE);
}
//基本定時器中斷配置
void BASIC_TIM_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// 設置中斷組爲 0
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
// 設置中斷來源
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ;
// 設置主優先級爲 0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// 設置搶佔優先級爲 3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//通用定時器2的中斷服務函數
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
{
++time;
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
}
}