STM32定時器之控制LED燈循環顯示

/*
名稱: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);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章