2013年2月25日 星期一

[STM32F3 教學] GPIO



開始要進入MCU(Micro-Controller Unit, 單晶片或微處理機)的主題了,我們就從最基礎的GPIO開始介紹吧。STM32GPIO算是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-uppull-down 電阻無法由程式設定,在特殊的腳位上才擁有此功能



ü      可以回讀write registor (寫入的狀態)的資料



ü      可以回讀外部pin腳的狀態,(如果這支腳外部被接到gnd,那麼雖然期待出是1,但此這裡回讀就會是0),這是一個非常好用的功能,可以檢查外部的pin腳實際狀態。






當我們知道GPIO的原理的時候,我們就要來試試看,如何讓GPIO可以照著我們的想法,點亮LED。今天我們選用STM 32F 3
Discovery
上面的PE.14 PE.15來做閃爍的控制。



其實ST原廠提供了一支副程式可以直接呼叫,但在這裡我會用另外一種方式來做操作,在此之前,先介紹一下,這次要用到的3支副程式:





void GPIO_SetBits
(
GPIO_TypeDef * GPIOx,
uint16_t GPIO_Pin) ;



void
GPIO_ResetBits (
GPIO_TypeDef
* GPIOx, uint16_t GPIO_Pin) ;



void
GPIO_WriteBit (
GPIO_TypeDef
* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) ;





細節可以參考「UM158 – User
manual :
Description
of STM 32F 30xx/31xx
Standard Peripheral Library
這裡就不再多加介紹了。



那我寫了幾個不一樣的寫法












以上2種就看客倌喜歡那種寫法,不過對筆者來說,其實這樣的寫法對於後續的維護,都不是一件易事,所以筆者習慣再用巨集(macro)重新包裝一次,讓之後的維護或是修改上,擁有較佳的彈性。









以上就是簡單的測試利用GPIO驅動LED 至於input和其他功能嘛,等待之後有機會,再一併做介紹。



下一篇預告: 中斷介紹


3 則留言:

  1. 該如何用STM32F3 GPIO 實現 I2C 的 SDA 雙向功能呢 ?

    回覆刪除
  2. 回覆
    1. 我沒有真實用過,但你可以試試將gpio
      input enable
      然後output設成OD mode
      應該就行了。

      刪除