夏天做哪些網(wǎng)站致富最新重大新聞
1.EXTI簡介
EXTI是External Interrupt的縮寫,指外部中斷。在嵌入式系統(tǒng)中,外部中斷是一種用于處理外部事件的機制。當外部事件發(fā)生時(比如按下按鈕、傳感器信號變化等),外部中斷可以立即打斷正在執(zhí)行的程序,轉(zhuǎn)而執(zhí)行一個特定的中斷服務(wù)程序(ISR),以響應(yīng)和處理外部事件。
在大多數(shù)嵌入式系統(tǒng)中,外部中斷可以配置為上升沿觸發(fā)、下降沿觸發(fā)、高電平觸發(fā)、低電平觸發(fā)等不同的觸發(fā)方式,以適應(yīng)不同的外部事件類型。外部中斷通常用于實時性要求較高的應(yīng)用,如實時控制系統(tǒng)、傳感器數(shù)據(jù)采集等。
在使用外部中斷時,需要了解具體的硬件平臺和編程語言的相關(guān)知識,以確保正確地配置和處理外部中斷。
2.EXTI功能框圖講解
?首先,中斷源從輸入線進入,總共有20根中斷/事件線,每一條線對應(yīng)著PXx,例如EXTI0的輸入源可以是PX0(X為A、B、C、D、E、F、G、H、I),因為GPIO端口有16個,所以x的取值在0-15,EXTI16的輸入源是PVD輸出,EXTI17的輸入源是RTC鬧鐘事件,EXTI18的輸入源是USB喚醒事件,EXTI19的輸入源是以太網(wǎng)喚醒事件(只適用互聯(lián)型)。
通過外部中斷配置寄存器1(AFIO_EXTICR1)配置來選擇輸入線,每一個EXTIx有四個位,可以選擇16個GPIO端口。
?
選擇輸入線和輸入源后進入邊緣檢測電路 ,邊緣檢測電路通過寄存器上升沿觸發(fā)選擇寄存器(EXTI_RTSR)和下降沿觸發(fā)選擇寄存器(EXTI_FTSR)選擇觸發(fā)方式。
通過配置的觸發(fā)方式,邊緣檢測電路輸出“1”給到或門,然后另一個輸入由軟件中斷事件寄存器輸入,當軟件中斷事件寄存器相應(yīng)位為’0’時,寫’1’將設(shè)置EXTI_PR中相應(yīng)的掛起位,是否相應(yīng)中斷請求由后面的總開關(guān)中斷屏蔽寄存器(EXTI_IMR)決定,這樣或門輸入兩個“1”,或門也輸出“1”,將這個“1”輸入給請求掛起寄存器就是中斷,輸入給與門就是事件,然后請求掛起寄存器輸出“1”給與門,然后中斷屏蔽寄存器(EXTI_IMR)對應(yīng)位置“1”,開放來自線x的中斷請求,與門輸出“1”給到NVIC中斷控制器,NVIC在內(nèi)核中,由內(nèi)核響應(yīng)這個中斷,內(nèi)核就會去查找相應(yīng)的中斷服務(wù)函數(shù)ESR。
3.GPIO中斷實例
3.1.初始化GPIO?
?通過原理圖查看按鍵對應(yīng)的GPIO端口
通過原理圖可以知道按鍵SW2連接的是GPIO的PA0,那么我們需要初始化PA0,并且將PA0連接到EXTI0。
初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);
3.2.初始化EXTI用于產(chǎn)生中斷/事件
?初始化EXTI方法和初始化GPIO相似,首先打開系統(tǒng)時鐘,然后選擇輸入線,通過函數(shù)GPIO_EXTILineConfig()配置,接著通過EXTI_InitTypeDef結(jié)構(gòu)體定義一個變量,通過這個變量配置EXTI的輸入線、模式、觸發(fā)方式,然后將配置的結(jié)構(gòu)體變量的地址傳遞給初始化EXTI函數(shù)EXTI_Init()。
EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
3.3.初始化NVIC
?初始化NVIC和初始化GPIO和初始化EXTI相似,都需要通過定義結(jié)構(gòu)體變量去配置相應(yīng)參數(shù)。首先定義結(jié)構(gòu)體變量NVIC_InitStructure。然后設(shè)置中斷優(yōu)先級級分組,通過函數(shù)NVIC_PriorityGroupConfig(),有5個組
沒個組有主優(yōu)先級和次優(yōu)先級,我們配置中斷優(yōu)先級的時候stm32使用了四個位,當主優(yōu)先級只是用0位時,取值就是0,次優(yōu)先級就使用四個位,取值就是0-15。同理,當主優(yōu)先級只是用1位時,取值就是0-1,次優(yōu)先級就使用3個位,取值就是0-7,以此類推。然后通過定義的結(jié)構(gòu)體變量配置中斷源,搶占優(yōu)先級,子優(yōu)先級。注意這里的中斷源配置,如果是GPIO0-4都是單獨的EXTIx_IRQn,但是如果你說4以后的端口,就會使用到EXTI9_5_IRQn和EXTI15_10_IRQn。然后將配置的結(jié)構(gòu)體變量的地址傳遞給初始化NVIC初始化函數(shù)NVIC_Init()。
NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
3.4.編寫中斷服務(wù)函數(shù)
?通斷服務(wù)函數(shù)都放在stm32f10x_it.c這個文件里面,中斷服務(wù)函數(shù)的名字已經(jīng)定義好了,放在startup_stm32f10x_hd.s文件的向量表中。通過if語句判斷函數(shù)EXTI_GetITStatus()的返回值來判斷是否產(chǎn)生中斷,如果產(chǎn)生中斷EXTI_GetITStatus()返回值位1。通過宏定義LED_G_TOGGLE
#define LED_G_TOGGLE {GPIOB->ODR ^= GPIO_Pin_0;}
通過控制端口輸出數(shù)據(jù)寄存器ODR異或運算控制LED交替,異或運算符與1異或改變,與0異或不變。為了防止一直在中斷里面,最后需要清除中斷位,通過函數(shù)?EXTI_ClearITPendingBit()。
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) != RESET){LED_G_TOGGLE;}EXTI_ClearITPendingBit(EXTI_Line0);
}
3.5.main函數(shù)
?最后,通過main函數(shù)調(diào)用前面寫的函數(shù)
int main(void)
{LED_GPIO_RCC();LED_GPIO_Config();EXIT_Key_Config();while(1){}
}