91精品一区二区三区久久久久久_欧美一级特黄大片色_欧美一区二区人人喊爽_精品一区二区三区av

位置:51電子網 » 電子資訊 » 市場行情

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

熱門點擊

推薦電子資訊

iPhone5S/iPhone5C獲工信部認證
庫克一直看好中國市場的巨大潛力,并且自去年3月以來他已... [詳細]
版權所有:51dzw.COM
深圳服務熱線:13751165337  13692101218
粵ICP備09112631號-6(miitbeian.gov.cn)
公網安備44030402000607
深圳市碧威特網絡技術有限公司
付款方式


 復制成功!
封开县| 庄浪县| 宁夏| 承德县| 濮阳市| 贵溪市| 仁寿县| 蚌埠市| 宁夏| 兰坪| 元阳县| 育儿| 东阳市| 梁平县| 镇赉县| 建宁县| 绵阳市| 六盘水市| 武陟县| 瓮安县| 巴塘县| 葵青区| 维西| 六枝特区| 克拉玛依市| 阿拉善右旗| 姚安县| 南部县| 上虞市| 乐亭县| 华池县| 百色市| 安溪县| 波密县| 临武县| 七台河市| 曲松县| 龙海市| 马龙县| 花莲县| 永兴县|