STM32F10x GPIO -1

STM32F10x GPIO 

GPIO的功能8種模式 ,可以通過程式設計選擇:
 1. 浮空輸入(Input floating)
 2. 輸入上拉(Input pull-up)
3. 輸入下拉(Input-pull-down)
4.  模擬輸入(Analog Input)
5. 開漏輸出(Output open-drain)
6. 推挽輸出(Output push-pull)
7. 複用功能的推挽輸出(Alternate function push-pull)
8. 複用功能的開漏輸出(Alternate function open-drain)


I/O口的輸出模式下,3種輸出速度可選(2MHz10MHz50MHz),這個速度是指I/O驅動電
路的回應速度而不是輸出信號的速度,輸出信號的速度與程式有關(晶片內部在I/O口 的輸出
部分安排了多個回應速度不同的輸出驅動電路,使用者可以根據自己的需要選擇合適的驅動
電路)。通過選擇速度來選擇不同的輸出驅動模組,達到最佳的雜訊控制和降低功耗的目
。高頻的驅動電路,雜訊也高,當不需要高的輸出頻率時,請選用低頻驅動電路,這樣非
常有利於提高系統的EMI性能。當然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅動
模組,很可能會得到失真的輸出信號。

關鍵是GPIO的引腳速度跟應用匹配(推薦8倍以上,必要也可用10倍計算)。比如:
1.  對於USART,假如最大串列傳輸速率只需115.2k,那麼用2M的GPIO的引腳速度就夠了,(因0.1152M *8 < 2M )既省電也雜訊小。
.2. 對於I2C介面,假如使用400k串列傳輸速率,那麼用2M的GPIO的引腳速度或許不夠
(因0.4M *8 > 2M ),這時可以選用10M的GPIO引腳速度。
3.  對於SPI介面,假如使用18M或9M串列傳輸速率,用10M的GPIO的引腳速度顯然不夠了,需要選用50M的GPIO的引腳速度。
 

 為什麼要提出這一段,因為在GPIO的應用上,我常和硬體工程師有不同的意見,
我們寫韌體往往是硬體工程師告訴我們GPIO他們是怎麼設計的,而等到拿到硬體時,開始或
寫完程式,CODE往硬體一載入後,才會發現在GPIO的應用硬體工程師規劃的不太一樣
這時往往必須硬體工程師有一些爭論及共同DEBUG。
而這些討論往往只是為了 pull-high 或者pull-low。
pull-high 或者pull-low定義是什麼: 
pull-high 上拉:通過一個電阻對電源相連。
pull-low下拉:通過一個電阻到地。
------上拉就是將不確定的信號通過一個電阻限在高電位!電阻同時起限流作用!下拉同理!  


而問題來了上圖的設計是針對LED控制的設計,圖中PB0輸出0,LED會亮,PB0的電流方向是流向PB0也就是灌電流了;而PB1要輸出1,LED會亮,PB1的電流方向是從PB1流出,也就是拉電流了。而這樣的設計是用PB0還是PB1那種好,如果只是用來部的指示,PB1的設計是比較好的。

而PB0的設計是直接將PB0連接Vcc3.3V是個最簡單的拉高電位的方法,但直接連接電源會導致輸入電流過大,容易燒壞引腳,因此需要在Vcc和PB0間加一個上拉電阻,而問題在這個電阻是要放多少才好,往往在實驗時電阻用的太低發生慘劇,老是怪罪硬體他人,尤其是在I2C的設計上阻值用的不好,更是說FW寫的有問題。




留言

這個網誌中的熱門文章

STM32 I2C-EEPROM 的讀寫

如何提高STM32 ADC的精度

ENC28J60+Uip TCP Server/Client