嵌入式技術及應用(STM32CubeMX版)課件 任務6 統(tǒng)計按鍵按下的次數(shù)_第1頁
嵌入式技術及應用(STM32CubeMX版)課件 任務6 統(tǒng)計按鍵按下的次數(shù)_第2頁
嵌入式技術及應用(STM32CubeMX版)課件 任務6 統(tǒng)計按鍵按下的次數(shù)_第3頁
嵌入式技術及應用(STM32CubeMX版)課件 任務6 統(tǒng)計按鍵按下的次數(shù)_第4頁
嵌入式技術及應用(STM32CubeMX版)課件 任務6 統(tǒng)計按鍵按下的次數(shù)_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

任務6統(tǒng)計按鍵按下的次數(shù)任務要求STM32的PC13引腳上外接按鍵K1電路,PE0~PE7引腳上外接8只發(fā)光二極管顯示電路,發(fā)光二極管采用低電平有效控制。要求用外部中斷的方式統(tǒng)計按鍵按下的次數(shù),按鍵每按下一次,計數(shù)值就加1,然后用8只發(fā)光二極管以二進制數(shù)的形式顯示按鍵按下的次數(shù),其中,發(fā)光二極管點亮表示該位二進制數(shù)為1,例如當前計數(shù)值為5,則8只發(fā)光二極管的狀態(tài)就為“滅滅滅滅滅亮滅亮”。知識儲備

1.中斷的相關知識(1)中斷中斷即打斷,是指CPU在執(zhí)行當前程序時,由于程序以外的原因,出現(xiàn)了某種更急需要處理的情況,CPU暫停現(xiàn)行程序,轉而處理更緊急的事務,處理結束后CPU自動返回到原來的程序中繼續(xù)執(zhí)行。單片機中的中斷概念在我們的日常生活中經(jīng)常碰到。例如,你在自習室里看書時,突然有同學找你,你就會在當前閱讀處做上記號,然后走出自習室與同學交談,處理完同學找你這件事后,你又返回到自習室,從記號處繼續(xù)閱讀。1.中斷的相關知識

(2)中斷源中斷源即請求中斷的來源,是指能引起中斷、發(fā)出中斷請求的設備或事件。在上述例子中,同學找你就是中斷你看書的中斷源。(3)中斷服務CPU響應中斷請求后,為中斷源所做的事務就叫做中斷服務。在前面的例子中,“同學找你”是引起看書中斷的中斷源,而你響應“同學找你”所做的“走出自習室”、“與同學交談”等事情,就叫做你為“同學找你”這個中斷源所做的中斷服務。1.中斷的相關知識

(4)中斷的優(yōu)先級當多個中斷源同時向CPU申請中斷時,單片機所規(guī)定的對中斷源響應的先后次序就叫做中斷的優(yōu)先級。在單片機中,優(yōu)先級高的中斷請求先響應,優(yōu)先級低的中斷請求后響應。(5)中斷嵌套CPU響應了某一中斷請求,并進行中斷服務處理時,若有優(yōu)先級更高的中斷源發(fā)出中斷申請,則CPU暫停當前的中斷服務,轉而響應高優(yōu)先級中斷源的中斷請求,高優(yōu)先級中斷服務結束后,再繼續(xù)進行低優(yōu)先級中斷服務處理,這種情況就叫做中斷嵌套。1.中斷的相關知識

(5)中斷嵌套簡而言之,中斷嵌套就是打斷低級中斷服務,進行高級中斷服務,高級中斷服務結束后,再繼續(xù)進行低級中斷服務處理。中斷嵌套示意圖如右圖所示。在單片機中,只有高優(yōu)先級中斷源才能打斷低優(yōu)先級中斷源的中斷服務,而形成中斷嵌套。低級中斷源對高級中斷服務、同級中斷源的中斷服務是不能形成中斷嵌套的。中斷嵌套示意圖2.嵌套中斷向量控制器NVIC

NVIC是NestedVectoredInterruptController的縮寫,含義是嵌套中斷向量控制器。NVIC是M3內核的一個外設,用來控制和管理中斷。M3內核可管理256個中斷通道,并且可配置256個中斷優(yōu)先級。STM32是基于M3內核的微控制器,它只使用了M3嵌套中斷向量控制器的部分資源,有高達84個中斷通道(STM32F103系列只有76個中斷通道),其中內核中斷通道16個,其他用戶可屏蔽中斷通道高達68個(STM32F103系列只有60個)。2.嵌套中斷向量控制器NVIC

STM32的中斷優(yōu)先級由4位二進制位控制。在這4位二進制位中,高位用來設置主優(yōu)先級,低位用來設置子優(yōu)先級,其中,主優(yōu)先級也叫搶占優(yōu)先級。主優(yōu)先級和子優(yōu)先級各占多少位取決于中斷優(yōu)先級的分組情況,如果將中斷的優(yōu)先級分為i組(i=0~4),則分配給主優(yōu)先級的二進制位為i位,分配給子優(yōu)先級的二進制位為4-i位。例如,如果將中斷的優(yōu)先級分為3組,則在4個設置中斷優(yōu)先級的二進制位中,前3位用來設置主優(yōu)先級,后1位用來設置子優(yōu)先級。因此,主優(yōu)先級共有23級,即8級(0~7),子優(yōu)先級共2級(0~1)。也就是說,此時STM32的所有中斷的主優(yōu)先級都可以設置在0~7級中的某一級,不會超出此范圍。2.嵌套中斷向量控制器NVIC

主優(yōu)先級的級別高于子優(yōu)先級(有的文獻上稱之為響應優(yōu)先級),中斷的優(yōu)先級取決于主優(yōu)先級,優(yōu)先級編號越小,代表的優(yōu)先級越高。如果兩個中斷的主優(yōu)先級相同,則這兩個中斷為同級中斷,它們之間不能相互打斷,如果這兩個中斷同時提出中斷請求,則子優(yōu)先級編號小的(即子優(yōu)先級高的)先響應。如果兩個中斷的主優(yōu)先級不同,則主優(yōu)先級編號小的(即主優(yōu)先級高的)可以打斷主優(yōu)先級低的中斷。例如,中斷的優(yōu)先級分為2組,中斷3的主優(yōu)先級為2,子優(yōu)先級為1,中斷6的主優(yōu)先級為3,子優(yōu)先級為0,中斷7的主優(yōu)先級為2,子優(yōu)先級為0。則這3個中斷的優(yōu)先級順序為,中斷7>中斷3>中斷6。中斷7和中斷3都可以打斷中斷6,但中斷7不可打斷中斷3。2.嵌套中斷向量控制器NVIC

在STM32CubeMX中,主優(yōu)先級用PreemptionPriority表示,子優(yōu)先級用SubPriority表示。默認情況下,中斷優(yōu)先級分為4組,即4位全部用來設置主優(yōu)先級,因此中斷可以配置成16個優(yōu)先級,如右圖所示。中斷優(yōu)先級的表示3.STM32的外部中斷控制器

STM32有20個外部輸入中斷線,由20個外部中斷/事件控制器控制,這20個外部中斷/事件控制器由20個相互獨立的邊沿檢測器組成,每個邊沿檢測器具有產(chǎn)生事件/中斷請求功能。在這20個中斷線中,每個中斷都設有狀態(tài)位,用來保存中斷請求的狀態(tài),每個中斷都有上升沿、下降沿、上升下降雙邊沿共3種觸發(fā)方式,每個中斷/事件都可以單獨觸發(fā)和屏蔽。STM32的20個外部輸入中斷線依次表示為EXTI0~EXTI19。其中,EXTI0~EXTI15分配給GPIO口,叫做GPIO口引腳輸入中斷,EXTI16為PVD中斷,EXTI17為RTC鬧鐘中斷,EXTI18為USB喚醒中斷,EXTI19為以太網(wǎng)喚醒中斷。3.STM32的外部中斷控制器

在STM32中,每個GPIO口引腳都可以用作外部GPIO中斷的輸入腳,在各個GPIO口中,編號相同的引腳共用一個中斷輸入線,也就是PAi、PBi、…、PGi引腳共用EXTIi(i=0~15)外部中斷輸入線,中斷線與GPIO口引腳的對應關系如右圖所示。中斷線與GPIO口引腳的對應關系3.STM32的外部中斷控制器

在STM32中,EXTI0~EXTI15這16根GPIO中斷輸入線共占用7個中斷通道,每個中斷通道有一個中斷向量。EXTI0~EXTI4各占一個獨立的中斷通道,EXTI5~EXTI9共用一個中斷通道,EXTI10~EXTI15共用一個中斷通道。中斷線與GPIO口引腳的對應關系3.STM32的外部中斷控制器

HAL庫中,中斷向量的定義位于啟動文件startup_stm32f103xe.s中,這是一個匯編語言程序文件,外部中斷及其中斷服務函數(shù)的名稱如右表所示。GPIO引腳中斷線中斷服務函數(shù)PA0~PG0EXTI0EXTI0_IRQHandlerPA1~PG1EXTI1EXTI1_IRQHandlerPA2~PG2EXTI2EXTI2_IRQHandlerPA3~PG3EXTI3EXTI3_IRQHandlerPA4~PG4EXTI4EXTI4_IRQHandlerPA5~PG5EXTI5EXTI9_5_IRQHandlerPA6~PG6EXTI6PA7~PG7EXTI7PA8~PG8EXTI8PA9~PG9EXTI9PA10~PG10EXTI10EXTI15_10_IRQHandlerPA11~PG11EXTI11PA12~PG12EXTI12PA13~PG13EXTI13PA14~PG14EXTI14PA15~PG15EXTI15HAL中外部中斷及其中斷服務函數(shù)3.STM32的外部中斷控制器

中斷向量表如下圖所示4.HAL中GPIO口的外部中斷函數(shù)

(1)HAL_GPIO_EXTI_IRQHandler()原型voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin);功能清除中斷請求,并調用外部中斷回調函數(shù)(HAL_GPIO_EXTI_Callback()函數(shù))進行中斷服務處理。該函數(shù)是外部中斷的服務函數(shù)。參數(shù)GPIO_Pin:連接在相應外部中斷線上的端口引腳編號。取值為GPIO_PIN_0~GPIO_PIN_15。返回值無。說明該函數(shù)主要供系統(tǒng)調用,用戶一般不使用該函數(shù)。函數(shù)的用法4.HAL中GPIO口的外部中斷函數(shù)

(2)HAL_GPIO_EXTI_Callback()函數(shù)原型__weakvoidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin);功能外部中斷的回調函數(shù)。該函數(shù)是外部中斷服務函數(shù)中最后調用的函數(shù)。該函數(shù)用來定義外部中斷發(fā)生后STM32所要處理的事務。參數(shù)GPIO_Pin:連接在相應外部中斷線上的端口引腳編號。取值為GPIO_PIN_0~GPIO_PIN_15。返回值無。函數(shù)的用法4.HAL中GPIO口的外部中斷函數(shù)

【說明】①HAL中的HAL_GPIO_EXTI_Callback()函數(shù)是一個函數(shù)體為空的弱函數(shù),如下圖所示,在實際應用中需要用戶重新定義回調函數(shù)HAL_GPIO_EXTI_Callback()。②用戶重新定義外部中斷回調函數(shù)時,函數(shù)的名稱、參數(shù)的個數(shù)和類型必須與HAL中的外部中斷回調函數(shù)相同。(2)HAL_GPIO_EXTI_Callback()函數(shù)4.HAL中GPIO口的外部中斷函數(shù)

