ARM Cortex-M3嵌入式開發及應用教與學 課件 第5、6章 按鍵與中斷處理;定時器_第1頁
ARM Cortex-M3嵌入式開發及應用教與學 課件 第5、6章 按鍵與中斷處理;定時器_第2頁
ARM Cortex-M3嵌入式開發及應用教與學 課件 第5、6章 按鍵與中斷處理;定時器_第3頁
ARM Cortex-M3嵌入式開發及應用教與學 課件 第5、6章 按鍵與中斷處理;定時器_第4頁
ARM Cortex-M3嵌入式開發及應用教與學 課件 第5、6章 按鍵與中斷處理;定時器_第5頁
已閱讀5頁,還剩88頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ARMCortex-M3嵌入式控制技術

——基于STM32F103RCT6

STM32F103硬件系統與KEILMDK工程第五章

按鍵與中斷處理

本章將介紹嵌套向量中斷控制器NVIC的工作原理,闡述STM32F103RCT6微控制器外部輸入中斷的工作原理。接著,以用戶按鍵為例,詳細解釋NVIC中斷的寄存器類型和庫函數類型的程序設計方法。然后,介紹ZLG7289B芯片驅動LED燈、按鍵和數碼管的原理和程序設計方法1NVIC中斷工作原理2GPIO外部輸入中斷3

用戶按鍵中斷實例4ZLG7289B按鍵、LED燈和數碼管5.1NVIC中斷工作原理嵌套向量中斷控制器NVIC相關的中斷管理工作主要有開放中斷、關閉中斷、設置中斷請求標志、讀中斷請求標志、清除中斷請求標志和配置中斷優先級等。嵌套向量中斷控制器NVIC的寄存器有ISER0、ISER1、ICER0、ICER1、ISPR0、ISPR1、ICPR0、ICPR1、IABR0、IABR1、IPR0~IPR14和STIRNVIC寄存器序號地址寄存器名稱描述10xE000E100ISER0中斷開放寄存器ISER0[0]~ISER0[31]、ISER1[0]~ISER1[27]依次對應中斷號為0~59的中斷,各位寫0無效,寫1開放中斷0xE000E104ISER120xE000E180ICER0中斷關閉寄存器ICER0[0]~ICER0[31]、ICER1[0]~ICER1[27]依次對應中斷號為0~59的中斷,各位寫0無效,寫1關閉中斷0xE000E184ICER130xE000E200ISPR0中斷設置請求狀態寄存器ISPR0[0]~ISPR0[31]、ISPR1[0]~ISPR1[27]依次對應中斷號為0~59的中斷,各位寫0無效,寫1請求中斷0xE000E204ISPR140xE000E280ICPR0中斷清除請求狀態寄存器ICPR0[0]~ICPR0[31]、ICPR1[0]~ICPR1[27]依次對應中斷號為0~59的中斷,各位寫0無效,寫1清中斷標志0xE000E284ICPR150xE000E300IABR0中斷活躍位寄存器(只讀)IABR0[0]~IABR0[31]、IABR1[0]~IABR1[27]依次對應中斷號為0~59的中斷,各位讀出1,表示相應中斷活躍0xE000E304IABR160xE000E400~0xE000E438IPR0~IPR14中斷優先級寄存器共有16個優先級,優先級號從0~15,優先級號0表示的優先級最高,優先級號15表示的優先級最低70xE000EF00STIR軟件觸發中斷寄存器第[8:0]位域有效,寫入0~59中的某一中斷號,則觸發相應的中斷中斷優先級配置寄存器每個IPR寄存器用于設置4個NVIC中斷的優先級,32位的IPR寄存器的4個字節的低4位均無效,只有高4位有效,故可以設置的優先級號為0~15。根據圖5-1,如果設置EXTI2中斷的優先級號為10,則需要將IPR2的第[7:4]位域設為10。當兩個中斷具有不同的優先級號時,優先級號小的中斷優先級高;當兩個中斷具有相同的優先級號時,中斷號小的中斷優先級高。異常號4~15的優先級配置寄存器可配置優先級的異常的優先級號由3個系統手柄優先級寄存器(SHPR1~3)設置,其地址依次為0xE000ED18、0xE000ED1C和0xE000ED20序號異常號異常名稱位域配置名稱寄存器14MemManage[7:0]PRI_4SHPR125BusFault[15:8]PRI_536UsageFault[23:16]PRI_647保留[31:24]PRI_758保留[7:0]PRI_8SHPR269保留[15:8]PRI_9710保留[23:16]PRI_10811SVCall[31:24]PRI_11912DebugMonitor[7:0]PRI_12SHPR31013保留[15:8]PRI_131114PendSV[23:16]PRI_141215SysTick[31:24]PRI_155.2GPIO外部輸入中斷根據寄存器AFIO_EXTICR1~4(見第4章表4-3),可從GPIO口中選擇16個管腳配置為16個外部中斷的輸入端,如圖5-2所示。注意:對于STM32F103RCT6芯片,只有PA、PB、PC和PD[2:0]有效,其余管腳無效。EXTI模塊共有19根線路,除了外部中斷EXTI0~EXTI15外,還有EXTI16、EXTI17和EXTI18,這三根線路分別與PVD輸出、RTC報警事件和USB喚配事件相連接。EXTI模塊有共6個寄存器,即中斷屏蔽寄存器EXTI_IMR、事件屏蔽寄存器EXTI_EMR、上升沿觸發選擇寄存器EXTI_RTSR、下降沿觸發選擇寄存器EXTI_FTSR、軟件觸發事件寄存器EXTI_SWIER和中斷請求寄存器EXTI_PR。EXTI模塊寄存器的基地址為0x40010400。5.3用戶按鍵中斷實例STM32F103RCT6微控制器的PA6和PA7依次借助網絡標號USER_BUT1和USER_BUT2與按鍵S18和S19相連接;PB1與網絡標號USER_BELL相連接,控制蜂鳴器B2的開啟與關閉。本節擬設計工程,實現如下功能:(1)S18按鍵作為外部中斷EXTI6輸入端,當按下S18按鍵時,點亮LED燈D11;(2)S19按鍵作為外部中斷EXTI7輸入端,當按下S19按鍵時,熄滅LED燈D11。同時,如果蜂鳴器原來是開啟的,則關閉蜂鳴器;否則,開啟蜂鳴器。5.3.1寄存器類型工程實例在工程PRJ01的基礎上,新建工程“PRJ03”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ03”下,此時的工程PRJ03與工程PRJ01完全相同。現在,修改main.c和includes.h文件,并新建bsp.c、bsp.h、beep.c、beep.h、key.c、key.h、exti.c和exti.h文件(新建的文件均保存在目錄“D:\STM32F103RCT6PRJ\PRJ03\BSP”下),然后,將bsp.c、beep.c、key.c和exti.c文件添加到“BSP”分組下,建設好的工程如圖所示。代碼:11代碼:12代碼:13工程PRJ03的工作流程工程PRJ03運行到主函數main后,執行BSPInit函數初始化LED燈、按鍵、蜂鳴器和外部中斷等外設,然后進行無限循環體,執行LED燈D9和D10的循環閃爍功能。工程PRJ03中有1個中斷服務函數,當按鍵S18被按下時,執行EXTI9_5_IRQHandler中斷服務函數,點亮LED燈D11;當按鍵S19被按下時,也觸發執行EXTI9_5_IRQHandler中斷服務函數,熄滅LED燈D11,同時,使蜂鳴器切換工作狀態5.3.2庫函數類型工程實例本小節討論的工程與第5.3.1節的工程PRJ03實現的功能完全相同,這里使用庫函數方式進行工程設計。在工程PRJ02的基礎上,新建工程“PRJ04”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ04”下,此時的工程PRJ04與工程PRJ02完全相同,需要做的修改為:(1)修改文件main.c和includes.h;(2)新建文件bsp.c、bsp.h、key.c、key.h、beep.c、beep.h、exti.c和exti.h,新建的文件均保存在目錄“D:\STM32F103RCT6PRJ\PRJ04\BSP”下;(3)將bsp.c、key.c、beep.c和exti.c文件添加到工程管理器的“BSP”分組下;(4)將位于目錄“D:\STM32F103RCT6PRJ\PRJ04\STM32F10x_FWLib\src”下的庫文件stm32f10x_exti.c添加到工程管理器的“LIB”分組下。建設好的工程PRJ04如圖所示。代碼:16代碼:17代碼:185.4.1ZLG7289B工作原理嵌入式控制系統中最常用的部件是按鍵和七段數碼管,用作系統的輸入設備和輸出設備,ZLG7289B為專用于驅動按鍵和數碼管的芯片。一片ZLG7289B可同時驅動64個按鍵和8個七段數碼管(即64個LED燈)。STM32F103RCT6學習板上集成了一片ZLG7289B芯片,驅動了16個按鍵、8個LED燈和一個四合一七段數碼管,電路原理圖參考第3.8節。ZLG7289B芯片管腳布局如圖所示“數碼管段選信號”是指用于驅動七段數碼管中的某個段的控制信號,一般連接到數碼管的8個段控制管腳的某一腳上(8個段控制管腳為a、b、c、d、e、f、g和小數點dp);“數碼管字選信號”也常被稱為“數碼管位選信號”,是指用于驅動多合一數碼管中單個數碼管的控制信號,一般連接到數碼管的公共有效端,由于ZLG7289B只能驅動共陰式數碼管,所以數碼管字選信號連接到單個數碼管的陰極公共端管腳號管腳名作用1RTCC電源,一般直接與VCC相連2VCC電源,2.7~6V3NC懸空4GND接地5NC懸空6CS片選信號,低電平有效,輸入7CLK串行數據位時鐘信號,下降沿有效,輸入8DIO串行數據輸入輸出口,雙向9INT按鍵中斷請求信號,下降沿有效,輸出10~17KR0~KR7鍵盤行信號0~7,同時也用作數碼管段選信號,依次為g、f、e、d、c、b、a和dp18~25KC0~KC7鍵盤列信號0~7,同時也用作數碼管字選信號0~726OSC2晶振輸出信號27OSC1晶振輸入信號28RST復位信號,低有效ZLG7289B訪問時序。(a)為STM32F103RCT6向ZLG7289B寫入單字節指令;(b)為STM32F103RCT6向ZLG7289B寫入單字節指令+單字節數據;(c)為STM32F103RCT6向ZLG7289B寫入單字節指令(0x15),然后讀出單字節按鍵值,這里第一個指令字節必須為0x15七段數碼管各個段的顯示位置序號指令字節數據字節含義10xA4無清除顯示內容20xBF無使全部LED燈閃爍30xA0無數碼管顯示左移40xA1無數碼管顯示右移50xA2無數碼管顯示循環左移60xA3無數碼管顯示循環右移70x80+k(dp<<7)|(d3d2d1d0)k為數碼管位置號,取0~7(在圖3-12中僅有4個數碼管,即網標DIG0對應著0,DIG1對應著1,DIG2對應著2,DIG3對應3);dp=0表示小數點熄滅,dp=1表示小數點點亮;d3d2d1d0四位為0000b~1001b對應著顯示0~9,為1010b顯示“-”為1011b~1110b分別顯示E、H、L和P,為1111b無顯示80xC8+k(dp<<7)|(d3d2d1d0)k和dp的含義同上,d3d2d1d0為0000b~1111b時分別對應著顯示0~9、A、B、C、D、E和F90x90+k(dp<<7)|(abcdefg)k和dp的含義同上,a、b、c、d、e、f、g對應著數碼管的各段,為1時亮,為0時滅100x88d7d6d5d4d3d2d1d0di對應著第i個數碼管,為0時閃爍,為1時不閃爍110x98d7d6d5d4d3d2d1d0di對應著第i個數碼管,為1時正常顯示,為0時消隱120xE000d5d4d3d2d1d0將數碼管視為64個LED燈,d5d4d3d2d1d0表示6位地址,從000000b~111111b,表示64個LED燈的地址,每個數碼管內,點亮順度為“g、f、e、d、c、b、a、dp”,地址000000b對應著KR0和KC0相交的LED燈,000001b對應著KR1和KC0相交的LED燈,依此類推130xC000d5d4d3d2d1d0第12條指令為段點亮指令,這里為段熄滅指令,數據字節的含義同上140x15讀出單字節數據讀出的單字節數據包含按鍵值,鍵碼從0~63(0x00~0x3F),無效值為0xFF,鍵碼0對應著KC0與KR0相交的按鍵,鍵碼1對應著KC0與KR1相交的按鍵,依此類推鍵名鍵碼鍵名鍵碼鍵名鍵碼鍵名鍵碼S162S558S954S1350S261S657S1053S1449S360S756S1152S1548S459S863S1251S1655ZLG7289B驅動的按鍵鍵碼5.4.2寄存器類型工程實例本節將創建工程PRJ05,其在工程PRJ03基礎上新添加的功能為:(1)四合一數碼管每個顯示管均周期性從0顯示至9,且顯示小數點和時間分隔符;(2)按下按鍵S1至S8中的Si(i=1,2,…,8)將點亮相應的LED燈Di;(3)按下按鍵S9至S16中的Si(i=9,10,…,16)將熄滅相應的LED燈Di-8。在工程PRJ03的基礎上,新建工程“PRJ05”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ05”下,此時的工程PRJ05與工程PRJ03完全相同。現在,修改main.c、includes.h、bap.c文件,并新建zlg7289.c和zlg7289.h文件(新建的文件均保存在目錄“D:\STM32F103RCT6PRJ\PRJ05\BSP”下),然后,將zlg7289.c文件添加到“BSP”分組下,建設好的工程如圖所示。5.4.2寄存器類型工程實例本節將創建工程PRJ05,其在工程PRJ03基礎上新添加的功能為:(1)四合一數碼管每個顯示管均周期性從0顯示至9,且顯示小數點和時間分隔符;(2)按下按鍵S1至S8中的Si(i=1,2,…,8)將點亮相應的LED燈Di;(3)按下按鍵S9至S16中的Si(i=9,10,…,16)將熄滅相應的LED燈Di-8。在工程PRJ03的基礎上,新建工程“PRJ05”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ05”下,此時的工程PRJ05與工程PRJ03完全相同。現在,修改main.c、includes.h、bap.c文件,并新建zlg7289.c和zlg7289.h文件(新建的文件均保存在目錄“D:\STM32F103RCT6PRJ\PRJ05\BSP”下),然后,將zlg7289.c文件添加到“BSP”分組下,建設好的工程如圖所示。代碼:26代碼:27代碼:28代碼:29代碼:30代碼:31代碼:325.4.2庫函數類型工程實例本小節將要討論的工程PRJ06與第5.4.2節的工程PRJ05實現的功能完全相同,這里使用庫函數方式進行工程設計。需要強調指出的是,寄存器類型工程與庫函數類型工程不是對立的,一個工程文件,既可以包含寄存器類型的代碼,也可以包含庫函數類型的代碼。在工程PRJ04的基礎上,新建工程“PRJ06”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ06”下,此時的工程PRJ06與工程PRJ04完全相同,需要做的修改為:(1)修改文件main.c、includes.h和bsp.c;(2)新建文件zlg7289.c和zlg7289.h文件,新建的文件均保存在目錄“D:\STM32F103RCT6PRJ\PRJ06\BSP”下;(3)將zlg7289.c文件添加到工程管理器的“BSP”分組下。建設好的工程PRJ06如圖所示。代碼:34代碼:35代碼:36代碼:37代碼:38thankyou第六章

定時器目錄系統節拍定時器看門狗定時器實時時鐘通用定時器本章小結本章將介紹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,但

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論