第8章STM32F10x的主要模塊設(shè)計(jì)3外部中斷課件_第1頁(yè)
第8章STM32F10x的主要模塊設(shè)計(jì)3外部中斷課件_第2頁(yè)
第8章STM32F10x的主要模塊設(shè)計(jì)3外部中斷課件_第3頁(yè)
第8章STM32F10x的主要模塊設(shè)計(jì)3外部中斷課件_第4頁(yè)
第8章STM32F10x的主要模塊設(shè)計(jì)3外部中斷課件_第5頁(yè)
已閱讀5頁(yè),還剩63頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

EmbeddedSystemDevelopment嵌入式系統(tǒng)與應(yīng)用

EmbeddedSystemDevelopment嵌入式第8章STM32F10x的主要模塊設(shè)計(jì)3外部中斷8.3外部中斷8.3.1GPIO鍵盤(pán)設(shè)計(jì)實(shí)驗(yàn)8.3.2外部中斷EXTI設(shè)計(jì)第8章STM32F10x的主要模塊設(shè)計(jì)3外部中斷8.3外8.3.1GPIO鍵盤(pán)設(shè)計(jì)實(shí)驗(yàn)GPIO端口如何進(jìn)行鍵盤(pán)設(shè)計(jì)?下面兩種辦法效果一樣。一是采用上拉輸入模式,按鍵在沒(méi)按下的時(shí)候,默認(rèn)為高電平。PE5–key1PE6–key2

二是直接采用浮空輸入模式,在芯片外部接上拉電阻。按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)。按鍵原理圖8.3.1GPIO鍵盤(pán)設(shè)計(jì)實(shí)驗(yàn)GPIO端口如何進(jìn)行鍵盤(pán)設(shè)1、按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)main()intmain(void){/*configtheled*/LED_GPIO_Config();LED1(ON);

/*configkey*/Key_GPIO_Config();while(1){if(Key_Scan(GPIOE,GPIO_Pin_5)==KEY_ON){/*LED1燈反轉(zhuǎn)*/

GPIO_WriteBit(GPIOC,GPIO_Pin_3,BitAction(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_3)));}}}讀取PC3的當(dāng)前輸出電平當(dāng)前狀態(tài)反相后寫(xiě)入到PC31、按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)main()intmain(voi按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)把前面寫(xiě)的Led燈led.c和led.h復(fù)制到本工程文件夾,編寫(xiě)main函數(shù):1、先調(diào)用了led.c中的LED_GPIO_Config(),配置LED用到的I/O。2、調(diào)用LED1(ON),把LED燈1點(diǎn)亮。3、調(diào)用Key_GPIO_Config(),配置按鍵用到的I/O口。4、調(diào)用Key_Scan()按鍵檢測(cè)函數(shù),監(jiān)測(cè)到按鍵時(shí),調(diào)用GPIO_WriteBit()函數(shù)實(shí)現(xiàn)燈反轉(zhuǎn)。BitAction枚舉定義在stm32f10x_gpio.h第104行:typedefenum{Bit_RESET=0,Bit_SET}BitAction;按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)把前面寫(xiě)的Led燈led.c和led.h2、bsp_key.h按鍵函數(shù)頭文件主要聲明Key_GPIO_Config()、Key_Scan()兩個(gè)函數(shù):#ifndef__KEY_H//條件編譯#define__KEY_H#include"stm32f10x.h"#defineKEY_ON 0//按鍵按下標(biāo)志#defineKEY_OFF 1//無(wú)按鍵標(biāo)志voidKey_GPIO_Config(void);uint8_tKey_Scan(GPIO_TypeDef*GPIOx,u16GPIO_Pin);#endif在bsp_key.C文件中實(shí)現(xiàn)上兩個(gè)函數(shù)。2、bsp_key.h按鍵函數(shù)頭文件主要聲明Key_GPIO3、Key_GPIO_Config()函數(shù)與LED的GPIO初始化函數(shù)LED_GPIO_Config()類似。#include"bsp_key.h"voidKey_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStructure;/*開(kāi)啟按鍵端口GPIOE(PE5)的時(shí)鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOE,&GPIO_InitStructure);}可用符號(hào)|同時(shí)配置多個(gè):GPIO_Pin_5|GPIO_Pin_6;3、Key_GPIO_Config()函數(shù)與LED的GPIO4、Key_Scan()按鍵檢測(cè)函數(shù)/*輸入:GPIOx、GPIO_Pin:待讀取的端口、引腳,**輸出:KEY_OFF(沒(méi)按下按鍵)、KEY_ON(按下按鍵)*/u8Key_Scan(GPIO_TypeDef*GPIOx,u16GPIO_Pin){/*檢測(cè)是否有按鍵按下*/if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON){Delay(10000);//延時(shí)消抖

if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)

{while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON);returnKEY_ON;}//等待按鍵釋放elsereturnKEY_OFF;elsereturnKEY_OFF;}}4、Key_Scan()按鍵檢測(cè)函數(shù)/*輸入:GPIOx、Key_Scan()按鍵檢測(cè)函數(shù)庫(kù)函數(shù)GPIO_ReadInputDataBit(端口號(hào),引腳號(hào));返回引腳的數(shù)據(jù),0為低電平即KEY_ON,可能有按鍵按下,調(diào)用延時(shí)函數(shù)消抖;否則返回1為高電平即KEY_OFF,表示按鍵沒(méi)有被按下。延時(shí)之后再次讀取該引腳數(shù)據(jù),若依然為低電平,表明確實(shí)有按鍵被按下了;否則返回KEY_OFF,表示沒(méi)按鍵。while循環(huán)調(diào)用GPIO_ReadInputDataBit(),等待按鍵釋放,條件變?yōu)榧偻顺鲅h(huán),返回表示按鍵被按下的標(biāo)志KEY_ON。同理,通過(guò)輸入不同的實(shí)參,來(lái)檢測(cè)其它按鍵的引腳。這就是庫(kù)的魅力!Key_Scan()按鍵檢測(cè)函數(shù)庫(kù)函數(shù)GPIO_ReadIn作業(yè)1、進(jìn)一步熟悉GPIO,掌握GPIO設(shè)計(jì)。2、掌握GPIO鍵盤(pán)實(shí)驗(yàn),實(shí)驗(yàn)報(bào)告。作業(yè)1、進(jìn)一步熟悉GPIO,掌握GPIO設(shè)計(jì)。8.3.2STM32中斷向量表上個(gè)實(shí)驗(yàn)中while(1){…}程序中始終輪詢檢測(cè)是否有按鍵按下,浪費(fèi)CPU時(shí)間、能耗。可采用中斷處理方式,當(dāng)按鍵按下時(shí)觸發(fā)中斷再檢測(cè)按鍵。STM32的所有GPIO都可以用作外部中斷源,可把按鍵輪詢檢測(cè)改為由中斷來(lái)處理,大大提高軟件執(zhí)行的效率。向量中斷控制器NVIC屬于Cortex內(nèi)核的器件,編號(hào)為1-15的對(duì)應(yīng)系統(tǒng)異常,大于等于16的則全是外部中斷。STM32中斷向量表,優(yōu)先級(jí)從-3至6(即編號(hào)1-15)為系統(tǒng)異常,優(yōu)先級(jí)為負(fù)的不能設(shè)置優(yōu)先級(jí),如復(fù)位Reset、不可屏蔽中斷NMI、硬錯(cuò)誤Hardfault。從優(yōu)先級(jí)7開(kāi)始(即類型編號(hào)16開(kāi)始)的為外部中斷,優(yōu)先級(jí)自行設(shè)置。8.3.2STM32中斷向量表上個(gè)實(shí)驗(yàn)中while(1){STM32中斷向量表STM32中斷向量表STM32中斷向量表STM32中斷向量表8.3.3STM32外部中斷控制器EXTI向量中斷控制器NVIC能配置16種外部中斷EXTIx(0~15),超過(guò)16個(gè)中斷事件時(shí),必然有2個(gè)以上的中斷事件使用相同的中斷種類。注意:相同種類的中斷不能嵌套。外部中斷控制器EXTI配置管理外部事件輸入GPIO引腳與EXTIx的連接方式:PAx~PGx端口引腳的事件連接同一個(gè)EXTIx,分時(shí)復(fù)用。GPIO事件可配置為下降沿、上升沿或邊沿三種模式觸發(fā)中斷。EXTI一個(gè)應(yīng)用:上個(gè)實(shí)驗(yàn)的按鍵再添加下降沿觸發(fā)中斷,用中斷處理來(lái)檢測(cè)按鍵。EXTI158.3.3STM32外部中斷控制器EXTI向量中斷控制器NSTM32外部中斷控制器EXTI對(duì)于互聯(lián)型芯片,外部中斷控制器由20個(gè)產(chǎn)生事件中斷請(qǐng)求的邊沿檢測(cè)器組成,其他芯片19個(gè)。STM32外部中斷控制器EXTI對(duì)于互聯(lián)型芯片,外部中斷控制STM32外部中斷控制器EXTI每個(gè)輸入線都可配置輸入類型(脈沖或掛起)和對(duì)應(yīng)的觸發(fā)方式(上升沿或下降沿或者雙邊沿都觸發(fā))。每個(gè)輸入線都可被屏蔽。掛起寄存器保持著狀態(tài)線的中斷請(qǐng)求。另外四個(gè)EXTI線的連接方式如下:EXTI線16連接到PVD輸出EXTI線17連接到RTC鬧鐘事件EXTI線18連接到USB喚醒事件EXTI線19連接到以太網(wǎng)喚醒事件(只適用于互聯(lián)型產(chǎn)品)GPIO的x引腳配置為EXTIxSTM32外部中斷控制器EXTI每個(gè)輸入線都可配置輸入類型(8.3.4EXTI寄存器庫(kù)中定義stm32f10x.h庫(kù)892行中EXTI寄存器結(jié)構(gòu)定義:typedefstruct{vu32IMR;//中斷屏蔽寄存器,配置20個(gè)中斷線的屏蔽位vu32EMR;//事件屏蔽寄存器vu32RTSR;//上升沿觸發(fā)選擇寄存器vu32FTSR;//下降沿觸發(fā)選擇寄存器vu32SWIER;//設(shè)置軟件中斷寄存器的請(qǐng)求位vu32PR;//掛起寄存器}EXTI_TypeDef;8.3.4EXTI寄存器庫(kù)中定義stm32f10x.h庫(kù)8EXTI寄存器庫(kù)中定義#definePERIPH_BASE((uint32_t)0x40000000)#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)#defineEXTI_BASE(APB2PERIPH_BASE+0x0400)#defineEXTI((EXTI_TypeDef*)EXTI_BASE)EXTI為EXTI_TypeDef結(jié)構(gòu)體型指針地址:0x40010400EXIT寄存器配置數(shù)據(jù)位宏定義在3269行開(kāi)始:。/*BitdefinitionforEXTI_IMRregister**/#defineEXTI_IMR_MR0((uint32_t)0x00000001)/*!<InterruptMaskonline0*/#defineEXTI_IMR_MR1((uint32_t)0x00000002)……EXTI寄存器庫(kù)中定義#definePERIPH_BASE8.3.5EXTI庫(kù)函數(shù)stm32f10x_exti.cEXTI庫(kù)函數(shù)在文件stm32f10x_exti.c中定義8.3.5EXTI庫(kù)函數(shù)stm32f10x_exti.c8.3.6外部中斷與NVIC的關(guān)系外部中斷0與NVIC的對(duì)應(yīng)8.3.6外部中斷與NVIC的關(guān)系外部中斷0與NVIC的對(duì)NVIC寄存器NVIC寄存器NVIC庫(kù)函數(shù)NVIC庫(kù)函數(shù)NVIC配置misc庫(kù)中NVIC_Init()函數(shù)對(duì)NVIC初始化,用到NVIC_InitTypeDef結(jié)構(gòu)體,其中四個(gè)成員:NVIC_IRQChannel參數(shù)來(lái)選擇將要配置的中斷向量;NVIC_IRQChannelCmd參數(shù)來(lái)進(jìn)行使能(ENABLE)或關(guān)閉(DISABLE)該中斷;NVIC_IRQChannelPreemptionPriority成員要配置中斷向量的搶占優(yōu)先級(jí);NVIC_IRQChannelSubPriority需要配置中斷向量的響應(yīng)優(yōu)先級(jí)。NVIC只可配置16種中斷向量的優(yōu)先級(jí):編號(hào)越小,優(yōu)先級(jí)別越高;搶占優(yōu)先級(jí):是指打斷其它中斷,會(huì)出現(xiàn)嵌套中斷;響應(yīng)優(yōu)先級(jí):先處理響應(yīng)優(yōu)先級(jí)高的中斷;NVIC配置misc庫(kù)中NVIC_Init()函數(shù)對(duì)NVI中斷檢測(cè)按鍵實(shí)驗(yàn)硬件連接:PE5–key1、PE6–key2,key1按下時(shí),進(jìn)入線中斷處理函數(shù),LED1狀態(tài)取反。

