看過 <
作業系統之前的程式 for stm32f4discovery (8.1) - user button by polling> (名字取的太長了) 之後, 這次我們來看看如何使用外部中斷。
如果你查過應該會看到類似的
程式碼:
stm32 提供了 libray, 用起來像是這樣, 簡單的不得了, 不過你一定想知道更深入吧! 尤其是那個 exti.c L33 EXTI0_IRQHandler 到底是怎麼來的? 我也是, 所以才有這篇文章。而事實上若是沒有 stm32 的 library, 要完成這樣的功能比想像中還要麻煩不少, 難度是 5 個數量級以上。
首先得先查詢 user button 接在哪裡, 答案是 PA0。這是 GPIO 的部份, 所以接下來要設定 GPIO; 再來是外部中斷, user button 被歸類在外部中斷, 來找出相關暫存器的設定資料吧! 有:
- System configuration controller (SYSCFG)
- Interrupts and events
- nvic register
根據
stm32f407 datasheet 備齊以上這些資訊之後, 才能正確設定這些暫存器。
搞了這麼久, 終於設定完畢, 可以寫 button isr 了, 疑! user button 的中斷編號是?
直接告訴你: 外部中斷第六號, 就是那個 EXTI0_IRQHandler, 還沒完, 那你知道 button isr 要放在哪個位址嗎?
事實上要能來到這裡, 你還得搞定如何寫出開機的程式, library 當然幫了不少忙, 這也不算簡單, 若有跟著這系列的朋友 (系列 1, 2 已經有提過了), 應該不是難題。
你可能會有個疑問, 那用 library 不就好了, 這當然不是壞事, 你可以這樣選擇, 我只是想把整個過程搞清楚。所以別人可能花一小時完成這功能 (google 完, 貼上 code, 搞定, 睡大覺去了), 我得要花上兩個寂寞的晚上。
來看程式碼:
這次不小心把程式分成幾個檔案: user_button.c exti.c syscfg.c
exti.c syscfg.c 對照 datasheet 看就可以了。
user_button.c L239 ~ L243 設定 nvic, 很簡單吧! 都有注解要參考的資料了, 不會很難懂。其他和
8.1 的設定都一樣 (因為是從 8.1 抄過來的阿)。
再來是 L264 是怎麼來的? 這要看 stm32.h L166, 剛好是外部中斷第六號, wwdg_isr 是第零號, 依序數下去。
把所有的努力集合起來就是: 設定好相關暫存器, 確定外部中斷號碼, 建立相關 isr, 搞定。
在 user button 按下的時候, 就會跳到 exti0_isr 執行。
我在完成這些事情之後, 測試之下, 按下 user button, 竟然會一直跳到 exti0_isr, 就差一點了, 程式就可以正常執行, 實在令人氣惱。
這篇
文章幫了我大忙, 卡在 button isr 一直會被觸發, 需要設定 Pending register (EXTI_PR) 才不會一值發動 isr。所以才有 user_button.c L269 這行。
我並非所有的資訊都是來自文件, 有些是直接看程式碼的, 要是每份文件去掃完, 可能現在還在看文件, 這是查詢範例程式碼的優點; 文件/程式碼各有其優缺點, 交互參照可以提升效率。
source code:
https://github.com/descent/stm32f4_prog
commit 1f10eecb06dfecc5a1fc0731c30c01ecd10ff58b
ref:
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。