③用戶重新定義的外部中斷回調函數(shù)一般采用以下框架結構:void HAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){ if(GPIO_Pin==GPIO_PIN_x)//判斷是否是x引腳上的中斷 { /*x引腳上的中斷發(fā)生后的事務處理*/ } elseif(GPIO_Pin==GPIO_PIN_y { /*y引腳上的中斷發(fā)生后的事務處理*/ }}4.HAL中GPIO口的外部中斷函數(shù)

舉例采用中斷方式對PC13引腳上出現(xiàn)的脈沖進行計數(shù),每出現(xiàn)一個下降沿計數(shù)器PlusCnt的值就加1,其外部中斷回調函數(shù)如下:voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){ if(GPIO_Pin==GPIO_PIN_13)//判斷是否是13引腳上的中斷 { PlusCnt++;/*中斷發(fā)生后的事務處理*/ }}實現(xiàn)方法與步驟任務6的硬件電路:

1.搭建電路2.生成外部中斷的初始化代碼步驟生成外部中斷初始化代碼的方法如下:(1)啟動STM32CubeMX,然后新建STM32CubeMX工程、配置SYS、RCC,其中,Debug模式選擇SerialWire,HSE選擇外部晶振,再配置時鐘,其配置結果與任務2中對應的部分完全相同。(2)按照任務2中介紹的方法將PE0~PE7配置成輸出口、輸出電平為高電平、推挽輸出、無上拉也無下拉、高速輸出、無用戶標簽。

2.生成外部中斷的初始化代碼【說明】STM32對端口引腳的配置具有批處理功能,可以同時將多個引腳配置成相同的參數(shù)。將PE0~PE7引腳同時配置成輸出電平為高電平、推挽輸出、無上拉也無下拉、高速輸出也可以采用以下方法:第1步:在GPIO模式和配置窗口中點擊PE0,然后按住Ctrl鍵后再依次點擊PE1~PE7,選中PE0~PE7。第2步:在引腳配置框架的各下拉列表框中分別選擇高電平、推挽輸出、無上拉也無下拉、高速輸出選項。如右圖所示。

成批配置端口引腳2.生成外部中斷的初始化代碼(3)配置外部中斷引腳步驟如下:第1步:在引腳視圖中點PC13引腳,然后在彈出的快捷菜單中點擊“GPIO_EXTI13”菜單項,如右圖所示,將PC13配置成外部中斷輸入腳,視圖中的PC13引腳就會由灰色變成綠色。

將PC13設置成外部中斷輸入腳2.生成外部中斷的初始化代碼(3)配置外部中斷引腳第2步:在STM32CubeMX窗口中點擊“Pinout&Configuration”標簽名,然后點擊窗口右邊的“Categories”標簽名,再在Categories標簽的列表框中點擊“SystemCore”→“GPIO”列表項,窗口的中間就會出現(xiàn)“GPIOModeandConfiguration”窗口,如右圖所示。

GPIO模式配置窗口2.生成外部中斷的初始化代碼(3)配置外部中斷引腳第3步:在GPIO模式配置窗口中點擊“GPIO”標簽名,右圖中第5處,再在“GPIO”標簽中點擊PC13列表項,圖中第6處,GPIO口的配置列表框下面會出“PC13-TAMPER-RTCConfiguration”框架,如右圖所示。第4步:在PC13配置框架中點擊“GPIOmode”下拉列表框,圖中第7處,從中選擇“ExternalInterruptModewithFallingedgetriggerdetection”(下降沿觸發(fā)的外部中斷模式)列表項。

GPIO模式配置窗口2.生成外部中斷的初始化代碼(3)配置外部中斷引腳第5步:點擊“GPIOPull-up/Pull-down”(上拉/下拉電阻)下拉列表框,從中選擇“Nopull-upandnopull-down”列表項,將PC13引腳設置成無上拉電阻也無下拉電阻模式。第6步:在“UserLabel”文本框中輸入“K1”,將PC13腳定義成K1腳。

GPIO模式配置窗口2.生成外部中斷的初始化代碼【說明】GPIO口作外部中斷輸入腳使用時各配置項的含義

配置項含義取值值的含義GPIOmodeGPIO口的模式ExternalInterruptModewithRisingedgetriggerdetection帶上升沿觸發(fā)檢測的外部中斷模式ExternalInterruptModewithFallingedgetriggerdetection帶下降沿觸發(fā)檢測的外部中斷模式ExternalInterruptModewithRising/Fallingedgetriggerdetection具有上升/下降沿觸發(fā)檢測的外部中斷模式ExternalEventModewithRisingedgetriggerdetection具上升沿觸發(fā)檢測的外部事件模式ExternalEventModewithFallingedgetriggerdetection帶下降沿觸發(fā)檢測的外部事件模式ExternalEventModewithRising/Fallingedgetriggerdetection具有上升/下降沿觸發(fā)檢測的外部事件模式GPIOPull-up/Pull-downGPIO口的上拉/下拉電阻NoPull-upandnopull-down既無上拉電阻也無下拉電阻Pull-up上拉電阻pull-down下拉電阻UserLabel用戶標簽給引腳所取的別名,例如K12.生成外部中斷的初始化代碼(4)配置NVIC第1步:在右圖中,在Categories標簽的列表框中點擊“SystemCore”→“NVIC”列表項,使配置窗口中顯示“NVICModeandConfiguration”窗口。

NVIC模式配置2.生成外部中斷的初始化代碼(4)配置NVIC第2步:在NVIC模式配置窗口中點擊“NVIC”標簽名,圖中第2處,再點擊“PriorityGroup”(優(yōu)先級分組)下拉列表框,圖中第3處,從中選擇“4bitsforpre-emptionpriority0bitsforsubpriority”,也就是在4位中斷控制位中,4位分配給主優(yōu)先級,0位分配給子優(yōu)先級。

NVIC模式配置2.生成外部中斷的初始化代碼(4)配置NVIC第3步:在NVIC模式配置窗口中去掉“Showonlyenabledinterrupts”多選框前面的“√”號,圖中第4處,窗口的下面就會顯示“EXTIline[15:10]interrupts”列表項,也就是剛才所配置的PC13腳的中斷通道,圖中第5處。NVIC模式配置2.生成外部中斷的初始化代碼(4)配置NVIC第4步:點擊“EXTIline[15:10]interrupts”列表項,然后勾選“Enabled”復選框,圖中第6處,使能PC13腳的中斷通道。第5步:在PreemptionPriority下拉列表框中將PC13腳的中斷主優(yōu)先級設為1,圖中第7處,再在SubPriority下拉列表框中將PC13腳的子優(yōu)先級設為0,圖中第8處。

NVIC模式配置2.生成外部中斷的初始化代碼(5)配置時鐘按照任務2中介紹的方法配置時鐘,配置結果與任務2相同。(6)配置工程按照任務2中介紹的方法配置STM32CubeMX工程,其中工程名為Task6,其他配置項與任務2中的配置相同。(7)保存工程,然后生成Keil工程代碼。

3.編寫統(tǒng)計按鍵按下次數(shù)的程序任務6中,按鍵K1接在PC13引腳上,PC13引腳的外部中斷采用下降沿觸發(fā),每一次按鍵就會產(chǎn)生一個下降沿,從而會觸發(fā)一次外部中斷。因此,只需要在PC13引腳的外部中斷服務程序中將按鍵的計數(shù)值加1,就可以統(tǒng)計按鍵按下的次數(shù)了。任務6的編程思路是,用變量KeyCnt保存按鍵按下的次數(shù),在PC13的中斷回調函數(shù)中將KeyCnt加1,然后在main()函數(shù)的while(1)死循環(huán)中不停地顯示KeyCnt的值。由于變量KeyCnt在多個函數(shù)中都要使用,所以需要將此變量定義成全局變量。

3.編寫統(tǒng)計按鍵按下次數(shù)的程序在main.c文件中編寫統(tǒng)計按鍵按下次數(shù)的程序,其代碼詳見鏈接。統(tǒng)計按鍵按下次數(shù)的實現(xiàn)步驟如下:(1)打開main.c文件,然后在“USERCODEBEGINPV”與“USERCODEENDPV”之間(用戶變量定義區(qū))定義全局變量KeyCnt,如右側上圖所示。(2)在用戶代碼4區(qū)(USERCODEBEGIN4與USERCODEEND4之間)重新定義外部中斷回調函數(shù),如右側下圖所示。

定義全局變量重定義外部中斷回調函數(shù)3.編寫統(tǒng)計按鍵按下次數(shù)的程序(3)在用戶代碼4區(qū)定義數(shù)據(jù)顯示函數(shù),如右側上圖所示。(4)在main()函數(shù)的while(1)代碼區(qū)中添加CPU要反復執(zhí)行的代碼,如右側下圖所示。這段代碼的功能是,調用函數(shù)display()顯示KeyCnt中的按鍵按下的次數(shù)。

數(shù)據(jù)顯示函數(shù)調用數(shù)據(jù)顯示函數(shù)3.編寫統(tǒng)計按鍵按下次數(shù)的程序【說明】添加了語句“display(KeyCnt);”后,語句前面會出現(xiàn)一個警告提示“”符號,并且“display”的下面會出現(xiàn)紅色的波浪符號。其含義是,此處有警告錯誤。將鼠標移至“”符號處或者紅色波浪符號處,Keil中將會出現(xiàn)錯誤的含義和出錯位置的提示,如下圖所示。警告提示3.編寫統(tǒng)計按鍵按下次數(shù)的程序(5)在用戶函數(shù)說明區(qū)添加display()函數(shù)的原型說明,如右圖所示。

添加函數(shù)原型說明4.調試與下載程序按照前面介紹的方法配置Keil工程,并對程序進行編譯、調試,然后將程序下載至開發(fā)板中運行,我們就可以看到,每按一次K1,發(fā)光二極管所顯示的二進制數(shù)就會加1。程序分析下面以PC13引腳上的外部中斷為例分析外部中斷的執(zhí)行過程。在STM32中,PC13引腳對應的中斷線為EXTI13。外部中斷線EXTI10~EXTI15共用一個中斷通道,它的中斷向量定義位于startup_stm32f103xe.s文件中,如下圖所示。1.外部中斷執(zhí)行過程的分析PC13引腳的中斷向量定義1.外部中斷執(zhí)行過程的分析PC13的外部中斷服務程序為EXTI15_10_IRQHandler(),PC13腳發(fā)一中斷事件(下降沿、上升沿或雙邊沿)后,就會產(chǎn)生中斷請求,CPU響應了PC13的中斷請求后就去執(zhí)行EXTI15_10_IRQHandler()函數(shù)。用GoToDefinitionof命令可以查看到該函數(shù)的定義如右圖示。EXTI15_10_IRQHandler()函數(shù)的定義1.外部中斷執(zhí)行過程的分析EXTI15_10_IRQHandler()函數(shù)內只調用了HAL_GPIO_EXTI_IRQHandler()函數(shù),再用GoToDefinitionof命令查看該函數(shù)的定義,其定義如右圖所示。HAL_GPIO_EXTI_IRQHandler()函數(shù)的功能是,若中斷線上發(fā)生了中斷事件(第549行),則清除中斷線的中斷請求標志(第551行),再調用外部中斷回調函數(shù)HAL_GPIO_EXTI_Callback(),進行中斷服務處理。HAL_GPIO_EXTI_Callback()函數(shù)是外部中斷服務程序中最后調用的函數(shù),也是真正進行中斷事件處理的函數(shù)。HAL_GPIO_EXTI_IRQHandler()函數(shù)的定義1.外部中斷執(zhí)行過程的分析任務6中,我們重新定義了外部中斷回調函數(shù)HAL

溫馨提示

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

評論

0/150

提交評論