配置工程環(huán)境:除使用GPIO和RCC片上外設(shè);還要使用exti片上外設(shè),stm32f10x_exti.c包含了支持exti配置和操作的函數(shù);misc.c文件則包含了NVIC的配置函數(shù);本實(shí)驗(yàn)中還會(huì)在stm32f10x_it.c中編寫(xiě)中斷服務(wù)函數(shù)。中斷檢測(cè)按鍵實(shí)驗(yàn)硬件連接:PE5–key1、PE6–Main函數(shù)配置好LED用到的I/O后,調(diào)用LED1()點(diǎn)亮一盞LED燈;配置中斷,等待中斷發(fā)生。intmain(void){/*configtheled*/LED_GPIO_Config();LED1(ON);/*extilineconfig*/EXTI_PE5_Config();/*waitinterrupt*/while(1){}}Main函數(shù)配置好LED用到的I/O后,調(diào)用LED1()點(diǎn)亮配置外部中斷exti.cEXTI_PE5_Config()函數(shù),配置PE5為線中斷口,并設(shè)置中斷優(yōu)先級(jí)。主要步驟:1.使能EXTIx線的時(shí)鐘和第二功能AFIO時(shí)鐘2.配置EXTIx線的中斷優(yōu)先級(jí)3.配置EXTI中斷線I/O4.選定要配置為EXTI的I/O口線和I/O口的工作模式5.EXTI中斷線工作模式配置配置外部中斷exti.cEXTI_PE5_Config()函EXTI_PE5_Config()函數(shù)8.voidEXTI_PE5_Config(void)9.{10.GPIO_InitTypeDefGPIO_InitStructure;11.EXTI_InitTypeDefEXTI_InitStructure;13.

/*configtheextiline(PE5)clockandAFIOclock*/14.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);16./*configtheNVIC(PE5)*/17.NVIC_Configuration();//NVIC初始化配置19./*EXTIlinegpioconfig(PE5)*/20.GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;21.GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//上拉輸入EXTI_PE5_Config()函數(shù)8.voidEXTEXTI_PE5_Config()函數(shù)_續(xù)22.GPIO_Init(GPIOE,&GPIO_InitStructure);24./*EXTIline(PE5)modeconfig*/25.GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource5);//PE5設(shè)置為EXTI輸入線26.EXTI_InitStructure.EXTI_Line=EXTI_Line5;27.EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;28.EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿觸發(fā)中斷

29.EXTI_InitStructure.EXTI_LineCmd=ENABLE;30.EXTI_Init(&EXTI_InitStructure);31.}EXTI_PE5_Config()函數(shù)_續(xù)22.GPIO_GPIO端口的復(fù)用功能AFIOAFIO(alternate-functionI/O),GPIO除了用作普通的輸入輸出(主功能),還可以作為片上外設(shè)的復(fù)用輸入輸出,如串口,ADC,這些就是復(fù)用功能。GPIO還有重映射功能:重映射功能是指把原來(lái)屬于A引腳的默認(rèn)復(fù)用功能,轉(zhuǎn)移到了B引腳進(jìn)行使用(當(dāng)然B引腳具有這個(gè)重映射功能)。當(dāng)把GPIO用作EXTI外部中斷或使用重映射功能的時(shí)候,必須開(kāi)啟AFIO時(shí)鐘。代碼的第14行,開(kāi)啟了AFIO的時(shí)鐘。GPIO端口的復(fù)用功能AFIOAFIO(alternateNVIC初始化配置EXTI_PE5_Config()調(diào)用了NVIC_Configuration()函數(shù)來(lái)配置NVIC控制器。8.staticvoidNVIC_Configuration(void)9.{10.NVIC_InitTypeDefNVIC_InitStructure;12./*Configureonebitforpreemptionpriority*/13.NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);15./*配置P[A|B|C|D|E]5為中斷源*/16.NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;17.NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;18.NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;19.NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;20.NVIC_Init(&NVIC_InitStructure);//向寄存器寫(xiě)入?yún)?shù)21.}把NVIC中斷優(yōu)先級(jí)分組設(shè)置為第1組要配置的為EXTI第5~9線的中斷向量搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí),設(shè)為最高NVIC初始化配置EXTI_PE5_Config()調(diào)用了N編寫(xiě)中斷服務(wù)函數(shù)PE5連接到內(nèi)部的EXTI5,GPIO配置為上拉輸入,工作在下降沿中斷。在外圍電路上我們將PE5接到了key1上。PE5始終為高,當(dāng)按鍵按下時(shí),下降沿跳變,EXTI5會(huì)捕捉到這一跳變,并產(chǎn)生相應(yīng)的中斷,中斷服務(wù)程序在stm32f10x_it.c中實(shí)現(xiàn),專門(mén)用來(lái)存放中斷服務(wù)函數(shù)。中斷服務(wù)函數(shù)的名字必須要跟啟動(dòng)文件startup_stm32f10x_hd.s中的中斷向量表定義一致:DCDEXTI9_5_IRQHandler;EXTILine9..5EXTI9~EXTI5中斷向量的服務(wù)函數(shù)名在stm32f10x_it.c中加入EXTI9_5_IRQHandler()函數(shù);編寫(xiě)中斷服務(wù)函數(shù)PE5連接到內(nèi)部的EXTI5,GPIO配置EXTI9_5_IRQHandler()函數(shù)/*I/O線中斷,中斷線為PE5*/voidEXTI9_5_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line5)!=RESET)

//確保是否產(chǎn)生了EXTILine中斷{//LED1取反GPIO_WriteBit(GPIOC,GPIO_Pin_3,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_3))));//清除中斷標(biāo)志位EXTI_ClearITPendingBit(EXTI_Line5);}}EXTI9_5_IRQHandler()函數(shù)/*I/O線中實(shí)驗(yàn)現(xiàn)象將野火STM32開(kāi)發(fā)板供電(DC5V),插上JLINK,將編譯好的程序下載到開(kāi)發(fā)板,LED1亮,按下按鍵時(shí)LED1滅,再按下按鍵時(shí)LED1亮,如此循環(huán)。實(shí)驗(yàn)現(xiàn)象將野火STM32開(kāi)發(fā)板供電(DC5V),插上JLIN8.2課下任務(wù)閱讀P161-172閱讀Cortex-M3權(quán)威指南,第7、8、9章閱讀野火資料:P124-1411、NVIC嵌套向量中斷控制器2、中斷向量表3、EXTI外部中斷8.2課下任務(wù)閱讀P161-172EmbeddedSystemDevelopment嵌入式系統(tǒng)與應(yīng)用

EmbeddedSystemDevelopment嵌入式第8章STM32F10x的主要模塊設(shè)計(jì)3外部中斷8.3外部中斷8.3.1GPIO鍵盤(pán)設(shè)計(jì)實(shí)驗(yàn)8.3.2外部中斷EXTI設(shè)計(jì)第8章STM32F10x的主要模塊設(shè)計(jì)3外部中斷8.3外8.3.1GPIO鍵盤(pán)設(shè)計(jì)實(shí)驗(yàn)GPIO端口如何進(jìn)行鍵盤(pán)設(shè)計(jì)?下面兩種辦法效果一樣。一是采用上拉輸入模式,按鍵在沒(méi)按下的時(shí)候,默認(rèn)為高電平。PE5–key1PE6–key2

二是直接采用浮空輸入模式,在芯片外部接上拉電阻。按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)。按鍵原理圖8.3.1GPIO鍵盤(pán)設(shè)計(jì)實(shí)驗(yàn)GPIO端口如何進(jìn)行鍵盤(pán)設(shè)1、按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)main()intmain(void){/*configtheled*/LED_GPIO_Config();LED1(ON);

/*configkey*/Key_GPIO_Config();while(1){if(Key_Scan(GPIOE,GPIO_Pin_5)==KEY_ON){/*LED1燈反轉(zhuǎn)*/

GPIO_WriteBit(GPIOC,GPIO_Pin_3,BitAction(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_3)));}}}讀取PC3的當(dāng)前輸出電平當(dāng)前狀態(tài)反相后寫(xiě)入到PC31、按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)main()intmain(voi按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)把前面寫(xiě)的Led燈led.c和led.h復(fù)制到本工程文件夾,編寫(xiě)main函數(shù):1、先調(diào)用了led.c中的LED_GPIO_Config(),配置LED用到的I/O。2、調(diào)用LED1(ON),把LED燈1點(diǎn)亮。3、調(diào)用Key_GPIO_Config(),配置按鍵用到的I/O口。4、調(diào)用Key_Scan()按鍵檢測(cè)函數(shù),監(jiān)測(cè)到按鍵時(shí),調(diào)用GPIO_WriteBit()函數(shù)實(shí)現(xiàn)燈反轉(zhuǎn)。BitAction枚舉定義在stm32f10x_gpio.h第104行:typedefenum{Bit_RESET=0,Bit_SET}BitAction;按鍵實(shí)現(xiàn)LED燈反轉(zhuǎn)把前面寫(xiě)的Led燈led.c和led.h2、bsp_key.h按鍵函數(shù)頭文件主要聲明Key_GPIO_Config()、Key_Scan()兩個(gè)函數(shù):#ifndef__KEY_H//條件編譯#define__KEY_H#include"stm32f10x.h"#defineKEY_ON 0//按鍵按下標(biāo)志#defineKEY_OFF 1//無(wú)按鍵標(biāo)志voidKey_GPIO_Config(void);uint8_tKey_Scan(GPIO_TypeDef*GPIOx,u16GPIO_Pin);#endif在bsp_key.C文件中實(shí)現(xiàn)上兩個(gè)函數(shù)。2、bsp_key.h按鍵函數(shù)頭文件主要聲明Key_GPIO3、Key_GPIO_Config()函數(shù)與LED的GPIO初始化函數(shù)LED_GPIO_Config()類似。#include"bsp_key.h"voidKey_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStructure;/*開(kāi)啟按鍵端口GPIOE(PE5)的時(shí)鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOE,&GPIO_InitStructure);}可用符號(hào)|同時(shí)配置多個(gè):GPIO_Pin_5|GPIO_Pin_6;3、Key_GPIO_Config()函數(shù)與LED的GPIO4、Key_Scan()按鍵檢測(cè)函數(shù)/*輸入:GPIOx、GPIO_Pin:待讀取的端口、引腳,**輸出:KEY_OFF(沒(méi)按下按鍵)、KEY_ON(按下按鍵)*/u8Key_Scan(GPIO_TypeDef*GPIOx,u16GPIO_Pin){/*檢測(cè)是否有按鍵按下*/if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON){Delay(10000);//延時(shí)消抖

if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)

{while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON);returnKEY_ON;}//等待按鍵釋放elsereturnKEY_OFF;elsereturnKEY_OFF;}}4、Key_Scan()按鍵檢測(cè)函數(shù)/*輸入:GPIOx、Key_Scan()按鍵檢測(cè)函數(shù)庫(kù)函數(shù)GPIO_ReadInputDataBit(端口號(hào),引腳號(hào));返回引腳的數(shù)據(jù),0為低電平即KEY_ON,可能有按鍵按下,調(diào)用延時(shí)函數(shù)消抖;否則返回1為高電平即KEY_OFF,表示按鍵沒(méi)有被按下。延時(shí)之后再次讀取該引腳數(shù)據(jù),若依然為低電平,表明確實(shí)有按鍵被按下了;否則返回KEY_OFF,表示沒(méi)按鍵。while循環(huán)調(diào)用GPIO_ReadInputDataBit(),等待按鍵釋放,條件變?yōu)榧偻顺鲅h(huán),返回表示按鍵被按下的標(biāo)志KEY_ON。同理,通過(guò)輸入不同的實(shí)參,來(lái)檢測(cè)其它按鍵的引腳。這就是庫(kù)的魅力!Key_Scan()按鍵檢測(cè)函數(shù)庫(kù)函數(shù)GPIO_ReadIn作業(yè)1、進(jìn)一步熟悉GPIO,掌握GPIO設(shè)計(jì)。2、掌握GPIO鍵盤(pán)實(shí)驗(yàn),實(shí)驗(yàn)報(bào)告。作業(yè)1、進(jìn)一步熟悉GPIO,掌握GPIO設(shè)計(jì)。8.3.2STM32中斷向量表上個(gè)實(shí)驗(yàn)中while(1){…}程序中始終輪詢檢測(cè)是否有按鍵按下,浪費(fèi)CPU時(shí)間、能耗。可采用中斷處理方式,當(dāng)按鍵按下時(shí)觸發(fā)中斷再檢測(cè)按鍵。STM32的所有GPIO都可以用作外部中斷源,可把按鍵輪詢檢測(cè)改為由中斷來(lái)處理,大大提高軟件執(zhí)行的效率。向量中斷控制器NVIC屬于Cortex內(nèi)核的器件,編號(hào)為1-15的對(duì)應(yīng)系統(tǒng)異常,大于等于16的則全是外部中斷。STM32中斷向量表,優(yōu)先級(jí)從-3至6(即編號(hào)1-15)為系統(tǒng)異常,優(yōu)先級(jí)為負(fù)的不能設(shè)置優(yōu)先級(jí),如復(fù)位Reset、不可屏蔽中斷NMI、硬錯(cuò)誤Hardfault。從優(yōu)先級(jí)7開(kāi)始(即類型編號(hào)16開(kāi)始)的為外部中斷,優(yōu)先級(jí)自行設(shè)置。8.3.2STM32中斷向量表上個(gè)實(shí)驗(yàn)中while(1){STM32中斷向量表STM32中斷向量表STM32中斷向量表STM32中斷向量表8.3.3STM32外部中斷控制器EXTI向量中斷控制器NVIC能配置16種外部中斷EXTIx(0~15),超過(guò)16個(gè)中斷事件時(shí),必然有2個(gè)以上的中斷事件使用相同的中斷種類。注意:相同種類的中斷不能嵌套。外部中斷控制器EXTI配置管理外部事件輸入GPIO引腳與EXTIx的連接方式:PAx~PGx端口引腳的事件連接同一個(gè)EXTIx,分時(shí)復(fù)用。GPIO事件可配置為下降沿、上升沿或邊沿三種模式觸發(fā)中斷。EXTI一個(gè)應(yīng)用:上個(gè)實(shí)驗(yàn)的按鍵再添加下降沿觸發(fā)中斷,用中斷處理來(lái)檢測(cè)按鍵。EXTI158.3.3STM32外部中斷控制器EXTI向量中斷控制器NSTM32外部中斷控制器EXTI對(duì)于互聯(lián)型芯片,外部中斷控制器由20個(gè)產(chǎn)生事件中斷請(qǐng)求的邊沿檢測(cè)器組成,其他芯片19個(gè)。STM32外部中斷控制器EXTI對(duì)于互聯(lián)型芯片,外部中斷控制STM32外部中斷控制器EXTI每個(gè)輸入線都可配置輸入類型(脈沖或掛起)和對(duì)應(yīng)的觸發(fā)方式(上升沿或下降沿或者雙邊沿都觸發(fā))。每個(gè)輸入線都可被屏蔽。掛起寄存器保持著狀態(tài)線的中斷請(qǐng)求。另外四個(gè)EXTI線的連接方式如下:EXTI線16連接到PVD輸出EXTI線17連接到RTC鬧鐘事件EXTI線18連接到USB喚醒事件EXTI線19連接到以太網(wǎng)喚醒事件(只適用于互聯(lián)型產(chǎn)品)GPIO的x引腳配置為EXTIxSTM32外部中斷控制器EXTI每個(gè)輸入線都可配置輸入類型(8.3.4EXTI寄存器庫(kù)中定義stm32f10x.h庫(kù)892行中EXTI寄存器結(jié)構(gòu)定義:typedefstruct{vu32IMR;//中斷屏蔽寄存器,配置20個(gè)中斷線的屏蔽位vu32EMR;//事件屏蔽寄存器vu32RTSR;//上升沿觸發(fā)選擇寄存器vu32FTSR;//下降沿觸發(fā)選擇寄存器vu32SWIER;//設(shè)置軟件中斷寄存器的請(qǐng)求位vu32PR;//掛起寄存器}EXTI_TypeDef;8.3.4EXTI寄存器庫(kù)中定義stm32f10x.h庫(kù)8EXTI寄存器庫(kù)中定義#definePERIPH_BASE((uint32_t)0x40000000)#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)#defineEXTI_BASE(APB2PERIPH_BASE+0x0400)#defineEXTI((EXTI_TypeDef*)EXTI_BASE)EXTI為EXTI_TypeDef結(jié)構(gòu)體型指針地址:0x40010400EXIT寄存器配置數(shù)據(jù)位宏定義在3269行開(kāi)始:。/*BitdefinitionforEXTI_IMRregister**/#defineEXTI_IMR_MR0((uint32_t)0x00000001)/*!<InterruptMaskonline0*/#defineEXTI_IMR_MR1((uint32_t)0x00000002)……EXTI寄存器庫(kù)中定義#definePERIPH_BASE8.3.5EXTI庫(kù)函數(shù)stm32f10x_exti.cEXTI庫(kù)函數(shù)在文件stm32f10x_exti.c中定義8.3.5EXTI庫(kù)函數(shù)stm32f10x_exti.c8.3.6外部中斷與NVIC的關(guān)系外部中斷0與NVIC的對(duì)應(yīng)8.3.6外部中斷與NVIC的關(guān)系外部中斷0與NVIC的對(duì)NVIC寄存器NVIC寄存器NVIC庫(kù)函數(shù)NVIC庫(kù)函數(shù)NVIC配置misc庫(kù)中NVIC_Init()函數(shù)對(duì)NVIC初始化,用到NVIC_InitTypeDef結(jié)構(gòu)體,其中四個(gè)成員:NVIC_IRQChannel參數(shù)來(lái)選擇將要配置的中斷向量;NVIC_IRQChannelCmd參數(shù)來(lái)進(jìn)行使能(ENABLE)或關(guān)閉(DISABLE)該中斷;NVIC_IRQChannelPreemptionPriority成員要配置中斷向量的搶占優(yōu)先級(jí);NVIC_IRQChannelSubPriority需要配置中斷向量的響應(yīng)優(yōu)先級(jí)。NVIC只可配置16種中斷向量的優(yōu)先級(jí):編號(hào)越小,優(yōu)先級(jí)別越高;搶占優(yōu)先級(jí):是指打斷其它中斷,會(huì)出現(xiàn)嵌套中斷;響應(yīng)優(yōu)先級(jí):先處理響應(yīng)優(yōu)先級(jí)高的中斷;NVIC配置misc庫(kù)中NVIC_Init()函數(shù)對(duì)NVI中斷檢測(cè)按鍵實(shí)驗(yàn)硬件連接:PE5–key1、PE6–key2,key1按下時(shí),進(jìn)入線中斷處理函數(shù),LED1狀態(tài)取反。

配置工程環(huán)境:除使用GPIO和RCC片上外設(shè);還要使用exti片上外設(shè),stm32f10x_exti.c包含了支持exti配置和操作的函數(shù);misc.c文件則包含了NVIC的配置函數(shù);本實(shí)驗(yàn)中還會(huì)在stm32f10x_it.c中編寫(xiě)中斷服務(wù)函數(shù)。中斷檢測(cè)按鍵實(shí)驗(yàn)硬件連接:PE5–key1、PE6–Main函數(shù)配置好LED用到的I/O后,調(diào)用LED1()點(diǎn)亮一盞LED燈;配置中斷,等待中斷發(fā)生。intmain(void){/*configtheled*/LED_GPIO_Config();LED1(ON);/*extilineconfig*/EXTI_PE5_Config();/*waitinterrupt*/while(1){}}Main函數(shù)配置好LED用到的I/O后,調(diào)用LED1()點(diǎn)亮配置外部中斷exti.cEXTI_PE5_Config()函數(shù),配置PE5為線中斷口,并設(shè)置中斷優(yōu)先級(jí)。主要步驟:1.使能EXTIx線的時(shí)鐘和第二功能AFIO時(shí)鐘2.配置EXTIx線的中斷優(yōu)先級(jí)3.配置EXTI中斷線I/O4.選定要配置為EXTI的I/O口線和I/O口的工作模式5.EXTI中斷線工作模式配置配置外部中斷exti.cEXTI_PE5_Config()函EXTI_PE5_Config()函數(shù)8.voidEXTI_PE5_Config(void)9.{10.GPIO_InitTypeDefGPIO_InitStructure;11.EXTI_InitTypeDefEXTI_InitStructure;13.

/*configtheextiline(PE5)clockandAFIOclock*/14.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);16./*configtheNVIC(PE5)*/17.NVIC_Configuration();//NVIC初始化配置19./*EXTIlinegpioconfig(PE5)*/20.GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;21.GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//上拉輸入EXTI_PE5_Config()函數(shù)8.voidEXTEXTI_PE5_Config()函數(shù)_續(xù)22.GPIO_Init(GPIOE,&GPIO_InitStructure);24./*EXTIline(PE5)modeconfig*/25.GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource5);//PE5設(shè)置為EXTI輸入線26.EXTI_InitStructure.EXTI_Line=EXTI_Line5;27.EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;28.EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿觸發(fā)中斷

29.EXTI_InitStructure.EXTI_LineCmd=ENABLE;30.EXTI_Init(&EXTI_InitStructure);31.}EXTI_PE5_Config()函數(shù)_續(xù)22.GPIO_GPIO端口的復(fù)用功能AFIOAFIO(alternate-functionI/O),GPIO除了用作普通的輸入輸出(主功能),還可以作為片上外設(shè)的復(fù)用輸入輸出,如串口,ADC,這些就是復(fù)用功能。GPIO還有重映射功能:重映射功能是指把原來(lái)屬于A引腳的默認(rèn)復(fù)用功能

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論