簡述gpio如何進行模式配置
⑴ STM8當中的GPIO各模式如何用
TM8的通用輸入/輸出口用於晶元和外部進行數據傳輸。一個IO埠可以包括多達8個引腳,每個引腳可以被獨立編程作為數字輸入或者數字輸出口。另外部分口還可能會有如模擬輸入,外部中斷,片上外設的輸入/輸出等復用功能。但是在同一時刻僅有一個復用功能可以映射到引腳上。
復用功能的映射是通過選項位元組控制的。請參考數據手冊關於選項位元組的描述。
每個埠都分配有一個輸出數據寄存器,一個輸入引腳寄存器,一個數據方向寄存器,一個選擇寄存器,和一個配置寄存器。一個I/O口工作在輸入還是輸出是取決於該口的數據方向寄存器的狀態。
GPIO主要功能
可選擇的輸入模式:浮動輸入和帶上拉輸入
可選擇的輸出模式:推挽式輸出和開漏輸出
數據輸入和輸出採用獨立的寄存器
外部中斷可以單獨使能和關閉
輸出擺率控制用以減少EMC雜訊
片上外設的I/O功能復用
當作為模擬輸入時可以關閉輸入施密特觸發器來降低功耗
在數據輸出鎖存時支持讀-修改-寫
輸入兼容5V電壓
I/O口工作電壓范圍為1.6 V到VDDIOmax
I/O的配置和使用
每一個埠都有一個輸出數據寄存器(ODR),一個引腳輸入寄存器(IDR)和一個數據方向寄存器(DDR)總是同相關的。
控制寄存器1(CR1)和控制寄存器2(CR2)用於對輸入/輸出進行配置。任何一個I/O引腳可以通過對DDR,ODR,CR1和CR2寄存器的相應位進行編程來配置。
寄存器中的位n對應於口的引腳n。各種不同配置總結如表18。
(表18:IO口配置表)
注意:連接VDD的二極體在實際開漏極狀態引腳是無效的,在引腳和VOL之間的局部保護設備重要性是有效的。
沒有使用的I/O引腳必須連接到一個固定的電平值。或者是上拉或者是下拉。
輸入模式
將DDRx位清零就選擇了輸入模式。在該模式下讀IDR寄存器的位將返回對應I/O引腳上的電平值。
如表18所示,理論上STM8可以通過軟體配置得到四種不同的輸入模式:懸浮不帶中斷輸入,懸浮帶中斷輸入,上拉不帶中斷輸入和上拉帶中斷輸入。但是在實際情況下不是所有的口都具有外部中斷能力和上拉,用戶應參考數據手冊中關於每個引腳的實際硬體性能描述來了解更多細節。
輸出模式
將DDRx位置1就選擇了輸出模式。在該模式下向ODR寄存器的位寫入數據將會通過鎖存器輸出對應數字值到I/O口。讀IDR的位將會返回相應的I/O引腳電平值。通過軟體配置CR1,CR2寄存器可以得到不同的輸出模式:上拉輸出,開漏輸出。
低功耗模式
表19低功耗模式對STM8S的GPIO口的影響
模式 描述
等待(Wait) 對I/O口無影響。外部中斷可以使MCU退出等待(Wait)模式
停機(Halt) 對I/O口無影響。外部中斷可以使MCU從停機(Halt)模式喚醒
注意:如果PA1/PA2被用來連接外部諧振器,為了確保在HALT模式下有最低功耗必須配置PA1和PA2為帶上拉輸入。
⑵ 如何實現gpio口模式的配置
一、 STM32的輸入輸出管腳有下面8種(4輸入 2輸出 2復用輸出)可能的配置:
① 浮空輸入_IN_FLOATING
② 帶上拉輸入_IPU
③ 帶下拉輸入_IPD
④ 模擬輸入_AIN
⑤ 開漏輸出_OUT_OD
⑥ 推挽輸出_OUT_PP
⑦ 復用功能的推挽輸出_AF_PP
⑧ 復用功能的開漏輸出_AF_OD
1.1 I/O口的輸出模式下,有3種輸出速度可選(2MHz、10MHz和50MHz),這個速度是指I/O口驅動電路的響應速度而不是輸出信號的速度,輸出信號的速度與程序有關(晶元內部在I/O口 的輸出部分安排了多個響應速度不同的輸出驅動電路,用戶可以根據自己的需要選擇合適的驅動電路)。通過選擇速度來選擇不同的輸出驅動模塊,達到最佳的雜訊控制和降低功耗的目的。高頻的驅動電路,雜訊也高,當不需要高的輸出頻率時,請選用低頻驅動電路,這樣非常有利於提高系統的EMI性能。當然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅動模塊,很可能會得到失真的輸出信號。
輸出速度又稱輸出驅動電路的響應速度,可理解為:輸出驅動電路的帶寬,即一個驅動電路可以不失真地通過信號的最大頻率。
如果一個信號的頻率超過了驅動電路的響應速度,就有可能信號失真。如果信號頻率為10MHz,而你配置了2MHz的帶寬,則10MHz的方波很可能就變成了正弦波。就好比是公路的設計時速,汽車速度低於設計時速時,可以平穩地運行,如果超過設計時速就會顛簸,甚至翻車。
關鍵是: GPIO的引腳速度跟應用相匹配,速度配置越高,雜訊越大,功耗越大。
帶寬速度高的驅動器耗電大、雜訊也大,帶寬低的驅動器耗電小、雜訊也小。使用合適的驅動器可以降低功耗和雜訊。
GPIO的引腳速度跟應用匹配(推薦10倍以上)。比如:
1.1.1 對於串口,假如最大波特率只需115.2k,那麼用2M的GPIO的引腳速度就夠了,既省電也雜訊小。
1.1.2 對於I2C介面,假如使用400k波特率,若想把餘量留大些,那麼用2M的GPIO的引腳速度或許不夠,這時可以選用10M的GPIO引腳速度。
1.1.3 對於SPI介面,假如使用18M或9M波特率,用10M的GPIO的引腳速度顯然不夠了,需要選用50M的GPIO的引腳速度。
1.2 GPIO口設為輸入時,輸出驅動電路與埠是斷開,所以輸出速度配置無意義。
1.3 在復位期間和剛復位後,復用功能未開啟,I/O埠被配置成浮空輸入模式。
1.4 所有埠都有外部中斷能力。為了使用外部中斷線,埠必須配置成輸入模式。
1.5 GPIO口的配置具有上鎖功能,當配置好GPIO口後,可以通過程序鎖住配置組合,直到下次晶元復位才能解鎖。
二、GPIO的翻轉速度指:輸入/輸出寄存器的0 ,1 值反映到外部引腳(APB2上)高低電平的速度.手冊上指出GPIO最大翻轉速度可達18MHz。通過簡單的程序測試,用示波器觀察到的翻轉時間是綜合的時間,包括取指令的時間、指令執行的時間、指令執行後信號傳遞到寄存器的時間(這其中可能經過很多環節,比如AHB、APB、匯流排仲裁等),最後才是信號從寄存器傳輸到引腳所經歷的時間。如有上拉電阻,其阻值越大,RC延時越大,即邏輯電平轉換的速度越慢,功耗越大。
三、在STM32中如何配置片內外設使用的IO埠
首先,一個外設經過 ①配置輸入的時鍾和 ②初始化後即被激活(開啟);③如果使用該外設的輸入輸出管腳,則需要配置相應的GPIO埠(否則該外設對應的輸入輸出管腳可以做普通GPIO管腳使用);④再對外設進行詳細配置。
對應到外設的輸入輸出功能有下述三種情況:
① 外設對應的管腳為輸出:需要根據外圍電路的配置選擇對應的管腳為復用功能的推挽輸出或復用功能的開漏輸出。
② 外設對應的管腳為輸入:則根據外圍電路的配置可以選擇浮空輸入、帶上拉輸入或帶下拉輸入。
③ ADC對應的管腳:配置管腳為模擬輸入。
如果把埠配置成復用輸出功能,則引腳和輸出寄存器斷開,並和片上外設的輸出信號連接。將管腳配置成復用輸出功能後,如果外設沒有被激活,那麼它的輸出將不確定。
四、 通用IO埠(GPIO)初始化
4.1 GPIO初始化
41.1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C, ENABLE):使能APB2匯流排外設時鍾;
41.2 RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):釋放GPIO復位。
4.2 置各個PIN埠(模擬輸入_AIN、輸入浮空_IN_FLOATING、輸入上拉_IPU、輸入下拉_IPD、開漏輸出_OUT_OD、推挽式輸出_OUT_PP、推挽式復用輸出_AF_PP、開漏復用輸出_AF_OD)。
4.3GPIO初始化完成。
五、 的GPIO操作函數
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//讀GPIO某一位的輸入
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//讀GPIO的輸入
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//讀GPIO某一位的輸出
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//讀GPIO的輸出
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//將GPIO的某個位置位
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//將GPIO的某個位復位
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//寫GPIO的某個位
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//寫GPIO
六、管腳的復用功能 重映射
1、復用功能:內置外設是與I/O口共用引出管腳(不同的功能對應同一管腳)
STM32 所有內置外設的外部引腳都是與標准GPIO引腳復用的,如果有多個復用功能模塊對應同一個引腳,只能使能其中之一,其它模塊保持非使能狀態。
2、重映射功能:復用功能的引出腳可以通過重映射,從不同的I/O管腳引出,即復用功 能的引出腳位是可通過程序改變到其他的引腳上!
直接好處:PCB電路板的設計人員可以在需要的情況下,不必把某些信號在板上繞一大圈完成聯接,方便了PCB的設計同時潛在地減少了信號的交叉干擾。
如:USART1: 0: 沒有重映像(TX/PA9,RX/PA10); 1: 重映像(TX/PB6,RX/PB7)。
(參考AFIO_MAPR寄存器介紹)[0,1為一寄存器的bit值]
【注】 下述復用功能的引出腳具有重映射功能:
- 晶體振盪器的引腳在不接晶體時,可以作為普通I/O口
- CAN模塊; - JTAG調試介面;- 大部分定時器的引出介面; - 大部分USART引出介面
- I2C1的引出介面; - SPI1的引出介面;
舉例:對於STM32F103VBT6,47引腳為PB10,它的復用功能是I2C2_SCL和 USART3_TX,表示在上電之後它的默認功能為PB10,而I2C2的SCL和USART3的TX為它的復用功能;另外在TIM2的引腳重映射後,TIM2_CH3也成為這個引腳的復用功能。
(1)要使用STM32F103VBT6的47、48腳的USART3功能,則需要配置47腳為復用推挽輸出或復用開漏輸出,配置48腳為某種輸入模式,同時使能USART3並保持I2C2的非使能狀態。
(2)使用STM32F103VBT6的47腳作為TIM2_CH3,則需要對TIM2進行重映射,然後再按復用功能的方式配置對應引腳。
⑶ stm32的gpio有哪幾種工作模式
一、推挽輸出:可以輸出高、低電平,連接數字器件;推挽結構一般是指兩個三極體分別受兩個互補信號的控制,總是在一個三極體導通的時候另一個截止。高低電平由IC的電源決定。
推挽電路是兩個參數相同的三極體或MOSFET,以推挽方式存在於電路中,各負責正負半周的波形放大任務,電路工作時,兩只對稱的功率開關管每次只有一個導通,所以導通損耗小、效率高。輸出既可以向負載灌電流,也可以從負載抽取電流。推拉式輸出級既提高電路的負載能力,又提高開關速度。
二、開漏輸出:輸出端相當於三極體的集電極,要得到高電平狀態需要上拉電阻才行。適合於做電流型的驅動,其吸收電流的能力相對強(一般20mA以內)。開漏形式的電路有以下幾個特點:
1、利用外部電路的驅動能力,減少IC內部的驅動。當IC內部MOSFET導通時,驅動電流是從外部的VCC流經上拉電阻、MOSFET到GND。IC內部僅需很小的柵極驅動電流。
2、一般來說,開漏是用來連接不同電平的器件,匹配電平用的,因為開漏引腳不連接外部的上拉電阻時,只能輸出低電平,如果需要同時具備輸出高電平的功能,則需要接上拉電阻,很好的一個優點是通過改變上拉電源的電壓,便可以改變傳輸電平。比如加上上拉電阻就可以提供TTL/CMOS電平輸出等。(上拉電阻的阻值決定了邏輯電平轉換的速度。阻值越大,速度越低功耗越小,所以負載電阻的選擇要兼顧功耗和速度。)
3、開漏輸出提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因為上升沿是通過外接上拉無源電阻對負載充電,所以當電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。
4、可以將多個開漏輸出連接到一條線上。通過一隻上拉電阻,在不增加任何器件的情況下,形成「與邏輯」關系,即「線與」。可以簡單的理解為:在所有引腳連在一起時,外接一上拉電阻,如果有一個引腳輸出為邏輯0,相當於接地,與之並聯的迴路「相當於被一根導線短路」,所以外電路邏輯電平便為0,只有都為高電平時,與的結果才為邏輯1。
關於推挽輸出和開漏輸出,最後用一幅最簡單的圖形來概括:該圖中左邊的便是推挽輸出模式,其中比較器輸出高電平時下面的PNP三極體截止,而上面NPN三極體導通,輸出電平VS+;當比較器輸出低電平時則恰恰相反,PNP三極體導通,輸出和地相連,為低電平。右邊的則可以理解為開漏輸出形式,需要接上拉。
三、浮空輸入:對於浮空輸入,一直沒找到很權威的解釋,只好從以下圖中去理解了
由於浮空輸入一般多用於外部按鍵輸入,結合圖上的輸入部分電路,我理解為浮空輸入狀態下,IO的電平狀態是不確定的,完全由外部輸入決定,如果在該引腳懸空的情況下,讀取該埠的電平是不確定的。
四、上拉輸入/下拉輸入/模擬輸入:這幾個概念很好理解,從字面便能輕易讀懂。
五、復用開漏輸出、復用推挽輸出:可以理解為GPIO口被用作第二功能時的配置情況(即並非作為通用IO口使用)
六、總結在STM32中選用IO模式
1、浮空輸入GPIO_IN_FLOATING ——浮空輸入,可以做KEY識別,RX1
2、帶上拉輸入GPIO_IPU——IO內部上拉電阻輸入
3、帶下拉輸入GPIO_IPD—— IO內部下拉電阻輸入
4、模擬輸入GPIO_AIN ——應用ADC模擬輸入,或者低功耗下省電
5、開漏輸出GPIO_OUT_OD
——IO輸出0接GND,IO輸出1,懸空,需要外接上拉電阻,才能實現輸出高電平。當輸出為1時,IO口的狀態由上拉電阻拉高電平,但由於是開漏輸出模式,這樣IO口也就可以由外部電路改變為低電平或不變。可以讀IO輸入電平變化,實現C51的IO雙向功能
6、推挽輸出GPIO_OUT_PP ——IO輸出0-接GND, IO輸出1 -接VCC,讀輸入值是未知的
7、復用功能的推挽輸出GPIO_AF_PP ——片內外設功能(I2C的SCL,SDA)
8、復用功能的開漏輸出GPIO_AF_OD——片內外設功能(TX1,MOSI,MISO.SCK.SS)
七、STM32設置實例:
1、模擬I2C使用開漏輸出_OUT_OD,接上拉電阻,能夠正確輸出0和1;讀值時先GPIO_SetBits(GPIOB,
GPIO_Pin_0);拉高,然後可以讀IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
2、如果是無上拉電阻,IO默認是高電平;需要讀取IO的值,可以使用帶上拉輸入_IPU和浮空輸入_IN_FLOATING和開漏輸出_OUT_OD;
八、通常有5種方式使用某個引腳功能,它們的配置方式如下:
1、作為普通GPIO輸入:根據需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,同時不要使能該引腳對應的所有復用功能模塊。
2、作為普通GPIO輸出:根據需要配置該引腳為推挽輸出或開漏輸出,同時不要使能該引腳對應的所有復用功能模塊。
3、作為普通模擬輸入:配置該引腳為模擬輸入模式,同時不要使能該引腳對應的所有復用功能模塊。
4、作為內置外設的輸入:根據需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,同時使能該引腳對應的某個復用功能模塊。
5、作為內置外設的輸出:根據需要配置該引腳為復用推挽輸出或復用開漏輸出,同時使能該引腳對應的所有復用功能模塊。
注意如果有多個復用功能模塊對應同一個引腳,只能使能其中之一,其它模塊保持非使能狀態。比如要使用STM32F103VBT6的47、48腳的USART3功能,則需要配置47腳為復用推挽輸出或復用開漏輸出,配置48腳為某種輸入模式,同時使能USART3並保持I2C2的非使能狀態。如果要使用STM32F103VBT6的47腳作為TIM2_CH3,則需要對TIM2進行重映射,然後再按復用功能的方式配置對應引腳。
⑷ 請問如何根據硬體或是數據手冊配置GPIO的輸入輸出模式
用的最多的推挽輸出 模擬輸入,用庫的方式直接寫就完了,用寄存器麻煩一點。現在已經很多資料了,庫的方式很多,寄存器的正點原子的不錯。希望幫到你。
⑸ gpio介面怎麼用
一、gpio用途
General Purpose Input Output (通用輸入/輸出)簡稱為GPIO,或匯流排擴展器,人們利用工業標准I2C、SMBus或SPI介面簡化了I/O口的擴展。當微控制器或晶元組沒有足夠的I/O埠,或當系統需要採用遠端串列通信或控制時,GPIO產品能夠提供額外的控制和監視功能。
每個GPIO埠可通過軟體分別配置成輸入或輸出。Maxim的GPIO產品線包括8埠至28埠的GPIO,提供推挽式輸出或漏極開路輸出。提供微型3mm x 3mm QFN封裝。
不同系統間的GPIO的確切作用不同。通用常有下面幾種:
1.輸出值可寫(高=1,低=0)。一些晶元也可以選擇驅動這些值的方式,以便支持「線-或」或類似方案(開漏信號線)。
2.輸入值可讀(1,0)。一些晶元支持輸出管腳回讀,這在線或的情況下非常有用(以支持雙向信號線)。GPIO控制器可能具有一個輸入防故障/防反跳邏輯,有時還會有軟體控制。
3.輸入經常被用作中斷信號,通常是邊沿觸發,但也有可能是電平觸發。這些中斷可以配置為系統喚醒事件,從而將系統從低功耗模式喚醒。
4.一個GPIO經常被配置為輸入/輸出雙向,根據不同的產品單板需求,但也存在單向的情況。
5.大多是GPIO可以在獲取到spinlock自旋鎖時訪問,但那些通過串列匯流排訪問的通常不能如此操作(休眠的原因)。一些系統中會同時存在這兩種形式的GPIO。
6.在一個給定單板上,每個GPIO用於一個特定的目的,如監控MMC/SD卡的插入/移除,檢查卡防寫狀態,驅動LED,配置發送器,串列匯流排位拆,觸發一個硬體看門狗,觸發一個開關之類的。
二、GPIO使用方法
要使用GPIO,系統首先要分配一個GPIO,使用gpio_request() 為系統分配一個GPIO。
接下來要做的一件事是標示GPIO的方向,通常在使用GPIO建立一個platform_device時(位於單板的setup代碼中)。
返回0標示成功,或是一個負的errno錯誤碼。它應該被檢查,因為get/set調用沒有錯誤返回,且可能會有錯誤配置。你通常應該在線程上下文中使用這些調用。雖然如此,對於spinlock-safe的GPIO,在tasking使能之前使用也是可以的,作為一個早期的單板建立。
對於輸出GPIO,value參數提供了初始輸出值。這有助於避免系統啟動過程中的信號干擾。
為了與GPIO早期的介面兼容,設置一個GPIO的方向,隱性要求申請GPIO。這個兼容性從可選的gpiolib架構中移除了。
為了與GPIO早期的介面兼容,設置一個GPIO的方向,隱性要求申請GPIO。這個兼容性從可選的gpiolib架構中移除了。
如果GPIO號碼無效或是指定的GPIO不能使用對應模式操作的話,設置方向會失敗。依靠boot固件設置好GPIO的方向通常不是一個好主意,因為boot的功能可能沒有通過驗證(除了boot linux)。(類似的,單板setup代碼可能需要將管腳復用為一個GPIO,和配置為合適的上拉/下拉)
⑹ stm32的gpio的配置模式有哪幾種,如何進行配置模式的配置
1、輸入浮空GPIO的配置可以在這里找到資料網頁鏈接
2、輸入上拉
3、輸入下拉
4、模擬輸入#
5、開漏輸出
6、推挽輸出
7、推挽式復用功能
8、開漏復用功能
⑺ 初始化gpio時如何配置重定義功能
這個只是宏定義,只是告訴你對這個變數(SPI_SDI)操作就是對PA7這個口操作,並沒有做一些GPIO口工作模式設置,具體用還需要具體配置,幾個腳配置為復用,然後再對SPI的寄存器進行配置為你說的SPI作為主模式工作之類的,就是初始化了,如果你想具體看下,給我郵箱我發相關例子給你,寄存器和庫的都有
⑻ STM32F4中,對於 GPIOX需要配置哪些項目(可以採用代碼舉例、和文字說明的方式
強烈建議你使用 STM32CubeMX工具來配置。
具體點說,gpio外設的時鍾、管腳的復用功能、輸入輸出模式的配置。
拿個常式看看可以。
⑼ 如何配置GPIO
要將GPIO這些口配置成輸出狀態,然後通過C寫DATA寄存器的地址,比如6個進制為010101,那麼就將
*DATA = 0x15
一般DATA是一個32bit的寄存器,對應32個GPIO口
如果GPIO配置為輸出,那麼寫DATA就對應輸出相應電平,讀DATA無效
如果GPIO配置為輸入,那麼讀DATA就反映對應引腳電平,寫DATA無效
⑽ 如何實現一次對多GPIO進行配置
以LED燈為例子:
void led(void)
{
/*定義一個GPIO_InitTypeDef類型的結構體*/
GPIO_InitTypeDef GPIO_InitStructure;
/*開啟GPIOB的外設時鍾*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);
/*選擇要控制的GPIOB引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8;
/*設置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設置引腳速率為50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*調用庫函數,初始化GPIOB*/
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 讓選擇引腳輸出高電平*/
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1);
}
其中GPIO有多個模式,需要按照不同功能和使用來配置。這里LED燈需要輸出,所以我設置為通用推挽。