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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

ARMCortex-M3嵌入式控制技術(shù)

——基于STM32F103RCT6

STM32F103硬件系統(tǒng)與KEILMDK工程第五章

按鍵與中斷處理

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

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

定時器目錄系統(tǒng)節(jié)拍定時器看門狗定時器實時時鐘通用定時器本章小結(jié)本章將介紹STM32F103RCT6片內(nèi)定時器的結(jié)構(gòu)和用法,按照從簡單到復(fù)雜的順序依次介紹系統(tǒng)節(jié)拍定時器、看門狗定時器、實時時鐘和通用定時器,其中,系統(tǒng)節(jié)拍定時器是Cortex-M3內(nèi)核的定時器組件,主要用于為嵌入式實時操作系統(tǒng)提供時鐘節(jié)拍(一般取為100Hz)。STM32F103RCT6具有8個定時器,其中定時器1和定時器8為高級定時器、定時器2~5為通用定時器、定時器6和定時器7稱為基本定時器,本章將主要介紹通用定時器,且以定時器2為例。16.1系統(tǒng)節(jié)拍定時器23系統(tǒng)節(jié)拍定時器SysTick屬于Cortex-M3內(nèi)核的組件,是一個24位的減計數(shù)器,常用于產(chǎn)生100Hz的定時中斷(即系統(tǒng)節(jié)拍定時器異常),用作嵌入式實時操作系統(tǒng)μC/OS-II等的時鐘節(jié)拍,系統(tǒng)節(jié)拍定時器的結(jié)構(gòu)如下圖所示。系統(tǒng)節(jié)拍定時器工作原理4了解STCTRL、STRELOAD、STCURR和STCALIB這4個寄存器的內(nèi)容,即可掌握系統(tǒng)節(jié)拍定時器的工作原理。這4個寄存器的內(nèi)容如下表所示。系統(tǒng)節(jié)拍定時器工作原理5根據(jù)上述對系統(tǒng)節(jié)拍定時器的分析,可知設(shè)計一個定時頻率為100Hz(即定時周期為10ms)的系統(tǒng)時鐘節(jié)拍定時器,可采用以下語句;(1)配置STCTRL為(1uL<<1)|(1uL<<2),即關(guān)閉系統(tǒng)節(jié)拍定時器并開放系統(tǒng)節(jié)拍定時器中斷,同時設(shè)置系統(tǒng)時鐘為系統(tǒng)節(jié)拍定時器時鐘源。此時對于STM32F103RCT6微控制器使用內(nèi)部8MHz時鐘源而言,系統(tǒng)時鐘為64MHz,芯片手冊上明確說明:將系統(tǒng)時鐘經(jīng)AHB預(yù)分頻器后的32MHz信號的8分頻值用作系統(tǒng)節(jié)拍定時器的輸入時鐘信號(見圖2-3),但實際測試發(fā)現(xiàn),系統(tǒng)節(jié)拍定時器的輸入時鐘信號仍然是32MHz,即沒有所謂的8分頻器。(2)向STCURR寄存器寫入任意值,例如寫入0,清除STCURR的值,同時清除STCTRL的COUNTFLAG標(biāo)志;(3)向STRELOAD寄存器寫入320000-1,即十六進(jìn)制數(shù)0x4E1FF。(4)配置STCTRL的第0位為1(其余位保持不變),啟動系統(tǒng)節(jié)拍定時器。系統(tǒng)節(jié)拍定時器工作原理6系統(tǒng)節(jié)拍定時器相關(guān)的寄存器定義在CMSIS庫頭文件core_cm3.h中,如下面的程序段所示。系統(tǒng)節(jié)拍定時器工作原理7在CMSIS庫頭文件core_cm3.h中還定義了一個初始化系統(tǒng)節(jié)拍定時器的函數(shù),如下面的程序段所示。系統(tǒng)節(jié)拍定時器工作原理8系統(tǒng)節(jié)拍定時器異常一般用作嵌入式實時操作系統(tǒng)的時鐘節(jié)拍,也可以用作普通的定時中斷處理。這里使用系統(tǒng)節(jié)拍定時器實現(xiàn)LED1燈D9的閃爍功能,其寄存器類型的工程實現(xiàn)步驟如下:(1)在工程PRJ05的基礎(chǔ)上,新建工程“PRJ07”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ07”下,此時的工程PRJ07與工程PRJ05完全相同。(2)新建文件systick.c和systick.h,這兩個文件保存在目錄“D:\STM32F103RCT6PRJ\PRJ07\BSP”下,其代碼分別如下面的程序段所示。系統(tǒng)節(jié)拍定時器實例9系統(tǒng)節(jié)拍定時器實例10系統(tǒng)節(jié)拍定時器實例11系統(tǒng)節(jié)拍定時器實例12將systick.c文件添加到工程管理器的BSP分組下,建設(shè)好的工程PRJ07如下圖所示。系統(tǒng)節(jié)拍定時器實例13由圖可知,在工程PRJ07中,主函數(shù)main主要完成了系統(tǒng)的外設(shè)初始化工作,同時,工程PRJ07保留了工程PRJ05中的全部功能,并添加了系統(tǒng)節(jié)拍定時器功能。由于配置了系統(tǒng)節(jié)拍定時器的工作頻率為100Hz,所以,定時異常每觸發(fā)100次相當(dāng)于延時準(zhǔn)確的1秒。通過添加靜態(tài)計數(shù)變量,使得系統(tǒng)節(jié)拍定時器異常服務(wù)函數(shù)實現(xiàn)了每隔1秒使LED燈D9狀態(tài)切換一次的功能。系統(tǒng)節(jié)拍定時器實例14系統(tǒng)節(jié)拍定時器的庫函數(shù)類型工程的建設(shè)過程為:在工程PRJ06的基礎(chǔ)上,新建工程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分組下。系統(tǒng)節(jié)拍定時器實例6.2看門狗定時器1516STM32F103RCT6微控制中有兩個看門狗,即獨立看門狗和窗口看門狗。本書僅介紹復(fù)雜一些的窗口看門狗。看門狗定時器工作原理17在本小節(jié)中,擬把看門狗定時器WWDG用作普通的定時器,實現(xiàn)每隔約1秒LED燈D10閃爍的功能。在工程07的基礎(chǔ)上,新建工程09,保存在目錄“D:\STM32F103RCT6PRJ\PRJ09”下,此時的工程PRJ09與工程PRJ07完全相同。然后,執(zhí)行以下的步驟:(1)修改main.c文件,使得main函數(shù)不再控制LED燈的閃爍。(2)新建文件wwdog.c和wwdog.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ09\BSP”下??撮T狗定時器寄存器類型實例18看門狗定時器寄存器類型實例19文件wwdog.h是文件wwdog.c對應(yīng)的頭文件,用于聲明wwdog.c中定義的函數(shù),這里第6行聲明了WWDOGInit函數(shù)??撮T狗定時器寄存器類型實例(3)在includes.h文件的末尾添加語句“#include"wwdog.h"”,即在總的包括頭文件中包括文件wwdog.h。20(4)在bsp.c文件的BSPInit函數(shù)中,添加對函數(shù)WWDOGInit的調(diào)用,如下面的程序段所示??撮T狗定時器寄存器類型實例21(5)將wwdog.c文件添加到工程管理器的“BSP”分組下。完成后的工程PRJ09如下圖所示??撮T狗定時器寄存器類型實例22在工程PRJ08的基礎(chǔ)上,新建工程“PRJ10”,保存在“D:\STM32F103RCT6PRJ\PRJ10”目錄下,此時的工程PRJ10與工程PRJ08完全相同。然后,進(jìn)行如下的步驟:(1)新建文件wwdog.c和wwdog.h。這兩個文件保存在目錄“D:\STM32F103RCT6PRJ\PRJ10\BSP”下。看門狗定時器庫函數(shù)類型實例23看門狗定時器庫函數(shù)類型實例對比前面wwdog.c文件程序段中的看門狗中斷服務(wù)函數(shù)WWDG_IRQHandler,這里的第22行為喂狗,即設(shè)置看門狗計數(shù)器的值為0x72;第33行調(diào)用WWDG_ClearFlag清零看門狗中斷標(biāo)志。24(2)修改main.c文件,在前一個工程段代碼的基礎(chǔ)上,刪除第13~15行,即main函數(shù)不再控制LED燈的閃爍。(3)在includes.h文件的末尾,添加語句“#include"wwdog.h"”,即在總的包括頭文件中包括頭文件wwdog.h。(4)修改bsp.c文件,在bsp.c文件中的BSPInit函數(shù)中,添加語句“WWDOGInit();”,用于初始化窗口看門狗定時器。(5)添加目錄“D:\STM32F103RCT6PRJ\PRJ10\STM32F10x_FWLib\src”下的文件stm32f10x_wwdg.c到工程管理器的“LIB”分組下;添加新創(chuàng)建的文件wwdog.c(保存在目錄“D:\STM32F103RCT6PRJ\PRJ10\BSP”下)到工程管理器的“BSP”分組下??撮T狗定時器庫函數(shù)類型實例6.3實時時鐘2526STM32F103RCT6微控制器的實時時鐘結(jié)構(gòu)如下圖所示。實時時鐘工作原理27下面詳細(xì)介紹RTC模塊的各個寄存器,RTC模塊的基地址為0x40002800。(1)RTC控制寄存器RTC_CRHRTC_CRH(偏移地址0x0,復(fù)位值為0x0)是一個16位的寄存器,只有第[2:0]位有效,第2位為OWIE,為1表示開啟溢出中斷;第1位為ALRIE,為1表示開啟報警中斷;第0位為SECIE,為1表示開啟秒表中斷。(2)RTC控制寄存器RTC_CRLRTC_CRL(偏移地址0x04,復(fù)位值為0x0020)是一個16位的寄存器,只有第[5:0]位有效。第5位為只讀的RTOFF位,讀出0表示寫RTC寄存器正處理中,讀出1表示寫RTC寄存器操作已完成;第4位為CNF位,寫入1表示進(jìn)入配置模式,寫入0表示退出配置模式;第3位為RSF位,當(dāng)RTC各個寄存器同步后硬件置1,可軟件方式寫入0清零;第2位為溢出中斷標(biāo)志位OWF,為1表示溢出中斷發(fā)生了,寫入0清零;第1位為報警中斷標(biāo)志位ALRF,為1表示報警中斷發(fā)生了,寫入0清零;第0位為秒中斷標(biāo)志位SECF,為1表示秒中斷發(fā)生了,寫入0清零。實時時鐘工作原理28(3)RTC預(yù)裝值寄存器RTC_PRLH和RTC_PRLLRTC_PRLH和RTC_PRLL(偏移地址為0x08和0x0C,復(fù)位值為0x0和0x8000)是兩個16位的寄存器,RTC_PRLH的高14位保留,RTC_PRLH的第[3:0]位(作為PRL[19:16])與RTC_PRLL的第[15:0]位(作為PRL[15:0])組合成PRL[19:0],結(jié)合圖6-6,TR_CLK=RTCCLK/(PRL[19:0]+1)。(4)RTC預(yù)分頻器寄存器RTC_DIVH和RTC_DIVLRTC_DIVH和RTC_DIVL(偏移地址為0x10和0x14,復(fù)位值為0x0和0x8000)是兩個只讀的16位的計數(shù)器,其減計數(shù)到0后,RTC_PRLH和RTC_PRLL中的預(yù)裝值將自動裝入RTC_DIVH和RTC_DIVL中。實時時鐘工作原理29(5)RTC計數(shù)器寄存器RTC_CNTH和RTC_CNTLRTC_CNTH和RTC_CNTL(偏移地址為0x18和0x1C,復(fù)位值均為0x0)是兩個可讀/可寫的16位寄存器,用于保存RTC模塊的時間和日歷值。(6)RTC報警器寄存器RTC_ALRH和RTC_ALRLRTC_ALRH和RTC_ALRL(偏移地址為0x20和0x24,復(fù)位值均為0xFFFF)是兩個只寫的16位寄存器,用于保存RTC模塊報警時的時間和日歷值。當(dāng)RTC計數(shù)器寄存器RTC_CNTH和RTC_CNTL的值分別與RTC_ALRH和RTC_ALRL的值相等時,產(chǎn)生RTC報警中斷。實時時鐘工作原理30在工程PRJ09的基礎(chǔ)上,新建工程“PRJ11”,保存在“D:\STM32F103RCT6PRJ\PRJ11”目錄下,此時的工程PRJ11與工程PRJ09完全相同。然后,進(jìn)行如下的步驟:(1)修改文件main.c,如右面程序段所示,即在主函數(shù)的無限循環(huán)體中,不做具體的處理工作。實時時鐘寄存器類型實例31(2)新建文件rtc.c和rtc.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ11\BSP”下,這兩個文件的內(nèi)容如下面的程序段所示。實時時鐘寄存器類型實例32實時時鐘寄存器類型實例33(3)在includes.h文件的末尾添加語句“#include"rtc.h"”,即包括頭文件rtc.h。(4)在bsp.c文件的BSPInit函數(shù)中,添加語句“RTCInit();”,如程序段6-15所示。實時時鐘寄存器類型實例34(5)將rtc.c文件添加到工程管理器的“BSP”分組下。建設(shè)好的工程PRJ11如下圖所示。實時時鐘寄存器類型實例35本小節(jié)中使用庫函數(shù)實現(xiàn)rtc.c文件中的全部功能,具體步聚如下:(1)在工程PRJ10的基礎(chǔ)上,新建工程“PRJ12”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ12”下。此時的工程PRJ12與工程PRJ10完全相同。(2)修改文件main.c,主函數(shù)的無限循環(huán)體為空。(3)新建rtc.c和rtc.h文件,保存在目錄“D:\STM32F103RCT6PRJ\PRJ12\BSP”下。實時時鐘庫函數(shù)類型實例36實時時鐘庫函數(shù)類型實例37實時時鐘庫函數(shù)類型實例(4)修改bsp.c文件,如程序段6-15所示,即添加對RTC初始化函數(shù)的調(diào)用語句。(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實現(xiàn)的功能與工程PRJ11完全相同,所使用的庫函數(shù)可以在相應(yīng)的庫函數(shù)源文件或頭文件中查閱。6.4通用定時器3839STM32F103RCT6具有8個定時器,其中,TIM1和TIM8為高級控制定時器,TIM2~TIM5為通用定時器,TIM6和TIM7為基本定時器。相對于傳統(tǒng)的80C51單片機的定時器而言,STM32F103RCT6的定時器功能更加完善和復(fù)雜。這里以TIM2為例介紹通用定時器的基本用法。通用定時器40STM32F103RCT6微控制器具有4個通用定時器TIM2~TIM5,它們的結(jié)構(gòu)和工作原理相同。這里以通用定時器TIM2為例介紹通用定時器的工作原理,TIM2的結(jié)構(gòu)如下圖所示。通用定時器工作原理41(1)TIM2控制寄存器TIM2_CR1(偏移地址0x0,復(fù)位值0x0)TIM2_CR1寄存器是一個16位的可讀/可寫寄存器,如下表所示。通用定時器工作原理42通用定時器工作原理(2)TIM2定時器計數(shù)器寄存器TIM2_CNT(偏移地址0x24,復(fù)位值0x0)TIM2_CNT寄存器是一個16位的可讀/可寫寄存器,保存了定時器的當(dāng)前計數(shù)值。(3)TIM2定時器預(yù)分頻器寄存器TIM2_PSC(偏移地址0x28,復(fù)位值0x0)TIM2_PSC寄存器是一個16位的可讀/可寫寄存器,TIM2計數(shù)器的計數(shù)頻率=定時器時鐘源頻率/(TIM2_PSC+1)。如果采用32MHz的APB1總線時鐘作為TIM2時鐘源(理論分析應(yīng)該為16MHz,但

溫馨提示

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

評論

0/150

提交評論