先聊聊題外話,學習stm32,我大多從了解功能、框圖到暫存器定義,然後在使用方法、配置步驟。其實配置時使用庫函式是相當方便的,甚至可以不用看暫存器,但為深入了解一下,有時還是會多看看,而了解其方法脈絡後再使用庫函式更方便,只需查相應的庫函式手冊即可。
stm32的外部中斷資源豐富、使用靈活。在f1系統中最多有20個中斷源(網際網路型,其他型別有19個)。exti0~ exti15給io口使用,exti16~ exti18分別分配給rtc、pvd、usb。可檢測脈衝寬度低於apb2時鐘寬度的外部訊號。
如圖所示,io口通過線路映像對輸入線上,邊沿檢測電路檢測到輸入線上有上公升沿或下降沿的訊號時會請求掛起,相應中斷/事件開啟後,會響應中斷或事件。軟體對軟體中斷暫存器置位也會引起掛起,若相應中斷/事件開啟,也會響應中斷或事件。
對映io口和中斷線的關係是每組io(gpioa、gpiob。。。。。。。)對應的位只對映對應的中斷線上。如pa0 、pb0只能在exti0 上,pa1 、pb1只能在exti1 上…….但具體是哪組gpio是可選的。如下圖。exti線16連線到pvd輸出, exti線17連線到rtc鬧鐘事件, exti線18連線到usb喚醒事件, exti線19連線到乙太網喚醒事件(只適用於互聯型產品)。
由上述可知事件與中斷的**都一樣也就是相應的掛起,比如io口接收到乙個上公升/丁降沿,這個訊號被檢測到後會產生對應的掛起。如果這個掛起之後的處理需要cpu參與(比如點亮乙個led,發個訊號)那麼需使用中斷,在中斷函式中增加**,cpu處理。如不需cpu介入,直接對其他外設提供乙個通知訊號(如dma、tim、adc取樣等)則可使用事件的方式。
在設定外部中斷中有幾個暫存器需了解:
外部中斷配置(afio_exticrx): 用來配置io與中斷線對映關係;
中斷遮蔽暫存器(exti_imr): 使能/關閉對應輸入線上中斷;
事件遮蔽暫存器(exti_emr):使能/關閉對應輸入線上事件;
上公升沿觸發選擇暫存器(exti_rtsr)、下降沿觸發選擇暫存器(exti_ftsr):選擇觸發沿,可以上公升下降均使能,即邊沿均可產生中斷,但不能設定高、低電平中斷。
軟體中斷事件暫存器(exti_swier):置對應位,會在對應線上產生掛起。
掛起暫存器(exti_pr):發生掛起,對應位為1,對該位寫1可以清除該位。
使用外部中斷步驟:
① 初始化io,(設定輸入模式、使能gpio時鐘、afio時鐘);
② 設定io與中斷線的對映(操作afio exticrx);
③ 開啟對應的外部中斷線上的事件/中斷,設定觸發沿;
④ 配置nvic,使能中斷;
⑤ 編寫中斷函式。
STM32外部中斷
一 基本概念 arm coetex m3核心共支援256個中斷,其中16個內部中斷,240個外部中斷和可程式設計的256級中斷優先順序的設定。stm32目前支援的中斷共84個 16個內部 68個外部 還有16級可程式設計的中斷優先順序的設定,僅使用中斷優先順序設定8bit中的高4位。stm32可支援...
stm32外部中斷
外部中斷程式配置流程 rcc 時鐘配置 void rcc configuration void 時鐘配置 開啟各路時鐘 rcc apb2periphclockcmd rcc apb2periph usart1 rcc apb2periph gpioa rcc apb2periph afio,enab...
stm32外部中斷
好久沒玩微控制器了,最近閒著沒事想拿出來玩玩,沒想到乙個stm32的外部中斷讓我花費了兩天時間,好的的挫折啊!終於下午除錯成功,下面來說一下我的除錯之路吧!硬體就是兩個按鍵,四個led,led事共陽極接法,按鍵一端接地一端接gpio口,通過按鍵中斷控制led。程式寫好以後發現始終無法進入中斷,開始查...