GPIO口speed的問題
發布時間:2017/7/8 22:58:25 訪問次數:1692
- 51電子網公益庫存:
- IA3222B-F-FTR
- JCS4N60VB
- K20101B
- L2B2570-2230
- M12L128168A-6TG2L
- N01L83W2AN25I
- OBCI1F51
- P0084UC
- QN8035-NCME
- R1173S331B-E2-F
- S104T2CPE
- T60407M5014X00281
- U3761MB
- V48C5C50AL
- W19B160BBT7H
背景
配置stm32f103使其完成pwm輸出的過程中,在配置gpio口的時候,按照習慣配置gpio口的speed為50mhz,突然就意識到,為什么大部分例程習慣配置為50mhz,而不是其它值,即有了此文章。http://ecdz.51dzw.com
正文
先說說gpio口speed的問題,這個一般是用來定義gpio口上升沿或者下降沿的時間,頻率越高,上升沿下降沿時間越短,但是其噪音也就越大,因此,如果沒有特別的需求,該值應該不要配置太高。在技術手冊里,其給了3個速度選擇,庫函數的相應表現形式如下:
/**
* @brief output maximum frequency selection
*/typedef enum{
gpio_speed_10mhz = 1,
gpio_speed_2mhz,
gpio_speed_50mhz
}gpiospeed_typedef;
50mhz,意味著gpio口理論上1s可以翻轉50兆次,即1微妙翻轉50次,pwm應該不需要如此高的頻率,所以,本次pwm的gpio口速度配置為10mhz。
再來說說gpio口其他配置,庫函數gpio口配置的函數為:
/**
* @brief initializes the gpiox peripheral according to the specified
* parameters in the gpio_initstruct.
* @param gpiox: where x can be (a..g) to select the gpio peripheral.
* @param gpio_initstruct: pointer to a gpio_inittypedef structure that
* contains the configuration information for the specified gpio peripheral.
* @retval none
*/void gpio_init(gpio_typedef* gpiox, gpio_inittypedef* gpio_initstruct){ // ... 詳細內容省略}
首先傳入的第一個參數,勿用多說,即是配置哪一組gpio口。http://ecdz.51dzw.com
詳細說說第二個參數,其主要形式表現為:
typedef struct{ uint16_t gpio_pin;
gpiospeed_typedef gpio_speed;
gpiomode_typedef gpio_mode;
}gpio_inittypedef;
"gpio_pin"很好理解,配置該組io口的具體哪一個gpio,該值可用或的形式,例如:
gpio_initstructure.gpio_pin = gpio_pin_0 | gpio_pin_1 | gpio_pin_2 | gpio_pin_3;
該配置代表配置該gpio口的pin0/1/2/3腳。
"gpio_speed"前文已述。
"gpio_mode"則是代表該gpio口工作在哪種工作模式下,配置的值如下:
/**
* @brief configuration mode enumeration
*/typedef enum{ gpio_mode_ain = 0x0, // 模擬輸入
gpio_mode_in_floating = 0x04, // 輸入浮空
gpio_mode_ipd = 0x28, // 輸入下拉
gpio_mode_ipu = 0x48, // 輸入上拉
gpio_mode_out_od = 0x14, // 開漏輸出
gpio_mode_out_pp = 0x10, // 推挽輸出
gpio_mode_af_od = 0x1c, // 第二功能開漏輸出
gpio_mode_af_pp = 0x18 // 第二功能推挽輸出}gpiomode_typedef;
首先說說數字輸入,其有三種狀態:輸入浮空/輸入下拉/輸入上拉,io口配置為輸入時,port口工作原理圖如下:
如上圖所示,當gpio口配置為數字輸入時,輸出功能被禁能了。
“輸入上拉”:gpio口透過內部的上拉電阻連接到vdd,此時,gpio口的狀態為高電平,當gpio口連接到button時,button另一端接地。button閉合時,gpio口被拉至低電平,cpu即可判別button按下。在實際使用的情況來看,內部弱上拉,信號總是沒有外部上拉來的穩定,特別在上電即需要檢測io狀態的情況,并且基本上內部弱上拉只適合檢測button這種不嚴格的電平狀況,所以如果有條件外接上拉電阻的話,還是不要配置為弱上拉。
“輸入下拉”:很好解釋了,gpio口透過下拉電阻直接接地,此時gpio口狀態為低電平,若用來檢測button,button的另一端不再接地,而是接到vcc,此處得十分注意灌電流,以免燒壞mcu。
“輸入浮空”:則是即不配置為輸入上拉,也不配置為輸入下拉。即io口處于電平不穩定狀態,若是gpio口閑置未使用,推薦將其配置為輸入上拉或者輸入下拉,以免干擾正常程序的進行。輸入浮空狀態通常配合外接上拉或者外接下拉使用。http://ecdz.51dzw.com
接著說數字輸出,其也有兩種狀態:開漏輸出/推挽輸出,io口配置為輸出時,port口工作原理圖如下:
“開漏輸出”:p-mos管是被禁止的,當向output寄存器寫入“0”的時候,n-mos管直接導通,將io口接地,當寫入“1”的時候,io口處于高阻態狀態。這種情況一般用于外部自帶驅動的情況。
“推挽輸出”:當向output寄存器寫入“0”時,n-mos管直接導通,將io口接地,當寫入“1”時,p-mos管,導通,gpio口直接接入vdd,此時向外輸出高電平,但驅動能力一般都很弱,還得考慮灌電流的大小,若是需要驅動大功率器件,外部一般還會增加外放驅動電路。
第二功能輸出狀態:什么是第二功能,即有些io口存在復用的情況,復用的功能即被稱作第二功能,輸出配置如上所示,當io口被配置為輸出時,其輸入被默認配置為輸入浮空狀態,以i2c為例,i2c從機,不僅僅要檢測sda的狀態收取數據,還要可以輸出狀態發送數據,所以第二功能基本上配置為輸出,使其即可輸入檢測,也可輸出,輸出方式如何配置視具體情況而言,勿用多言。
最后,模擬輸入,其port口工作原理圖如下:
被配置為模擬輸入后,輸入檢測的施密特觸發器和輸出部分全部關閉了。輸入的值直接接入對應的模擬檢測外設,譬如adc。
說了這么多,接下來以配置tim2輸出pwm的gpio口配置為例:
tim2_ch1在“pa0”口,首先使能gpio a的時鐘,
rcc_apb2periphclockcmd( rcc_apb2periph_gpioa, enable );
接著配置io為復用推挽輸出,輸出速率選擇10mhz,
gpio_initstructure.gpio_pin = gpio_pin_0 ; // pa0:a口的第0個引腳gpio_initstructure.gpio_mode = gpio_mode_af_pp; // 復用推挽輸出gpio_initstructure.gpio_speed = gpio_speed_10mhz; // 翻轉頻率10mhzgpio_init(gpioa, &gpio_initstructure);
gpio如此配置,然后配置定時器(不再詳述),最后在pa0即可輸出pwm波形了。
來源:21ic
- 51電子網公益庫存:
- IA3222B-F-FTR
- JCS4N60VB
- K20101B
- L2B2570-2230
- M12L128168A-6TG2L
- N01L83W2AN25I
- OBCI1F51
- P0084UC
- QN8035-NCME
- R1173S331B-E2-F
- S104T2CPE
- T60407M5014X00281
- U3761MB
- V48C5C50AL
- W19B160BBT7H
背景
配置stm32f103使其完成pwm輸出的過程中,在配置gpio口的時候,按照習慣配置gpio口的speed為50mhz,突然就意識到,為什么大部分例程習慣配置為50mhz,而不是其它值,即有了此文章。http://ecdz.51dzw.com
正文
先說說gpio口speed的問題,這個一般是用來定義gpio口上升沿或者下降沿的時間,頻率越高,上升沿下降沿時間越短,但是其噪音也就越大,因此,如果沒有特別的需求,該值應該不要配置太高。在技術手冊里,其給了3個速度選擇,庫函數的相應表現形式如下:
/**
* @brief output maximum frequency selection
*/typedef enum{
gpio_speed_10mhz = 1,
gpio_speed_2mhz,
gpio_speed_50mhz
}gpiospeed_typedef;
50mhz,意味著gpio口理論上1s可以翻轉50兆次,即1微妙翻轉50次,pwm應該不需要如此高的頻率,所以,本次pwm的gpio口速度配置為10mhz。
再來說說gpio口其他配置,庫函數gpio口配置的函數為:
/**
* @brief initializes the gpiox peripheral according to the specified
* parameters in the gpio_initstruct.
* @param gpiox: where x can be (a..g) to select the gpio peripheral.
* @param gpio_initstruct: pointer to a gpio_inittypedef structure that
* contains the configuration information for the specified gpio peripheral.
* @retval none
*/void gpio_init(gpio_typedef* gpiox, gpio_inittypedef* gpio_initstruct){ // ... 詳細內容省略}
首先傳入的第一個參數,勿用多說,即是配置哪一組gpio口。http://ecdz.51dzw.com
詳細說說第二個參數,其主要形式表現為:
typedef struct{ uint16_t gpio_pin;
gpiospeed_typedef gpio_speed;
gpiomode_typedef gpio_mode;
}gpio_inittypedef;
"gpio_pin"很好理解,配置該組io口的具體哪一個gpio,該值可用或的形式,例如:
gpio_initstructure.gpio_pin = gpio_pin_0 | gpio_pin_1 | gpio_pin_2 | gpio_pin_3;
該配置代表配置該gpio口的pin0/1/2/3腳。
"gpio_speed"前文已述。
"gpio_mode"則是代表該gpio口工作在哪種工作模式下,配置的值如下:
/**
* @brief configuration mode enumeration
*/typedef enum{ gpio_mode_ain = 0x0, // 模擬輸入
gpio_mode_in_floating = 0x04, // 輸入浮空
gpio_mode_ipd = 0x28, // 輸入下拉
gpio_mode_ipu = 0x48, // 輸入上拉
gpio_mode_out_od = 0x14, // 開漏輸出
gpio_mode_out_pp = 0x10, // 推挽輸出
gpio_mode_af_od = 0x1c, // 第二功能開漏輸出
gpio_mode_af_pp = 0x18 // 第二功能推挽輸出}gpiomode_typedef;
首先說說數字輸入,其有三種狀態:輸入浮空/輸入下拉/輸入上拉,io口配置為輸入時,port口工作原理圖如下:
如上圖所示,當gpio口配置為數字輸入時,輸出功能被禁能了。
“輸入上拉”:gpio口透過內部的上拉電阻連接到vdd,此時,gpio口的狀態為高電平,當gpio口連接到button時,button另一端接地。button閉合時,gpio口被拉至低電平,cpu即可判別button按下。在實際使用的情況來看,內部弱上拉,信號總是沒有外部上拉來的穩定,特別在上電即需要檢測io狀態的情況,并且基本上內部弱上拉只適合檢測button這種不嚴格的電平狀況,所以如果有條件外接上拉電阻的話,還是不要配置為弱上拉。
“輸入下拉”:很好解釋了,gpio口透過下拉電阻直接接地,此時gpio口狀態為低電平,若用來檢測button,button的另一端不再接地,而是接到vcc,此處得十分注意灌電流,以免燒壞mcu。
“輸入浮空”:則是即不配置為輸入上拉,也不配置為輸入下拉。即io口處于電平不穩定狀態,若是gpio口閑置未使用,推薦將其配置為輸入上拉或者輸入下拉,以免干擾正常程序的進行。輸入浮空狀態通常配合外接上拉或者外接下拉使用。http://ecdz.51dzw.com
接著說數字輸出,其也有兩種狀態:開漏輸出/推挽輸出,io口配置為輸出時,port口工作原理圖如下:
“開漏輸出”:p-mos管是被禁止的,當向output寄存器寫入“0”的時候,n-mos管直接導通,將io口接地,當寫入“1”的時候,io口處于高阻態狀態。這種情況一般用于外部自帶驅動的情況。
“推挽輸出”:當向output寄存器寫入“0”時,n-mos管直接導通,將io口接地,當寫入“1”時,p-mos管,導通,gpio口直接接入vdd,此時向外輸出高電平,但驅動能力一般都很弱,還得考慮灌電流的大小,若是需要驅動大功率器件,外部一般還會增加外放驅動電路。
第二功能輸出狀態:什么是第二功能,即有些io口存在復用的情況,復用的功能即被稱作第二功能,輸出配置如上所示,當io口被配置為輸出時,其輸入被默認配置為輸入浮空狀態,以i2c為例,i2c從機,不僅僅要檢測sda的狀態收取數據,還要可以輸出狀態發送數據,所以第二功能基本上配置為輸出,使其即可輸入檢測,也可輸出,輸出方式如何配置視具體情況而言,勿用多言。
最后,模擬輸入,其port口工作原理圖如下:
被配置為模擬輸入后,輸入檢測的施密特觸發器和輸出部分全部關閉了。輸入的值直接接入對應的模擬檢測外設,譬如adc。
說了這么多,接下來以配置tim2輸出pwm的gpio口配置為例:
tim2_ch1在“pa0”口,首先使能gpio a的時鐘,
rcc_apb2periphclockcmd( rcc_apb2periph_gpioa, enable );
接著配置io為復用推挽輸出,輸出速率選擇10mhz,
gpio_initstructure.gpio_pin = gpio_pin_0 ; // pa0:a口的第0個引腳gpio_initstructure.gpio_mode = gpio_mode_af_pp; // 復用推挽輸出gpio_initstructure.gpio_speed = gpio_speed_10mhz; // 翻轉頻率10mhzgpio_init(gpioa, &gpio_initstructure);
gpio如此配置,然后配置定時器(不再詳述),最后在pa0即可輸出pwm波形了。
來源:21ic上一篇:高通收購恩智浦有利于產業發展
下一篇:聯接可接合的線程
熱門點擊
- 賽普拉斯助力打造領先的汽車系統
- GPIO口speed的問題
- 家電產業發展趨勢
- 2017全球3D NAND趨勢
- 全球IT顯示面板需求分析
- 半導體行業人才供需狀況
- 芯片進入10nm時代
- 掌握核心科技
- 推動承載網面向新業務的優化調整
- 監控視頻捕獲和處理
推薦電子資訊
- iPhone5S/iPhone5C獲工信部認證
- 庫克一直看好中國市場的巨大潛力,并且自去年3月以來他已... [詳細]