新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32中斷管理函數

        STM32中斷管理函數

        作者: 時間:2016-11-28 來源:網絡 收藏

        通過以上兩個函數就實現了對 NVIC 的管理和配置。但是外部中斷的設置,還需要配置相
        關寄存器才可以。下面就介紹外部中斷的配置和使用。
        STM32 的EXTI 控制器支持19 個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事
        件都有獨立的觸發和屏蔽設置。STM32 的19 個外部中斷為:
        線 0~15:對應外部IO 口的輸入中斷。
        線 16:連接到PVD 輸出。
        線 17:連接到RTC 鬧鐘事件。
        線 18:連接到USB 喚醒事件。
        對于外部中斷 EXTI 控制MDK 定義了如下結構體:
        typedef struct
        {
        vu32 IMR;
        vu32 EMR;
        vu32 RTSR;
        vu32 FTSR;
        vu32 SWIER;
        vu32 PR;
        } EXTI_TypeDef;
        通過這些寄存器的設置,就可以對外部中斷進行詳細設置了。下面我們就重點介紹這些寄
        存器的作用。
        IMR:中斷屏蔽寄存器。這是一個32 寄存器。但是只有前19 位有效。當位x 設置為1 時,
        則開啟這個線上的中斷,否則關閉該線上的中斷。
        EMR:事件屏蔽寄存器,同IMR,只是該寄存器是針對事件的屏蔽和開啟。
        RTSR:上升沿觸發選擇寄存器。該寄存器同IMR,也是一個32 為的寄存器,只有前19
        位有效。位x 對應線x 上的上升沿觸發,如果設置為1,則是允許上升沿觸發中斷/事件。否則,
        不允許。
        FTSR:下降沿觸發選擇寄存器。同PTSR,不過這個寄存器是設置下降沿的。下降沿和上
        升沿可以被同時設置,這樣就變成了任意電平觸發了。
        SWIER:軟件中斷事件寄存器。通過向該寄存器的位x 寫入1,在未設置IMR 和EMR 的
        時候,將設置PR 中相應位掛起。如果設置了IMR 和EMR 時將產生一次中斷。被設置的SWIER
        位,將會在PR 中的對應位清除后清除。
        PR:掛起寄存器。當外部中斷線上發生了選擇的邊沿事件,該寄存器的對應位會被置為1。
        0,表示對應線上沒有發生觸發請求。通過向該寄存器的對應位寫入1 可以清除該位。在中斷服
        務函數里面經常會要向該寄存器的對應位寫1 來清除中斷請求。
        以上就是與中斷相關寄存器的介紹,更詳細的介紹,請參考《STM32 參考手冊》第95 頁,
        8.3 節EXTI 寄存器描述這一章。
        通過以上配置就可以正常設置外部中斷了,但是外部 IO 口的中斷,還需要一個寄存器配
        置,也就是IO 復用里的外部中斷配置寄存器EXTICR。這是因為STM32 任何一個IO 口都可
        以配置成中斷輸入口,但是IO 口的數目遠大于中斷線數(16 個)。于是STM32 就這樣設計,
        GPIOA~GPIOG 的[15:0]分別對應中斷線15~0。這樣每個中斷線對應了最多7 個IO 口,以線0
        為例:它對應了GPIOA.0、PIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而
        中斷線每次只能連接到1 個IO 口上,這樣就需要EXTICR來決定對應的中斷線配置到哪個GPIO
        上了。
        EXTICR 在AFIO 的結構體中定義,如下:
        typedef struct
        {
        vu32 EVCR;
        vu32 MAPR;
        vu32 EXTICR[4];
        } AFIO_TypeDef;
        EXTICR 寄存器組,總共有4 個,因為編譯器的寄存器組都是從0 開始編號的,所以
        EXTICR[0]~ EXTICR[3],對應《STM32 參考手冊》里的EXTICR1~ EXTICR 4。每個EXTICR
        只用了其低16 位。EXTICR[0]的分配如下:

        比如如我要設置 GPIOB.1 映射到1,則只要設置EXTICR[0]的bit[7:4]為0001 即可。默認
        都是0000 即映射到GPIOA。從圖5.7 中可以看出,EXTICR[0]只管了GPIO 的0~3 端口,相應
        的其他端口由EXTICR[1~3]管理。具體請參考《STM32 參考手冊》第126~128 頁。
        通過對上面的分析我們就可以完成對外部中斷的配置了。該函數為 Ex_NVIC_Config,該
        函數有3 個參數:GPIOx 為GPIOA~G(0~6),在sys.h 里面有定義。代表要配置的IO 口。BITx
        則代表這個IO 口的第幾位。TRIM 為觸發方式,低2 位有效(0x01 代表下降觸發;0x02 代表
        上升沿觸發;0x03 代表任意電平觸發)。其代碼如下:
        //外部中斷配置函數
        //只針對GPIOA~G;不包括PVD,RTC 和USB 喚醒這三個
        //參數:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:觸發模式,1,下升沿;2,上
        降沿;3,任意電平觸發
        //該函數一次只能配置1 個IO 口,多個IO 口,需多次調用
        //該函數會自動開啟對應中斷,以及屏蔽線
        void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
        {
        u8 EXTADDR;
        u8 EXTOFFSET;
        EXTADDR=BITx/4;//得到中斷寄存器組的編號
        EXTOFFSET=(BITx%4)*4;
        RCC->APB2ENR|=0x01;//使能io 復用時鐘
        AFIO->EXTICR[EXTADDR]|=GPIOx<//自動設置
        EXTI->IMR|=1<EXTI->EMR|=1<if(TRIM&0x01)EXTI->FTSR|=1<if(TRIM&0x02)EXTI->RTSR|=1<}
        Ex_NVIC_Config 完全是按照我們之前的分析來編寫的,首先根據GPIOx 的位得到中斷寄
        存器組的編號,即EXTICR 的編號,在EXTICR 里面配置中斷線應該配置到GPIOx 的哪個位。
        然后使能該位的中斷及事件,最后配置觸發方式。這樣就完成了外部中斷的的配置了。從代碼
        中可以看到該函數默認是開啟中斷和事件的。其次還要注意的一點就是該函數一次只能配置一
        個IO 口,如果你有多個IO 口需要配置,則多次調用這個函數就可以了。
        至此,我們對 STM32 的中斷管理就介紹結束了。當然還有中斷響應函數,我們這里沒有
        介紹,這個在后面的實例中會向各位講述的。


        上一頁 1 2 下一頁

        關鍵詞: STM32中斷管理函

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 车致| 乐亭县| 南部县| 临沧市| 泸州市| 洪雅县| 永济市| 札达县| 临潭县| 霍林郭勒市| 邢台市| 乌海市| 明水县| 鞍山市| 静海县| 衡水市| 永靖县| 绵阳市| 荣昌县| 阳新县| 临邑县| 苍山县| 安庆市| 武强县| 广宁县| 岳西县| 咸阳市| 抚州市| 格尔木市| 罗山县| 涿鹿县| 县级市| 原阳县| 静海县| 台州市| 天等县| 新竹市| 瓦房店市| 淮安市| 牡丹江市| 阳原县|