關於STM32F中按鍵中斷分析


  在按鍵學習中,我們有用到查詢的方法來判斷按鍵事件是否發生,這種查詢按鍵事件適用於程序工作量較少的情況下,一旦程序中工作量較大較多,則勢必影響程序運行的效率,為了簡化程序中控制的功能模塊的執行時間,引入中斷控制就很有必要,,一旦有中斷時間發生,則程序立馬跳轉到中斷向量的執行程序中,執行完成后就恢復到正常的程序狀態。

  在STM32F中采用中斷控制器NVIC來設定中斷。按照中斷初始化配置的結構體文件,我們需要在NVIC初始化結構體配置如下:

  void EXti_PB12_Config(void)

  {

  //定義結構體

  GPIO_InitTypeDef GPIO_InitStructure;

  EXTI_InitTypeDef EXTI_InitStructure;

  //開啟外設時鍾

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

  NVIC_Configuration();

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  // 中斷向量模式(PB12)

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);

  //給中斷向量成員賦值,這是因為PB12連接到EXTI_Line12;

  EXTI_InitStructure.EXTI_Line = EXTI_Line12;

  //設置中斷觸發模式,通過這個來不斷查詢相應的寄存器

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  //設置觸發模式為下降沿觸發

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

  //使能

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  //調用庫函數

  EXTI_Init(&EXTI_InitStructure);

  }

  static void NVIC_Configuration(void)

  {

  //定義結構體

  NVIC_InitTypeDef NVIC_InitStructure;

  //把NVIC中斷優先級分組設置為第一組

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  //PB12配置為EXT1第10-15線的中斷向量

  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;

  //設置搶占優先級為0

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  //設置響應優先級為0

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  //使能

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  //調用庫函數

  NVIC_Init(&NVIC_InitStructure);

  }

 

  從代碼可以看出,我們可以創建兩個文件,一個是EXTI_KEY.C和EXTI_KEY.H文件,將上述代碼放置於EXTI_KEY.C文件中。我們在配置中斷時,需要做以下工作:

  1、使能EXTIx線的時鍾和第二功能時鍾,前者是具體某個GPIO口的時鍾,這里代碼是PB12的時鍾;

  2、配置EXTIx的中斷優先級;主要體現在優先級分組,響應優先級,搶占優先級,優先級分組取值意味着設定了搶占優先級和響應優先級的個數,最大支持16個,也就是說他們之和是16,搶占優先級和響應優先級取值越低,意味着優先級越高,一般來說,優先級高的優先執行。

  3、選定要配置的EXTI的I/0線和I/O的工作模式,這里主要GPIO的初始化配置,以及該引腳掛靠的EXTI線。這里掛靠線為LINE12。

  4、配置EXTI中斷線工作模式。這里主要是配置中斷觸發模式(如上升沿觸發,下降沿觸發等等)

  在做完初始化工作后,我們發現,其實中斷配置的模式很固定化,一般修改值為工作2和3,可以實現不同GPIO口的中斷配置和中斷優先級配置。

  完成中斷初始化配置后,我們需要寫入中斷服務函數。在這里就要涉及到中斷標志位,觸發中斷和清除中斷標志位。其中斷服務函數如下:

  

void EXTI15_10_IRQHandler(void)

  {

  IF (EXTI_GetITStatus(EXTI_Line12) != RESET) //確保是否產生了中斷

  {

  寫入要控制的功能;

  EXTI_ClearITPendingBit(EXTI_Line12); //清除中斷標志位

  }

  }

 

  在中斷服務函數中,我們發現這個模板很固定,其采用的配置和中斷配置很相似,唯一的區別就是采用哪個功能引腳配置。

  在這一節中,我們主要是學習如何使用中斷。雖說在中斷沒有學習之前,都想象的難度很大。但是在使用STM32F的庫函數編程后,我們發現,類似於這種復雜的編程機器用庫函數輕松駕馭。所采用的的模板和格式都可以在官方的庫函數中找到原型,方便了程序的編寫。

  最后總結一下,中斷時打破當前程序的運行,直接執行中斷服務函數里面的功能,在中斷執行完之后一定要清除中斷,這樣才能跳出中斷,回到之前程序運行的階段。

分享一些32的知識
STM32中斷系統
http://www.makeru.com.cn/live/3523_1745.html?s=45051

(stm32串口應用)
http://www.makeru.com.cn/live/1392_1164.html?s=45051

(時鍾系統)
http://www.makeru.com.cn/live/1392_1082.html?s=45051

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM