STM32通用定時器中斷

STM32F1 的通用定時器是一個通過可編程預分頻器(PSC飞几,16位,1~65535)驅(qū)動的 16 位自動裝載計數(shù)器(CNT)構成窟社。STM32 的通用定時器可以被用于:測量輸入信號的脈沖長度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和 PWM)等绪钥。 使用定時器預分頻器和 RCC 時鐘控制器預分頻器关炼,脈沖長度和波形周期可以在幾個微秒到幾個毫秒間調(diào)整。定時器相關的庫函數(shù)主要集中在固件庫文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中寸潦。

(1)使能定時器時鐘(以定時器3為例)
void TIM3_Int_Init(u16 arr,u16 psc)   //初始化函數(shù)保留重加載值arr和與分頻系數(shù)psc兩個入口參數(shù)
{

}
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能

其中APB1和APB2中的定義如下:

/** @defgroup APB1_peripheral 
  * @{
  */

#define RCC_APB1Periph_TIM2              ((uint32_t)0x00000001)
#define RCC_APB1Periph_TIM3              ((uint32_t)0x00000002)
#define RCC_APB1Periph_TIM4              ((uint32_t)0x00000004)
#define RCC_APB1Periph_TIM5              ((uint32_t)0x00000008)
#define RCC_APB1Periph_TIM6              ((uint32_t)0x00000010)
#define RCC_APB1Periph_TIM7              ((uint32_t)0x00000020)
#define RCC_APB1Periph_TIM12             ((uint32_t)0x00000040)
#define RCC_APB1Periph_TIM13             ((uint32_t)0x00000080)
#define RCC_APB1Periph_TIM14             ((uint32_t)0x00000100)
#define RCC_APB1Periph_WWDG              ((uint32_t)0x00000800)
#define RCC_APB1Periph_SPI2              ((uint32_t)0x00004000)
#define RCC_APB1Periph_SPI3              ((uint32_t)0x00008000)
#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
#define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)
#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)
#define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)
#define RCC_APB1Periph_I2C1              ((uint32_t)0x00200000)
#define RCC_APB1Periph_I2C2              ((uint32_t)0x00400000)
#define RCC_APB1Periph_USB               ((uint32_t)0x00800000)
#define RCC_APB1Periph_CAN1              ((uint32_t)0x02000000)
#define RCC_APB1Periph_CAN2              ((uint32_t)0x04000000)
#define RCC_APB1Periph_BKP               ((uint32_t)0x08000000)
#define RCC_APB1Periph_PWR               ((uint32_t)0x10000000)
#define RCC_APB1Periph_DAC               ((uint32_t)0x20000000)
#define RCC_APB1Periph_CEC               ((uint32_t)0x40000000)
 
#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x81013600) == 0x00) && ((PERIPH) != 0x00))

/**
  * @}
  */
/** @defgroup APB2_peripheral 
  * @{
  */

#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)

#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))
/**
  * @}
  */ 

(2)初始化定時器,配置ARR斩箫,PSC
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值   
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數(shù)的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_tim撵儿,參數(shù)有TIM_CKD_DIV1,TIM_CKD_DIV2易核,TIM_CKD_DIV4
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式浪默,向下計數(shù)為TIM_CounterMode_Down

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時間基數(shù)單位

關于中斷時間的計算:

Tout(溢出時間)=(ARR+1)(PSC+1) / fclk

其中缀匕,ARR為重裝載值井氢,PSC為預分配系數(shù),fclk為系統(tǒng)時鐘頻率花竞。 fclk / (PSC+1)其實得到的是分頻后的頻率约急,倒數(shù)后變成周期。
系統(tǒng)初始化的時候在默認的系統(tǒng)初始化函數(shù) SystemInit 函數(shù)里面已經(jīng)初始化 APB1 的時鐘為 2 分頻厌蔽,所以 APB1 的時鐘為 36M,而從 STM32 的內(nèi)部時鐘樹圖得知:當 APB1 的時鐘分頻數(shù)為 1 的時候纬向,TIM2~7 的時鐘為 APB1 的時鐘戴卜,而如果 APB1 的時鐘分頻數(shù)不為 1,那么 TIM2~7 的時鐘頻率將為 APB1 時鐘的兩倍师脂。

TIM_CounterMode 的作用:
http://blog.sina.com.cn/s/blog_76c545390100ovfj.html

(3)開啟定時器中斷江锨,配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //在主函數(shù)main()中設置分組,設置NVIC中斷分組2:2位搶占優(yōu)先級啄育,2位響應優(yōu)先級
NVIC_InitTypeDef NVIC_InitStructure;

//中斷優(yōu)先級NVIC設置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優(yōu)先級0級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //從優(yōu)先級3級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能指定的TIM3中斷,允許更新中斷

中斷配置函數(shù) TIM_ITConfig的說明:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
//其中第二個參數(shù)很重要挑豌,定義如下
#define TIM_IT_Update                      ((uint16_t)0x0001)//最常用,更新中斷完疫,計數(shù)器向上溢出/向下溢出债蓝,計數(shù)器初始化(通過軟件或者內(nèi)部/外部觸發(fā)) 
#define TIM_IT_CC1                         ((uint16_t)0x0002)
#define TIM_IT_CC2                         ((uint16_t)0x0004)
#define TIM_IT_CC3                         ((uint16_t)0x0008)
#define TIM_IT_CC4                         ((uint16_t)0x0010)//都是捕獲/比較中斷,貌似都是平等的饰迹,即輸入捕獲余舶,輸出比較
#define TIM_IT_COM                         ((uint16_t)0x0020)
#define TIM_IT_Trigger                     ((uint16_t)0x0040)//觸發(fā)事件(計數(shù)器啟動匿值、停止赂摆、初始化或者由內(nèi)部/外部觸發(fā)計數(shù))
#define TIM_IT_Break                       ((uint16_t)0x0080)
(4)使能定時器
TIM_Cmd(TIM3, ENABLE);  //使能TIM3    

至此,初始化完成烟号。

(5)編寫中斷服務函數(shù)
void TIM3_IRQHandler(void)   //TIM3中斷
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //檢查TIM3更新中斷發(fā)生與否
        {
        //各種中斷服務函數(shù)內(nèi)容
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIM3更新中斷標志 
        }
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汪拥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宪赶,更是在濱河造成了極大的恐慌脯燃,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叽讳,死亡現(xiàn)場離奇詭異坟募,居然都是意外死亡邑狸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門赚哗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硅堆,“玉大人,你說我怎么就攤上這事渐逃。” “怎么了茄菊?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長竖哩。 經(jīng)常有香客問我,道長遵绰,這世上最難降的妖魔是什么增淹? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮名眉,結果婚禮上舱呻,老公的妹妹穿的比我還像新娘。我一直安慰自己舞蔽,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布个盆。 她就那樣靜靜地躺著颊亮,像睡著了一般陨溅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上门扇,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天臼寄,我揣著相機與錄音霸奕,去河邊找鬼吉拳。 笑死,一個胖子當著我的面吹牛临梗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吃沪,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼什猖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了降铸?” 一聲冷哼從身側(cè)響起摇零,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谅畅,沒想到半個月后噪服,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡仇味,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年雹顺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片带到。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡英染,死狀恐怖被饿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狭握,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布哎垦,位于F島的核電站囱嫩,受9級特大地震影響漏设,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸳碧,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一犬性、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧套利,春花似錦鹤耍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至财著,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撑教,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工收苏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留愤兵,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓懦鼠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親街氢。 傳聞我的和親對象是個殘疾皇子睦袖,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 姓名:周崇杰 學號:16040120059 專業(yè):機械設計制造及其自動化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 1,065評論 0 0
  • 首先讓我們來看一下關于控制定時器中斷的文件timer.c中的源碼: 前兩行是頭文件的聲明扣泊,這里我們不去理會,我們今...
    Jane_123閱讀 11,308評論 0 5
  • 1 綜述 1.1 時鐘源 在STM32中评矩,一共有5個時鐘源阱飘,分別是HSI、HSE沥匈、LSI、LSE缰儿、PLL散址。 HSI...
    hackvilin閱讀 3,460評論 0 6
  • 有一次做一個東西,為了盡量不占用CPU的處理數(shù)據(jù)時間,所以就使用DMA接收串口的數(shù)據(jù),但是呢問題來了.,,,,,怎...
    楊奉武閱讀 3,169評論 0 1
  • 昨夜吏祸,黨同學突然說道要寫總結了,有點小吃驚的我也是很尷尬贡翘,只因上班有周總、月總床估、年終總,沒想到寫東西也要有丐巫,更疑惑...
    風不千山閱讀 283評論 0 1