STM32 定時器有時一開啟就進中斷

2021-08-13 04:35:04 字數 2164 閱讀 3786

本文**:

在用到stm32定時器的更新中斷時,發現有些情形下只要開啟定時器就立即進入一次中斷。準確說,只要使能更新中斷允許位就立即響應一次更新中斷【當然前提是相關nvic也已經配置好】。換言之,只要使能了相關定時器更新中斷,不管你定時間隔多長甚至不在乎你是否啟動了相關定時器,它都會立即進入一次定時器更新中斷服務程式。

以stm32f051晶元為例,做了幾種不同順序的組合測試。根據測試發現,的確有些情況下一執行**tim_itconfig(tim1, tim_it_update, enable);** 【即使能更新中斷】就立即進入更新中斷服務程式。當然後面的中斷都是正常的。

老實說,這個問題比較容易忽視,有些情況下也無關緊要,但有些情況可能會給應用帶來困擾。從st mcu相關技術手冊似乎並不能明顯地找到關於這個問題的很合適或者邏輯性很強的前因後果。

經過驗證測試,如果注意一下相關指令**順序是可以迴避這個問題的。

先做更新中斷標誌的清除操作,即清除timx->sr暫存器裡的uif標誌,然後做定時器更新中斷的使能操作。至於開啟相關定時器的指令擺放位置並不嚴格。下面是相關動作的操作順序及結果,可以參考、驗證之。這裡共羅列了6種寫法,其中有3種情形是會立即進入中斷的,另外3種不會。

/*(1)。。。。。。不會立即進入更新中斷程式。*/

tim_clearitpendingbit(tim1, tim_it_update); //清除更新中斷請求位

tim_itconfig(tim1, tim_it_update, enable); //使能定時器1更新中斷

tim_cmd(tim1, enable); //啟動定時器

/*(2)。。。。。。不會立即進入更新中斷程式。*/

tim_clearitpendingbit(tim1, tim_it_update);//清除更新中斷請求位

tim_cmd(tim1, enable);

tim_itconfig(tim1, tim_it_update, enable);//使能定時器1更新中斷

/*(3)。。。。。。不會立即進入更新中斷程式。*/

tim_cmd(tim1, enable);

tim_clearitpendingbit(tim1, tim_it_update);//清除更新中斷請求位

tim_itconfig(tim1, tim_it_update, enable);//使能定時器1更新中斷

/*(4)。。。。。。立即進入更新中斷程式。*/

tim_cmd(tim1, enable);

tim_itconfig(tim1, tim_it_update, enable);//使能定時器1更新中斷

tim_clearitpendingbit(tim1, tim_it_update);//清除更新中斷請求位

/*(5)。。。。。。立即進入更新中斷程式。*/

tim_itconfig(tim1, tim_it_update, enable);//使能定時器1更新中斷

tim_clearitpendingbit(tim1, tim_it_update);//清除更新中斷請求位

tim_cmd(tim1, enable);

/*(6)。。。。。。立即進入更新中斷程式。*/

tim_itconfig(tim1, tim_it_update, enable);//使能定時器1更新中斷

tim_cmd(tim1, enable);

tim_clearitpendingbit(tim1, tim_it_update);//清除更新中斷請求位

順便提下關於定時器裡ug位和urs位的使用,分別在timx->egr和timx->cr1暫存器裡。對ug位置1可以產生更新事件並對相關計數器和暫存器重新初始化,如果urs位為0的話,同時會產生更新中斷。如果不希望對ug位置1的同時產生更新中斷,得置urs位為1,否則會立即進入更新中斷。

本文**:

stm32關定時器 STM32定時器TIM3程式

include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...

stm32的定時器

stm32一共有8個都為16位的定時器。其中tim6 tim7是基本定時器 tim2 tim3 tim4 tim5是通用定時器 tim1和tim8是高階定時器。1.基本定時器 基本定時器tim6和tim7只具備最基本的定時功能,就是累加的時鐘脈衝數超過預定值時,能觸發中斷或觸發dma請求。由於在晶元...

STM32定時器中斷

本實驗的目的是通過定時器中斷控制led燈的亮滅。筆者所用ide為iar,採用標準庫 3.5韌體庫 通過定時器產生中斷來控制led。ifndef led h define led h include stm32f10x gpio.h include stm32f10x.h include stm32f...