上一篇文章講述了TIM精確延時(阻塞式),它主要的特點是延時精確,而阻塞式延時在這一延時過程中不能做其它事情,只能等待延時結束。
在某些場合下,我們需要在延時的過程中也要進行其它操作,如在延時過程中需要檢測某一個IO口的電平狀態(tài)、檢測某一按鍵是否處于按下狀態(tài)等。這個時候我們簡單的處理方法就是使用定時中斷,一旦這個延時時間到就進行下一個操作。
本文將簡單講述如何實現(xiàn)TIM定時和中斷,提供簡單的例程源代碼。
為方便大家閱讀,本文內容已經(jīng)整理成PDF文件:
http://pan.baidu.com/s/1i5uWhJR
TIM基礎知識 Ⅱ
在上一篇文章中講述了一些關于TIM的知識,本文說一下TIM中斷相關知識。
TIM框圖:
TIM4屬于基本定時器,是8位計數(shù)的定時器,也就是說UP-COUNTER和Auto-reload register是8位的寄存器,最大值只能為255。
主系統(tǒng)時鐘fMASTER進來,通過分頻Prescaler給計數(shù)器UP-COUNTER計數(shù),當計數(shù)器和Auto-reload register相等時,有一個事件更新(這就是上文的延時時間到),如果使能了事件更新中斷,則會響應中斷(UIF)。
這里再次強調一下,基本定時器的8位的定時器,最大值為255,如果不滿足要求,可以使用16位的通用定時器。
軟件工程源代碼 Ⅲ
1、關于工程
本文提供的工程代碼是基于前面軟件工程“STM8S_Demo”增加TIM定時器修改而來。初學的朋友可以參看我前面對應的基礎文章,那些文章講的比較詳細。
工程以簡單、易理解為主,方便更多初學者快速理解,工程的大部分配置都是使用默認配置,具體配置可參看我的文章:IAR for STM8系列教程(一)_新建軟件工程詳細過程。
2.軟件概要說明
堅持簡單、基礎、方便初學者理解為原則,本文提供軟件工程中的源代碼只添加了最簡單的內容:
系統(tǒng)初始化:System_Initializes
v BSP_Initializes:時鐘初始化CLK_Configuration和GPIO_Configuration初始化;
v TIMER_Initializes:定時器初始化,本文重點內容;
功能實現(xiàn):while(1)
v TIMTiming_Nms和TIMTiming_Off:開啟定時和關閉定時;
v TIM4_UPD_OVF_IRQHandler:定時器中斷。
3.代碼分析說明
關于BSP_Initializes中的內容這里不再詳細說明,請見前面相關的文章:STM8S_001_GPIO基礎知識
本文重點講述關于TIM相關的內容:
A.TIMER_Initializes定時器初始化
void TIMER_Initializes(void)
{
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 125-1);
TIM4_ClearFlag(TIM4_FLAG_UPDATE);
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
enableInterrupts();
}
我們提供的軟件工程是實現(xiàn)1ms的延時,實現(xiàn)的公式為:16MHz /128 / 125 = 1KHz(1ms)。
第一個參數(shù)TIM4_PRESCALER_128:即128分頻,這個參數(shù)為枚舉類型,具體為如下:
typedef enum
{
TIM4_PRESCALER_1 = ((uint8_t)0x00),
TIM4_PRESCALER_2 = ((uint8_t)0x01),
TIM4_PRESCALER_4 = ((uint8_t)0x02),
TIM4_PRESCALER_8 = ((uint8_t)0x03),
TIM4_PRESCALER_16 = ((uint8_t)0x04),
TIM4_PRESCALER_32 = ((uint8_t)0x05),
TIM4_PRESCALER_64 = ((uint8_t)0x06),
TIM4_PRESCALER_128 = ((uint8_t)0x07)
} TIM4_Prescaler_TypeDef;
第二個參數(shù)125-1:這個參數(shù)的值,實際上的自動重載寄存器(Auto-reload register)的值,也是定時的周期值。從公式中可以看出,它是得出1ms延時的來源。
很多人不理解為什么125-1,而不是125呢?
原因很簡單:計數(shù)是從0開始的,0至124就是計數(shù)125個,因此這里是124。
語句TIM4_ClearFlag(TIM4_FLAG_UPDATE):
這條語句的意思很簡單,清除UPDATE更新標志位。
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
enableInterrupts();
如果我們需要在定時的時間到了之后響應中斷,只需要配置這兩條語句即可。(在中斷函數(shù)里面添加需要的內容)
B.啟動和關閉定時:TIMTiming_Nms / TIMTiming_Off
void TIMTiming_Nms(uint16_t Times)
{
gTIMTiming_Num = Times;
gTIMTiming_Flag = 0;
TIM4_SetCounter(0);
TIM4_Cmd(ENABLE);
}
void TIMTiming_Off(void)
{
gTIMTiming_Flag = 0;
TIM4_Cmd(DISABLE);
}
本文提供代碼中定義了兩個全局變量:
gTIMTiming_Num:定時計數(shù)(定時多少ms)
gTIMTiming_Flag:定時標志(0-無效 1-有效),也就是我們定時的時間到,有效的標志。
TIM4_SetCounter(0);
每次啟動定時器之前,將計數(shù)值歸零,這樣才能保證第一次計數(shù)(延時)準確。
C.定時中斷
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
gTIMTiming_Num--;
if(0 == gTIMTiming_Num)
{
TIM4_Cmd(DISABLE);
gTIMTiming_Flag = 1;
}
}
中斷的入口INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23),位于stm8s_it.c文件下面,由系統(tǒng)決定,我們不用去修改。
每次進入中斷,需要添加語句TIM4_ClearITPendingBit(TIM4_IT_UPDATE);清除中斷標志位。后面的由我們自己添加,我這里為了方便測試,使用gTIMTiming_Num變量,這樣可以使定時時間為1ms的倍數(shù)。
D.具體實現(xiàn)功能
TIMTiming_Nms(500);
while(1)
{
if(1 == gTIMTiming_Flag)
{
gTIMTiming_Flag = 0;
LED_REVERSE;
TIMTiming_Nms(500);
}
//添加處理語句
}
這里實現(xiàn)的功能比較簡單,定時500ms改變LED的狀態(tài)。在這里可以添加自己的處理語句(如檢測某一IO狀態(tài)···)。
下載 Ⅳ
STM8S資料:
http://pan.baidu.com/s/1o7Tb9Yq
軟件源代碼工程(STM8S-A03_TIM定時中斷):
http://pan.baidu.com/s/1c2EcRo0
上一篇:STM8S_002_TIM精確延時 (阻塞式)
下一篇:STM8S_ 004_UART基本收發(fā)數(shù)據(jù)
推薦閱讀
史海拾趣
1996年,F(xiàn)MS在臺灣正式成立,標志著美麗微半導體股份有限公司的誕生。公司由楊照霞女士創(chuàng)辦,初期便專注于二極管及場效應管(MOS)等分立式器件的研發(fā)與制造。這一決策基于對市場需求的敏銳洞察,以及對半導體技術未來發(fā)展的堅定信心。在楊照霞女士的帶領下,F(xiàn)MS迅速建立起一支專業(yè)的研發(fā)團隊,并著手構建半導體上下游資源整合體系,為公司的長遠發(fā)展奠定了堅實基礎。
Alpha Semiconductor公司于1983年創(chuàng)立,成立之初,公司主要從事代工服務業(yè)務。這一策略為Alpha Semiconductor在半導體行業(yè)打下了堅實的基礎。通過為其他公司提供高質量的代工服務,Alpha Semiconductor逐漸積累了技術實力和行業(yè)經(jīng)驗,為后續(xù)的自主研發(fā)和產(chǎn)品創(chuàng)新奠定了堅實的基礎。
廣東奧科公司深知品質是企業(yè)生存和發(fā)展的關鍵。因此,公司始終將品質管理放在首位,從原材料采購到生產(chǎn)流程控制,再到產(chǎn)品出廠檢驗,每一個環(huán)節(jié)都嚴格把控品質。同時,公司還建立了完善的品質管理體系和持續(xù)改進機制,通過不斷優(yōu)化生產(chǎn)工藝和提升產(chǎn)品質量,確保每一款產(chǎn)品都能滿足客戶的期望和需求。
隨著市場的不斷發(fā)展和變化,匯科公司始終將技術創(chuàng)新作為發(fā)展的核心驅動力。2012年,匯科第一臺球磨機節(jié)電柜研發(fā)成功,并成功申請國家專利,這標志著公司在節(jié)能環(huán)保技術領域取得了重要突破。隨后,公司又成功研發(fā)了柱塞泵節(jié)電柜、新一代全智能球磨機節(jié)電柜等產(chǎn)品,這些產(chǎn)品不僅提升了公司的市場競爭力,也推動了整個電子行業(yè)的發(fā)展。
為了進一步提升競爭力,ABL公司開始實施國際化發(fā)展戰(zhàn)略。公司首先在海外市場設立了銷售分支機構,積極開拓國際市場。隨后,ABL公司又在海外建立了生產(chǎn)基地,利用當?shù)刭Y源和優(yōu)勢降低生產(chǎn)成本。通過國際化發(fā)展,ABL公司不僅擴大了市場份額,還提高了品牌的國際影響力。
全國大學生電子設計競賽是個很好的比賽,鍛煉了電子信息工程及其它相關專業(yè)的學生,鍛煉了他們的實際動手能力。發(fā)出“全國大學生電子設計競賽獲獎作品”,不管是初學者還是老鳥,大家都看看,希望能給予大家一定的幫助。 全國大學生電子 ...… 查看全部問答∨ |
請教:WINCE5.0上已經(jīng)可以使用3G上網(wǎng)卡,原來WinMobile基于GPRS的程序如何移植過來? 怎樣才能讓原來基于GPRS的程序運行于3G上網(wǎng)卡上? 我正在WINCE 5.0上做一個3G無線上網(wǎng)卡的項目,已經(jīng)可以用IE上網(wǎng)了; 但是以前的程序是基于GPRS的,調用的網(wǎng)絡接口不一樣,原來調用的網(wǎng)絡接口有這些: ConnMgrApiReadyEvent、ConnMgrConnection ...… 查看全部問答∨ |
一定要創(chuàng)建一個設別來過濾被調用者嗎?還是可以直接構造IRP發(fā)送給被調用者?用App來調用驅動B的IOCTL能很快返回,但是我用另一個驅動A來發(fā)送同樣的IOCTL調用驅動B,驅動B就進入wait for single object掛起了,這是什么原因呢?… 查看全部問答∨ |
在這里我看見唐勉MVP使用ADS調試6410的博客 http://blog.eeworld.net/nanjianhui/archive/2009/05/15/4189270.aspx 我以前用的2440 的jlink卻不行, 請問大家怎么使用jlink 調試6410的,有啥推薦,請回復,謝謝。 使用ADS+JLINK調試硬件比較方 ...… 查看全部問答∨ |
用VB寫的一個用來調試ISD系列語音芯片的小軟件,簡單易用,為您節(jié)省購買編程器/拷貝機的高昂費用。 配合錄音板可以實現(xiàn):隨心所欲錄制語音信息,方便記錄語音段地址,隨時試聽等,是調試和開發(fā)ISD語音芯片的好工具。 連接好電源線、串口 ...… 查看全部問答∨ |
|
版版看到論壇上有壇友經(jīng)常下資料苦于沒有芯幣, 版版 突發(fā)奇想,開個芯幣銀行吧! 提供芯幣貸款,需要芯幣的,可以在本貼下方提出來,版版會給你以評分獎勵的方式發(fā)放相應數(shù)目的芯幣。 現(xiàn)在我先銀行注冊,注冊資本7614芯幣,版版的身家都在這兒了 ...… 查看全部問答∨ |
2013年國賽,您選擇哪類題目?投票拿JLink【活動結束】 本帖最后由 paulhyde 于 2014-9-15 03:27 編輯 2013年國賽,您選擇哪類題目?投票拿JLink,神器增有緣人 。 活動規(guī)則: 1、2013年國賽,您選擇哪類題目? 點擊連接:https://bbs.eeworld.com.cn/thread-376433-1-1.html投票; 2、在本貼后面回 ...… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- 有獎直播 | 瑞薩新一代視覺 AI MPU 處理器 RZ/V2H:高算力、低功耗、實時控制
- 24年年終盤點來啦!精選強推:原創(chuàng)、測評、拆解、視頻、資料
- 是德科技電子書,下載有禮進行時!
- 嵌入式Rust修煉營:動手寫串口燒錄工具和MCU例程,Rust達人Hunter直播帶你入門Rust
- 【EEWORLD第三十三屆】2011年12月社區(qū)明星人物揭曉!
- Littelfuse 新品賦能電子產(chǎn)品安全可靠并高效, 10+挑戰(zhàn)等你探索!
- 有獎活動|逛安富利人工智能云會展,解鎖AI資料,贏好禮!
- 看視頻瓜分紅包:面向高效高密度開關電源的先進功率 MOSFET 技術及應用
- 6小時狂歡,誰是2016年TI杯全國大學生物聯(lián)網(wǎng)設計競賽最高人氣王,你說了算!
- 報名抽取京東卡|2021慕尼黑華南電子展觀眾注冊進行中