STM32定時器 TIM3之定時中斷


 

   以STM32F030F4P6,uVision開發環境為例,注意了,若使用其它相近芯片,本文僅供參考。

   TIM3 結構框圖

 

          

 

   在中斷文件stm32f0xx_it.c 中修改或添加下面語句、函數。

extern void LED_A4 ();                                            //外部引入函數聲明  加在文件首部  

void TIM3_IRQHandler(void)                                                 // 加入TIM3中斷函數
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);                    // 清TIM3溢出中斷標志位
LED_A4 ();                                                                             //亮燈取反滅燈函數
}

 

  下面是main.c文件

#include "stm32f0xx.h"

void LED_Init(void)                                                                            //LED初始化函數
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  //使能A口的時鍾
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 ;                                      //指明A4口
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;                          //設定輸出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;                         //設定輸出為上拉
GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3;                   //設定級別為3
GPIO_Init(GPIOA, &GPIO_InitStruct);                                              //按以上設置初始化A4
}

 

void LED_A4(void)                                                                             //亮燈取反滅燈函數   
{
GPIO_WriteBit(GPIOA, GPIO_Pin_4,                                               //指定修改A4腳的位
(BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)))); //讀A4狀態后取反
}

 

void TIM_INIT_Config(void)                                                      //TIM3中斷初始化函數
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;               //聲明TIM_TimeBaseInitTypeDef結構變量
NVIC_InitTypeDef NVIC_InitStructure;                                      //聲明NVIC_InitTypeDef 向量結構變量
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  //使能TIM3時鍾

// 定時器基礎設置
TIM_TimeBaseStructure.TIM_Period = 1199;                           //設置自動重載計數=1199+1=1200

TIM_TimeBaseStructure.TIM_Prescaler = 2-1;                        //定時器的時鍾頻率=TIM_Prescaler+1=2;
TIM_TimeBaseStructure.TIM_ClockDivision = 1;                     //輸入捕獲時濾波用的參數,必須設一下
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上計數
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);               //根據指定的參數初始

// TIM3 中斷嵌套設置

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;              //選擇TIM3的IRQ通道
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;                   //IRQ通道優先級=0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //使能IRQ通道
NVIC_Init(&NVIC_InitStructure);                                               //按以參數上設置

TIM_ClearFlag(TIM3, TIM_FLAG_Update);                              //清除標志位,以免一啟用中斷后立即產生中斷

TIM_ARRPreloadConfig(TIM3, DISABLE);                               //禁止ARR預裝載緩沖器  
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);                       //使能TIM3溢出中斷
TIM_Cmd(TIM3, ENABLE);                                                       //使能TIM3 總中斷
}

 

int main(void)
{

LED_Init();                                                                              //LED初始化函數
TIM_INIT_Config();                                                                //TIM3中斷初始化函數

while (1)                                                                                 //主環等待
{}

說明:

1  上面“使能TIM3時鍾”就是打開開關,引入RCC的CK_INT,見另一篇博文“徹底整明白STM32F030 的時鍾”,

     之前設置CK_INT的時鍾為48M,所以TIM3預分頻系數=2時,分頻后時鍾=24M。

2   24M時鍾進入TIM3計數器,計數器溢出門限設置為1200,什么意思?

     這是說24M時鍾意味着每秒有24000000個脈沖入重載計數器,每查夠1200個脈沖計數器就溢出,輸出1個

     中斷信號,然后程序跳入中斷去翻轉A4腳燈的狀態,亮、滅、亮、滅 ....   

3   24MHz時鍾每秒有24000000個脈沖,每個脈沖的時間=1秒/24000000

                                                             1200個脈沖的時間=1200*(1秒/24000000)=0.05*10-3 秒       

     所以A4腳燈亮0.05*10-3 秒,然后滅0.05*10-3 秒,亮0.05*10-3 秒,再滅0.05*10-3 秒,如此循環;

     兩個亮之間的間隔時間 = 亮0.05*10-3 +滅0.05*10-3 秒=0.1*10-3 秒                                                      

     兩個亮之間的間隔時間秒的倒數 = 頻率Hz =1/0.1*10-3 秒=10000Hz=10KHz

     用頻率計測A4腳的頻率=10KHz,如果設置頻率小於30Hz,能看到A4腳接的LED燈在閃。

4   如何改變頻率呢?

     很簡單,調整TIM3重載計數器溢出門限值和預分頻系數都可以的。

     還有別的方法調整TIM3中斷輸出頻率嗎? 當然有,別忘了CK_INT入TIM3前,時鍾系統還有不少可調整

     的分頻器、倍頻器哦,翻翻博主的其它相關文章參考下吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM