<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x
    查看: 6320|回復: 1
    打印 上一主題 下一主題

    [提問] STM32GPIO外部中斷總結

    [復制鏈接]
    跳轉到指定樓層
    樓主
    發表于 2018-3-15 14:29:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    1
    STM32中斷分組

    STM32 的每一個GPIO都能配置成一個外部中斷觸發源,這點也是 STM32 的強大之處。STM32 通過根據引腳的序號不同將眾多中斷觸發源分成不同的組,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0為第一組,那么依此類推,我們能得出一共有16 組,STM32 規定,每一組中同時只能有一個中斷觸發源工作,那么,最多工作的也就是16個外部中斷。STM32F103 的中斷控制器支持 19 個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和屏蔽設置。STM32F103 的19 個外部中斷為:

    線 0~15:對應外部 IO 口的輸入中斷。

    線 16:連接到 PVD 輸出。

    線 17:連接到 RTC 鬧鐘事件。

    線 18:連接到 USB 喚醒事件。

    2
    外部中斷的配置過程

    1.配置觸發源GPIO口

    因為GPIO口作為觸發源使用,所以將GPIO口配置成輸入模式,觸發模式有以下幾種:

    a.GPIO_Mode_AIN ,模擬輸入(ADC模擬輸入,或者低功耗下省電)

    b.GPIO_Mode_IN_FLOATING ,浮空輸入

    c.GPIO_Mode_IPD ,帶下拉輸入

    d.GPIO_Mode_IPU ,帶上拉輸入 

    GPIO_InitTypeDef GPIO_InitStructure;//定義結構體

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能時鐘

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2;//選擇IO口   PE2

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//設置成上拉輸入

    GPIO_Init(GPIOE, &GPIO_InitStructure);//使用結構體信息進行初始化IO口


    2.使能AFIO復用時鐘功能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 

    3.將GPIO口與中斷線映射起來

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

    4.中斷線上進行中斷初始化

    EXTI_InitTypeDef EXTI_InitStructure;//定義初始化結構體

    EXTI_InitStructure.EXTI_Line=EXTI_Line2; //中斷線的標號 取值范圍為EXTI_Line0~EXTI_Line15

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷模式,可選值為中斷 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//觸發方式,可以是下降沿觸發 EXTI_Trigger_Falling,上升沿觸發 EXTI_Trigger_Rising,或者任意電平(上升沿和下降沿)觸發EXTI_Trigger_Rising_Falling

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure);//根據結構體信息進行初始化


    5.中斷優先級配置

    NVIC_InitTypeDef NVIC_InitStructure;//定義結構體

    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能外部中斷所在的通道

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級 2,

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子優先級 2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道

    NVIC_Init(&NVIC_InitStructure); //根據結構體信息進行優先級初始化

    6.外部中斷服務函數的編寫

    外部中斷函數分別為:

    EXPORT EXTI0_IRQHandler

    EXPORT EXTI1_IRQHandler

    EXPOR T EXTI2_IRQHandler

    EXPORT EXTI3_IRQHandler

    EXPORT EXTI4_IRQHandler

    EXPORT EXTI9_5_IRQHandler

    EXPORT EXTI15_10_IRQHandler

    中斷線 0-4 每個中斷線對應一個中斷函數,中斷線 5-9 共用中斷函數 ,EXTI9_5_IRQHandler,中斷線 10-15 共用中斷函數 EXTI15_10_IRQHandler!
    void EXTI2_IRQHandler(void)

    {

    if(EXTI_GetITStatus(EXTI_Line2)!=RESET)//判斷某個線上的中斷是否發生

    {

     中斷邏輯…

     EXTI_ClearITPendingBit(EXTI_Line2);   //清除 LINE 上的中斷標志位

       }

    }

    使用按鍵進行外部中斷的時候,一般都需要進行按鍵延時消抖以及松手檢測的相關處理,中斷函數可以參看以下代碼:
    void EXTI2_IRQHandler(void)

    {

     delay_ms(10);//延時消抖

     if(KEY2==0)    //按鍵真的被按下

      {

       LED0=!LED0;

      }

     while(KEY2!=0);//等待松手

     EXTI_ClearITPendingBit(EXTI_Line2); //清楚中斷標志位

    }

    當然,如果你的按鍵是允許長按功能的,那么就進行別的邏輯操作,這里不作研究。

    信盈達靠技術打天下
    以下課程可免費試聽C語言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。
    想學習的你和我聯系預約就可以免費聽課了。
    宋工企鵝號:35--24-65--90-88   Tel/WX:173--17--95--19--08


    沙發
    發表于 2018-5-25 14:27:09 | 只看該作者
    寫的很好,頂一個 我是PCB線路廠家,專業生產1-10層快板,最快12小時發貨,來電咨詢0755 33066135    扣扣:2851557686
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