關於引腳復用,不得不提的GPIO_Pin_sources 和GPIO_Pin


今天在端口復用時遇到了困惑,參考:http://www.51hei.com/bbs/dpj-40992-1.html

 

調整前的代碼
GPIO_PinAFConfig(GPIOA,GPIO_Pin_9,GPIO_AF_4);
GPIO_PinAFConfig(GPIOA,GPIO_Pin_10,GPIO_AF_4);

調整后的代碼
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_4);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_4);

 

 

不難看出,該工程師調整的就是上面紅色參數部分。一個是GPIO_Pin_N,一個是GPIO_PinSourceN,其實這2個參數是不一樣的。

 

GPIO_Pin_n可以理解為某端口腳在整個端口的位置。比方某GPIO口的第6管腳位置編碼GPIO_Pin_6 被定義為 ((uint16_t)0x0040) ,在對相應GPIO管腳做基本屬性配置時會用到,如配置輸入輸出模式、模擬輸入模式的選擇等。有興趣的話,可以點擊GPIO_Init( )進去看看。

 

 

而GPIO_PinSourceN一般是在對某GPIO口相應pin腳的復用功能進行選擇配置才會用到。它是根據端口各腳位的位置按順序從0開始依次遞增編號,可以理解為該管腳在該端口的序號。比方某GPIO口的第6號復用功能腳的序號GPIO_PinSource6 被定義為 ((uint8_t)0x06) 。有興趣的話,也可以打開GPIO_PinAFConfig( )函數看看。顯然,GPIO_PinSource6跟上面的GPIO_Pin_6的值相差甚遠。

 

 

下面是ST官方庫代碼中有關GPIO_Pin_N的定義:

 

 

#define GPIO_Pin_0 ((uint16_t)0x0001)

#define GPIO_Pin_1 ((uint16_t)0x0002)

#define GPIO_Pin_2 ((uint16_t)0x0004)

#define GPIO_Pin_3 ((uint16_t)0x0008)

#define GPIO_Pin_4 ((uint16_t)0x0010)

#define GPIO_Pin_5 ((uint16_t)0x0020)

#define GPIO_Pin_6 ((uint16_t)0x0040)

#define GPIO_Pin_7 ((uint16_t)0x0080)

#define GPIO_Pin_8 ((uint16_t)0x0100)

#define GPIO_Pin_9 ((uint16_t)0x0200)

#define GPIO_Pin_10 ((uint16_t)0x0400)

。。。。。。

#define GPIO_Pin_15 ((uint16_t)0x8000)

#define GPIO_Pin_All ((uint16_t)0xFFFF)

 

下面是有關GPIO_PinSourceN的定義:

#define GPIO_PinSource0 ((uint8_t)0x00)

#define GPIO_PinSource1 ((uint8_t)0x01)

#define GPIO_PinSource2 ((uint8_t)0x02)

#define GPIO_PinSource3 ((uint8_t)0x03)

#define GPIO_PinSource4 ((uint8_t)0x04)

#define GPIO_PinSource5 ((uint8_t)0x05)

#define GPIO_PinSource6 ((uint8_t)0x06)

#define GPIO_PinSource7 ((uint8_t)0x07)

#define GPIO_PinSource8 ((uint8_t)0x08)

#define GPIO_PinSource9 ((uint8_t)0x09)

#define GPIO_PinSource10 ((uint8_t)0x0A)

。。。。。。

#define GPIO_PinSource15 ((uint8_t)0x0F)

 

 

小結:上面的問題只有基於STM32官方固件庫開發時才會碰到。說實在的,這兩個參數的確容易讓人誤解成一個東西或者弄混淆,尤其剛接觸的人。經常有人在這個地方遇到麻煩,之前我在一篇文章中提到過。這里再特意提醒下。

不過ST官方后來推出的STM32CUBE庫在這個地方的代碼寫法做了調整,不再定義GPIO_PinSourceN。當然,因為管腳配置導致異常的問題時有發生,建議使用ST官方推出的STM32CUBE配置環境及CUBE參考固件庫着手開發,這樣會省不少事。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM