2018 7 17 GPIO口之輸出模式

2022-08-23 08:36:08 字數 2335 閱讀 4108

樑子20163933

io口可以配置的8種模式:

輸入浮空

輸入上拉

輸入下拉

模擬輸入

開漏輸出

推挽輸出

推挽式復用功能

開漏復用功能

stm32io口配置表

復位值:0x4444 4444(相當於是浮空輸入)

控制每個io埠(a~g)的低八位模式

每個io埠的位占用crl的四個位,高兩位是cnf,低兩位是mode

0x0:模擬輸入模式(adc用)

0x3:推免輸出模式(做輸出口用,50m速率)

crh與crl相似,只不過控制的是高八位。

gpio_typedef:代表的是指定的io介面(gpioa~gpiog)

gpio_inittypedef* : 初始化引數結構體指標

結構體的定義為:

typedef

struct

gpio_inittypedef;

在跑馬燈示例中對乙個介面的初始化**為:

gpio_initstructure.gpio_pin = gpio_pin_8; //led0-->pa.8 埠配置

gpio_initstructure.gpio_mode = gpio_mode_out_pp; //推挽輸出

gpio_initstructure.gpio_speed = gpio_speed_50mhz; //io口速度為50mhz

gpio_init(gpioa, &gpio_initstructure); //根據設定引數初始化gpioa.8

gpio_setbits(gpioa,gpio_pin_8); 輸出高

其中對mode屬性的初始化在mdk中是用乙個列舉進行定義的:

typedef enum

gpiomode_typedef; 

只能以16位的形式讀出,唯讀(r)。低16位(對應著乙個io口的16個引腳)。

可以通過讀取這個暫存器的某個位的狀態來獲得那個io口的引腳的電平狀態。

讀取函式:

uint8_t gpio_readinputdatabit(gpio_typedef* gpiox, uint16_t gpio_pin)

返回的是1(set)或者0(reset)。

只能以16位的形式輸出,可讀可寫(rw)。可讀相當於判斷當前io口的輸出狀態,而可寫相當於控制io口的輸出電平是高還是低。

讀取函式:

void

gpio_write(gpio_typedef* gpiox, uint16_t portval); 

//示例**:gpio_write(gpiod,0x0100) //使pd8置高 這個定要認真理解!!!!!

這個暫存器也可以控制埠的輸出,首先給出這個暫存器的內部結構:

對埠的低位(低16位)送1表示置1,高位置1表示置0;注意:所有的暫存器都是32位的

例子:gpioa ->bsrr=1

<<1; //這裡表示對aio介面的1號埠(引腳)置高電平

gpioa ->bsrr=1

<

在這裡必須要解釋一下這兩行容易誤導人的**:首先控制的是a口的「1」號埠,這個「1」是**中的《右邊的1,左邊的1代表的是把右邊的1的數置為1。

由於之前的暫存器都是只有前16位有效,後16位不起作用,所以這裡沒有太好的理解。事實是這樣的:乙個埠對應著32位暫存器中的兩個數字(比如

0號埠對應著0和16,1號埠對應著1和(16+1),這就是上面的**的原理)

功能與bsrr的高16位雷同。

如若通過韌體庫函式來進行實現,則可以將之變為:

void

gpio_setbits(gpio_typedef* gpiox, uint16_t gpio_pin); 

void

gpio_resetbits(gpio_typedef* gpiox,uint16_t gpio_pin); 

使能io口時鐘;

rcc_apb2periphclockcmd( ); 

初始化io引數,呼叫gpio_init();

利用上述的暫存器和韌體庫函式操作io.

樹莓派(十三) 多PWM通過GPIO口引腳輸出

import rpi.gpio as gpio import time gpio.setmode gpio.bcm gpio.setup 18,gpio.out pwm led0 gpio.pwm 18,10 將gpio27引腳的頻率設定為5hz 乙個脈衝時間長度0.2s pwm led0.star...

stm32學習1之GPIO口

ps 使用的32型號是.stm32f407zgt 原本我是不打算繼續更32的,但是最近的做的一些東西需要用到arm。所以想想就複習一下32吧!畢竟當初學的也確實不咋地。32系列我不會用很官方的話來講,我會用自己的理解最粗暴直白的表達出來。有什麼錯誤歡迎指正,企鵝 918619587 首先我們解釋一下...

STM32的GPIO口的輸出 開漏輸出和推挽輸出

推挽輸出與開漏輸出的區別 推挽輸出 可以輸出高,低電平,連線數字器件 開漏輸出 輸出端相當於三極體的集電極.要得到高電平狀態需要上拉電阻才行.適合於做電流型的驅動,其吸收電流的能力相對強 一般20ma以內 三極體的開漏輸出有什麼特性,和推挽是不是一回事,問題 很多晶元的供電電壓不一樣,有3.3v和5...