開始要進入MCU(Micro-Controller Unit, 單晶片或微處理機)的主題了,我們就從最基礎的GPIO開始介紹吧。STM32的GPIO算是MCU裡面比較複雜的,學習上也比較麻煩,不過沒關係,功能多的好處就是代表之後可以調整的彈性比較大。
我們先看reference manual 裡面的GPIO完整的介紹,可以看到用PDF選擇書籤,找出GPIO的位置。這個章節都會介紹GPIO。
下圖是一般的GPIO硬體架構示意圖,input時除了可以pull-up 與pull-down電阻,output也可以選擇Push-pull 或是open drain 的功能,事實上,如果只是純粹學習的話,其實只要管可以on/off就好,但如果需要做到產品的階段,這些功能就會非常有好用,或者還可以幫忙硬體上省點不必要的花費和金錢。但就是和筆者一樣的韌體工程師,在這裡就不得不抱怨一下,台灣的企業總是只看價格,不在於軟韌體的支援,他們覺得這些都是無形的價錢,也就是「無價」(笑)。
當我們把GPIO設定成Input時,這時後MCU內部的設定就會變成:
ü 關閉output driver
ü 可以允許pull-up pull-down 電阻
ü 加入TTL 史密特電路 (防止在unknow voltage彈跳)
當我們把GPIO設定成Output時,這時後MCU內部的設定就會變成:
ü 可以選擇push-pull 或是open drain 的輸出方式
ü pull-up和pull-down 電阻無法由程式設定,在特殊的腳位上才擁有此功能
ü 可以回讀write registor (寫入的狀態)的資料
ü 可以回讀外部pin腳的狀態,(如果這支腳外部被接到gnd,那麼雖然期待出是1,但此這裡回讀就會是0),這是一個非常好用的功能,可以檢查外部的pin腳實際狀態。
當我們知道GPIO的原理的時候,我們就要來試試看,如何讓GPIO可以照著我們的想法,點亮LED。今天我們選用STM 32F 3
Discovery 上面的PE.14 和 PE.15來做閃爍的控制。
Discovery 上面的PE.14 和 PE.15來做閃爍的控制。
其實ST原廠提供了一支副程式可以直接呼叫,但在這裡我會用另外一種方式來做操作,在此之前,先介紹一下,這次要用到的3支副程式:
void GPIO_SetBits
( GPIO_TypeDef * GPIOx,
uint16_t GPIO_Pin) ;
( GPIO_TypeDef * GPIOx,
uint16_t GPIO_Pin) ;
void
GPIO_ResetBits ( GPIO_TypeDef
* GPIOx, uint16_t GPIO_Pin) ;
GPIO_ResetBits ( GPIO_TypeDef
* GPIOx, uint16_t GPIO_Pin) ;
void
GPIO_WriteBit ( GPIO_TypeDef
* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) ;
GPIO_WriteBit ( GPIO_TypeDef
* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) ;
細節可以參考「UM158 – User
manual : Description
of STM 32F 30xx/31xx
Standard Peripheral Library」 這裡就不再多加介紹了。
manual : Description
of STM 32F 30xx/31xx
Standard Peripheral Library」 這裡就不再多加介紹了。
那我寫了幾個不一樣的寫法
以上2種就看客倌喜歡那種寫法,不過對筆者來說,其實這樣的寫法對於後續的維護,都不是一件易事,所以筆者習慣再用巨集(macro)重新包裝一次,讓之後的維護或是修改上,擁有較佳的彈性。
以上就是簡單的測試利用GPIO驅動LED, 至於input和其他功能嘛,等待之後有機會,再一併做介紹。
下一篇預告: 中斷介紹
該如何用STM32F3 GPIO 實現 I2C 的 SDA 雙向功能呢 ?
回覆刪除是採用 Output OD mode 嗎 ?
回覆刪除我沒有真實用過,但你可以試試將gpio
刪除input enable
然後output設成OD mode
應該就行了。