




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第六章
定時器目錄系統節拍定時器看門狗定時器實時時鐘通用定時器本章小結本章將介紹STM32F103RCT6片內定時器的結構和用法,按照從簡單到復雜的順序依次介紹系統節拍定時器、看門狗定時器、實時時鐘和通用定時器,其中,系統節拍定時器是Cortex-M3內核的定時器組件,主要用于為嵌入式實時操作系統提供時鐘節拍(一般取為100Hz)。STM32F103RCT6具有8個定時器,其中定時器1和定時器8為高級定時器、定時器2~5為通用定時器、定時器6和定時器7稱為基本定時器,本章將主要介紹通用定時器,且以定時器2為例。16.1系統節拍定時器23系統節拍定時器SysTick屬于Cortex-M3內核的組件,是一個24位的減計數器,常用于產生100Hz的定時中斷(即系統節拍定時器異常),用作嵌入式實時操作系統μC/OS-II等的時鐘節拍,系統節拍定時器的結構如下圖所示。系統節拍定時器工作原理4了解STCTRL、STRELOAD、STCURR和STCALIB這4個寄存器的內容,即可掌握系統節拍定時器的工作原理。這4個寄存器的內容如下表所示。系統節拍定時器工作原理5根據上述對系統節拍定時器的分析,可知設計一個定時頻率為100Hz(即定時周期為10ms)的系統時鐘節拍定時器,可采用以下語句;(1)配置STCTRL為(1uL<<1)|(1uL<<2),即關閉系統節拍定時器并開放系統節拍定時器中斷,同時設置系統時鐘為系統節拍定時器時鐘源。此時對于STM32F103RCT6微控制器使用內部8MHz時鐘源而言,系統時鐘為64MHz,芯片手冊上明確說明:將系統時鐘經AHB預分頻器后的32MHz信號的8分頻值用作系統節拍定時器的輸入時鐘信號(見圖2-3),但實際測試發現,系統節拍定時器的輸入時鐘信號仍然是32MHz,即沒有所謂的8分頻器。(2)向STCURR寄存器寫入任意值,例如寫入0,清除STCURR的值,同時清除STCTRL的COUNTFLAG標志;(3)向STRELOAD寄存器寫入320000-1,即十六進制數0x4E1FF。(4)配置STCTRL的第0位為1(其余位保持不變),啟動系統節拍定時器。系統節拍定時器工作原理6系統節拍定時器相關的寄存器定義在CMSIS庫頭文件core_cm3.h中,如下面的程序段所示。系統節拍定時器工作原理7在CMSIS庫頭文件core_cm3.h中還定義了一個初始化系統節拍定時器的函數,如下面的程序段所示。系統節拍定時器工作原理8系統節拍定時器異常一般用作嵌入式實時操作系統的時鐘節拍,也可以用作普通的定時中斷處理。這里使用系統節拍定時器實現LED1燈D9的閃爍功能,其寄存器類型的工程實現步驟如下:(1)在工程PRJ05的基礎上,新建工程“PRJ07”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ07”下,此時的工程PRJ07與工程PRJ05完全相同。(2)新建文件systick.c和systick.h,這兩個文件保存在目錄“D:\STM32F103RCT6PRJ\PRJ07\BSP”下,其代碼分別如下面的程序段所示。系統節拍定時器實例9系統節拍定時器實例10系統節拍定時器實例11系統節拍定時器實例12將systick.c文件添加到工程管理器的BSP分組下,建設好的工程PRJ07如下圖所示。系統節拍定時器實例13由圖可知,在工程PRJ07中,主函數main主要完成了系統的外設初始化工作,同時,工程PRJ07保留了工程PRJ05中的全部功能,并添加了系統節拍定時器功能。由于配置了系統節拍定時器的工作頻率為100Hz,所以,定時異常每觸發100次相當于延時準確的1秒。通過添加靜態計數變量,使得系統節拍定時器異常服務函數實現了每隔1秒使LED燈D9狀態切換一次的功能。系統節拍定時器實例14系統節拍定時器的庫函數類型工程的建設過程為:在工程PRJ06的基礎上,新建工程PRJ08,保存在保存在目錄“D:\STM32F103RCT6PRJ\PRJ08”下,此時的工程PRJ08與工程PRJ06完全相同,需要做的修改為:(1)修改文件main.c、includes.h和bsp.c;(2)新建文件systick.c和systick.h,如程序段6-3和程序段6-4所示,保存在目錄“D:\STM32F103RCT6PRJ\PRJ07\BSP”下,并將文件systick.c添加到工程管理器的BSP分組下。系統節拍定時器實例6.2看門狗定時器1516STM32F103RCT6微控制中有兩個看門狗,即獨立看門狗和窗口看門狗。本書僅介紹復雜一些的窗口看門狗。看門狗定時器工作原理17在本小節中,擬把看門狗定時器WWDG用作普通的定時器,實現每隔約1秒LED燈D10閃爍的功能。在工程07的基礎上,新建工程09,保存在目錄“D:\STM32F103RCT6PRJ\PRJ09”下,此時的工程PRJ09與工程PRJ07完全相同。然后,執行以下的步驟:(1)修改main.c文件,使得main函數不再控制LED燈的閃爍。(2)新建文件wwdog.c和wwdog.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ09\BSP”下。看門狗定時器寄存器類型實例18看門狗定時器寄存器類型實例19文件wwdog.h是文件wwdog.c對應的頭文件,用于聲明wwdog.c中定義的函數,這里第6行聲明了WWDOGInit函數。看門狗定時器寄存器類型實例(3)在includes.h文件的末尾添加語句“#include"wwdog.h"”,即在總的包括頭文件中包括文件wwdog.h。20(4)在bsp.c文件的BSPInit函數中,添加對函數WWDOGInit的調用,如下面的程序段所示。看門狗定時器寄存器類型實例21(5)將wwdog.c文件添加到工程管理器的“BSP”分組下。完成后的工程PRJ09如下圖所示。看門狗定時器寄存器類型實例22在工程PRJ08的基礎上,新建工程“PRJ10”,保存在“D:\STM32F103RCT6PRJ\PRJ10”目錄下,此時的工程PRJ10與工程PRJ08完全相同。然后,進行如下的步驟:(1)新建文件wwdog.c和wwdog.h。這兩個文件保存在目錄“D:\STM32F103RCT6PRJ\PRJ10\BSP”下。看門狗定時器庫函數類型實例23看門狗定時器庫函數類型實例對比前面wwdog.c文件程序段中的看門狗中斷服務函數WWDG_IRQHandler,這里的第22行為喂狗,即設置看門狗計數器的值為0x72;第33行調用WWDG_ClearFlag清零看門狗中斷標志。24(2)修改main.c文件,在前一個工程段代碼的基礎上,刪除第13~15行,即main函數不再控制LED燈的閃爍。(3)在includes.h文件的末尾,添加語句“#include"wwdog.h"”,即在總的包括頭文件中包括頭文件wwdog.h。(4)修改bsp.c文件,在bsp.c文件中的BSPInit函數中,添加語句“WWDOGInit();”,用于初始化窗口看門狗定時器。(5)添加目錄“D:\STM32F103RCT6PRJ\PRJ10\STM32F10x_FWLib\src”下的文件stm32f10x_wwdg.c到工程管理器的“LIB”分組下;添加新創建的文件wwdog.c(保存在目錄“D:\STM32F103RCT6PRJ\PRJ10\BSP”下)到工程管理器的“BSP”分組下。看門狗定時器庫函數類型實例6.3實時時鐘2526STM32F103RCT6微控制器的實時時鐘結構如下圖所示。實時時鐘工作原理27下面詳細介紹RTC模塊的各個寄存器,RTC模塊的基地址為0x40002800。(1)RTC控制寄存器RTC_CRHRTC_CRH(偏移地址0x0,復位值為0x0)是一個16位的寄存器,只有第[2:0]位有效,第2位為OWIE,為1表示開啟溢出中斷;第1位為ALRIE,為1表示開啟報警中斷;第0位為SECIE,為1表示開啟秒表中斷。(2)RTC控制寄存器RTC_CRLRTC_CRL(偏移地址0x04,復位值為0x0020)是一個16位的寄存器,只有第[5:0]位有效。第5位為只讀的RTOFF位,讀出0表示寫RTC寄存器正處理中,讀出1表示寫RTC寄存器操作已完成;第4位為CNF位,寫入1表示進入配置模式,寫入0表示退出配置模式;第3位為RSF位,當RTC各個寄存器同步后硬件置1,可軟件方式寫入0清零;第2位為溢出中斷標志位OWF,為1表示溢出中斷發生了,寫入0清零;第1位為報警中斷標志位ALRF,為1表示報警中斷發生了,寫入0清零;第0位為秒中斷標志位SECF,為1表示秒中斷發生了,寫入0清零。實時時鐘工作原理28(3)RTC預裝值寄存器RTC_PRLH和RTC_PRLLRTC_PRLH和RTC_PRLL(偏移地址為0x08和0x0C,復位值為0x0和0x8000)是兩個16位的寄存器,RTC_PRLH的高14位保留,RTC_PRLH的第[3:0]位(作為PRL[19:16])與RTC_PRLL的第[15:0]位(作為PRL[15:0])組合成PRL[19:0],結合圖6-6,TR_CLK=RTCCLK/(PRL[19:0]+1)。(4)RTC預分頻器寄存器RTC_DIVH和RTC_DIVLRTC_DIVH和RTC_DIVL(偏移地址為0x10和0x14,復位值為0x0和0x8000)是兩個只讀的16位的計數器,其減計數到0后,RTC_PRLH和RTC_PRLL中的預裝值將自動裝入RTC_DIVH和RTC_DIVL中。實時時鐘工作原理29(5)RTC計數器寄存器RTC_CNTH和RTC_CNTLRTC_CNTH和RTC_CNTL(偏移地址為0x18和0x1C,復位值均為0x0)是兩個可讀/可寫的16位寄存器,用于保存RTC模塊的時間和日歷值。(6)RTC報警器寄存器RTC_ALRH和RTC_ALRLRTC_ALRH和RTC_ALRL(偏移地址為0x20和0x24,復位值均為0xFFFF)是兩個只寫的16位寄存器,用于保存RTC模塊報警時的時間和日歷值。當RTC計數器寄存器RTC_CNTH和RTC_CNTL的值分別與RTC_ALRH和RTC_ALRL的值相等時,產生RTC報警中斷。實時時鐘工作原理30在工程PRJ09的基礎上,新建工程“PRJ11”,保存在“D:\STM32F103RCT6PRJ\PRJ11”目錄下,此時的工程PRJ11與工程PRJ09完全相同。然后,進行如下的步驟:(1)修改文件main.c,如右面程序段所示,即在主函數的無限循環體中,不做具體的處理工作。實時時鐘寄存器類型實例31(2)新建文件rtc.c和rtc.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ11\BSP”下,這兩個文件的內容如下面的程序段所示。實時時鐘寄存器類型實例32實時時鐘寄存器類型實例33(3)在includes.h文件的末尾添加語句“#include"rtc.h"”,即包括頭文件rtc.h。(4)在bsp.c文件的BSPInit函數中,添加語句“RTCInit();”,如程序段6-15所示。實時時鐘寄存器類型實例34(5)將rtc.c文件添加到工程管理器的“BSP”分組下。建設好的工程PRJ11如下圖所示。實時時鐘寄存器類型實例35本小節中使用庫函數實現rtc.c文件中的全部功能,具體步聚如下:(1)在工程PRJ10的基礎上,新建工程“PRJ12”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ12”下。此時的工程PRJ12與工程PRJ10完全相同。(2)修改文件main.c,主函數的無限循環體為空。(3)新建rtc.c和rtc.h文件,保存在目錄“D:\STM32F103RCT6PRJ\PRJ12\BSP”下。實時時鐘庫函數類型實例36實時時鐘庫函數類型實例37實時時鐘庫函數類型實例(4)修改bsp.c文件,如程序段6-15所示,即添加對RTC初始化函數的調用語句。(5)在includes.h文件的末尾添加“#include"rtc.h"”,即包括頭文件rtc.h。將rtc.c文件添加到工程管理器的“BSP”分組下,將目錄“D:\STM32F103RCT6PRJ\PRJ12\STM32F10x_FWLib\src”下的文件stm32f10x_rtc.c、stm32f10x_pwr.c和stm32f10x_bkp.c添加到工程管理器的“LIB”分組下。工程PRJ12實現的功能與工程PRJ11完全相同,所使用的庫函數可以在相應的庫函數源文件或頭文件中查閱。6.4通用定時器3839STM32F103RCT6具有8個定時器,其中,TIM1和TIM8為高級控制定時器,TIM2~TIM5為通用定時器,TIM6和TIM7為基本定時器。相對于傳統的80C51單片機的定時器而言,STM32F103RCT6的定時器功能更加完善和復雜。這里以TIM2為例介紹通用定時器的基本用法。通用定時器40STM32F103RCT6微控制器具有4個通用定時器TIM2~TIM5,它們的結構和工作原理相同。這里以通用定時器TIM2為例介紹通用定時器的工作原理,TIM2的結構如下圖所示。通用定時器工作原理41(1)TIM2控制寄存器TIM2_CR1(偏移地址0x0,復位值0x0)TIM2_CR1寄存器是一個16位的可讀/可寫寄存器,如下表所示。通用定時器工作原理42通用定時器工作原理(2)TIM2定時器計數器寄存器TIM2_CNT(偏移地址0x24,復位值0x0)TIM2_CNT寄存器是一個16位的可讀/可寫寄存器,保存了定時器的當前計數值。(3)TIM2定時器預分頻器寄存器TIM2_PSC(偏移地址0x28,復位值0x0)TIM2_PSC寄存器是一個16位的可讀/可寫寄存器,TIM2計數器的計數頻率=定時器時鐘源頻率/(TIM2_PSC+1)。如果采用32MHz的APB1總線時鐘作為TIM2時鐘源(理論分析應該為16MHz,但實測是32MHz),設置TIM2_PSC=32000-1,則TIM2計數器計數頻率為1kHz。43通用定時器工作原理(4)TIM2自動重裝寄存器TIM2_ARR(偏移地址0x2C,復位值0x0)如果TIM2設為加計數方式,則計數值從0計數到TIM2_ARR的值時,溢出而產生中斷。如果計數頻率為1kHz,設定TIM2_ARR為1000-1,則TIM2定時中斷的頻率為1Hz。(5)TIM2定時器狀態寄存器TIM2_SR(偏移地址0x10,復位值0x0)TIM2_SR寄存器的第0位為UIF位,當發生定時中斷時,UIF位自動置1,向其寫入0清零該位。(6)TIM2定時器有效寄存器TIM2_DIER(偏移地址0x0C,復位值0x0)TIM2_DIER寄存器的第0位為UIE位,寫入1開放定時器更新中斷,寫入0關閉定時器更新中斷。44本小節使用通用定時器TIM2實現數碼管計數顯示的功能,具體實現步驟如下所示:(1)在工程PRJ11的基礎上,新建工程“PRJ13”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ13”下。此時的工程PRJ13與工程PRJ11完全相同。(2)新建文件tim2.c和tim2.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ13\BSP”下,其代碼如下面的程序段所示。通用定時器寄存器類型實例45(3)在includes.h文件的末尾添加“#include"tim2.h"”語句,即包括頭文件tim2.h。(4)修改bsp.c文件,如右面的程序段所示。通用定時器寄存器類型實例46(5)將文件tim2.c添加到工程管理器的“BSP”分組下。完成后的工程PRJ13如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧中醫藥大學杏林學院《計算復雜性》2023-2024學年第二學期期末試卷
- 湘南學院《大學體育V》2023-2024學年第一學期期末試卷
- 沙洲職業工學院《版面設計與軟件應用》2023-2024學年第二學期期末試卷
- 江蘇省鹽城市大豐區實驗初級中學2024-2025學年初三下期4月月考復習語文試題試卷含解析
- 江門市重點中學2025年初三沖刺中考最后1卷化學試題含解析
- 武漢華夏理工學院《市場營銷學原理》2023-2024學年第二學期期末試卷
- 麗江職業技術學院《英語基礎寫作(二)》2023-2024學年第一學期期末試卷
- 內蒙古鴻德文理學院《車橋耦合振動》2023-2024學年第二學期期末試卷
- 羊只買賣合同范本
- 長沙理工大學城南學院《英語精讀(3)》2023-2024學年第一學期期末試卷
- 浙江省2025年1月首考高考英語試卷試題真題(含答案)
- 川教版(2024)小學信息技術三年級上冊《跨學科主題活動-在線健康小達人》教學實錄
- 2025中考物理總復習填空題練習100題(附答案及解析)
- 機械專業英語
- 高空作業車(剪叉式、曲臂式)驗收表
- 廣東省廣州市2024屆高三下學期一模考試 政治 含解析
- 血透患者敘事護理故事
- 義務教育小學科學課程標準-2022版
- 江西省南昌市2023-2024學年八年級下學期期中英語試題(含聽力)【含答案解析】
- 2024年全國國家版圖知識競賽題庫及答案
- 新教師三筆字培訓課件
評論
0/150
提交評論