1. 程式人生 > >stm32打怪升級之不要碰中斷

stm32打怪升級之不要碰中斷

順序 hand pin 序號 nbsp 相互 排序 rip 初始化

stm32中斷概念:單片機cpu在執行當前程序的時候,由於外界出現外界請求或內部請求,使cpu暫停正在執行的程序而去處理相應的請求程序,當程序運行完畢後,cpu再來執行原先被暫停的程序,這個過程就是中斷。又由於在處理請求程序過程中,可能被其他更高級或者低級的外界請求幹擾,這時候就要判斷優先級,先處理哪個請求程序,這個就是中斷優先級。中斷優先級分為搶占優先級和響應優先級,規則是:搶占優先級高可以中斷搶占優先級低的中斷函數,相同搶占之間不能相互中斷,而響應優先級則看一下中斷表裏的排位順序.

在使用中斷時的時候,要用NVIC分組,為什麽?判斷中斷表中的排序決定先處理哪一個而nvic就是這個中斷分組。

在stm32中有一個專門的函數來配置中斷優先級NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)其中 u32 NVIC_PriorityGroup可以設置成NVIC_PriorityGroup0~4。NVIC需要使用misc.h庫文件

EXTI是外部中斷,外部中斷初始化包含以下幾個結構體GPIO_Init()NVIC_Init()EXTI_Init()
PA0(15)---->AFIO_EXTICR1中EXTI0(15)--------->EXTI0
註意:一次性使用中斷只能有16個,且每組io序號只能用一次
2.AFIO_代表gpio的復用功能,有adc,串口等,而用作外部中斷或者使用重印射功能必須開啟afio時鐘
由上圖可以知道
首先得設置分組,然後io初始化。選擇io口,開啟中斷通道且設置參數
只要是外設就需要使用rcc外部時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)

然後gpio初始化GPIO_Init()有個結構體
GPIO_InitStructure.GPIO_Pin=k_left; #這裏的k_left實際上是一個外設,按鍵

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //是上拉電阻輸入,沒有輸入信號的時候為高電平
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
其次設置輸入的io口GPIO_EXTILineConfig()
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2)//因為我的按鍵在gpio的引腳為GPIOE組的第二管腳

然後對中斷優先級NVIC_Init()有個結構體
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //這裏使用的是中斷優先級1組即1個搶占優先級,3個響應優先級
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打開 EXTI2的全局中斷//這裏使用2作為中斷向量,在stm32f10x.h中的IRQn可以找到定義,這裏與EXTI_Line2對應的
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優先級為 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應優先級為 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);


最後初始化外部中斷EXTI_Init()有個結構體
EXTI_InitStructure.EXTI_Line=EXTI_Line2;//讀取外部中斷2,01234獨立一個,5-9共同一個,10-15共用一個
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中斷模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//中斷觸發模式
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure)

外部中斷的中斷函數EXTI2_IRQHandler()//2跟上面同理,看引腳是什麽,這裏是需要自己按需求寫,中斷後運行什麽程序就是在這裏面修改

包含EXTI_GetITStatus()函數讀取中斷標誌

EXTI_ClearITPendingBit()函數 清除中斷標誌

實際上原理就是,先把自己的外設(cpu需要執行的程序)初始化好,配置好參數,然後把中斷初始化配置好,自己中斷(外界請求或內部觸發命令程序)會運行什麽,按鍵?,傳感器?還是其他的,把這些都初始化好(中斷配置管腳和外部請求等程序得一一對應),然後再通過EXTI2_IRQHandle()函數將cpu執行的程序和中斷後執行的程序聯系起來。這就是我理解的一個完整的中斷程序過程,打紅線的部分就是按需要而進行修改的東西。是不是很簡單

stm32打怪升級之不要碰中斷