新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32開(kāi)發(fā)板例程講解之二:GPIO的描述和配置

STM32開(kāi)發(fā)板例程講解之二:GPIO的描述和配置

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏

//******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****

void SystemInit (void)在system_stm32f10x.c中:

void SystemInit (void)

{

// 復(fù)位RCC時(shí)鐘配置到默認(rèn)狀態(tài)(用于調(diào)試)

// Set HSION bit

RCC->CR |= (uint32_t)0x00000001;

//Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits

#ifndef STM32F10X_CL

RCC->CFGR &= (uint32_t)0xF8FF0000;

#else

RCC->CFGR &= (uint32_t)0xF0FF0000;

#endif //STM32F10X_CL

// Reset HSEON, CSSON and PLLON bits

RCC->CR &= (uint32_t)0xFEF6FFFF;

// Reset HSEBYP bit

RCC->CR &= (uint32_t)0xFFFBFFFF;

//Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits

RCC->CFGR &= (uint32_t)0xFF80FFFF;

#ifdef STM32F10X_CL

//Reset PLL2ON and PLL3ON bits

RCC->CR &= (uint32_t)0xEBFFFFFF;

//Disable all interrupts and clear pending bits

RCC->CIR = 0x00FF0000;

// Reset CFGR2 register

RCC->CFGR2 = 0x00000000;

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)

// Disable all interrupts and clear pending bits

RCC->CIR = 0x009F0000;

//Reset CFGR2 register

RCC->CFGR2 = 0x00000000;

#else

// Disable all interrupts and clear pending bits

RCC->CIR = 0x009F0000;

#endif // STM32F10X_CL

#if defined (STM32F10X_HD) || (defined STM32F10X_XL)

#ifdef DATA_IN_ExtSRAM

SystemInit_ExtMemCtl();

#endif // DATA_IN_ExtSRAM

#endif

//配置系統(tǒng)時(shí)鐘頻率,HCLK, PCLK2和 PCLK1 的預(yù)分頻

//配置Flash延遲周期,使能預(yù)存取緩沖區(qū)

SetSysClock();

}

再次總結(jié)一下GPIO的配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//

(1)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B |C, ENABLE):使能APB2總線外設(shè)時(shí)鐘

(2)RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):釋放GPIO復(fù)位

GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD;//開(kāi)漏輸出
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;//50M時(shí)鐘速度

//gpio A組中的哪些引腳,什么模式速度

typedefstruct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;

typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

typedef enum
{ GPIO_Mode_AIN =0x0,//模擬輸入
GPIO_Mode_IN_FLOATING =0x04,//浮空輸入
GPIO_Mode_IPD =0x28,//下拉輸入
GPIO_Mode_IPU =0x48,//上拉輸入
GPIO_Mode_Out_OD =0x14,//開(kāi)漏輸出
GPIO_Mode_Out_PP =0x10,//推挽輸出
GPIO_Mode_AF_OD =0x1C,//開(kāi)漏復(fù)用功能
GPIO_Mode_AF_PP =0x18//推挽復(fù)用功能
}GPIOMode_TypeDef;

庫(kù)寫的相當(dāng)嚴(yán)謹(jǐn) 使用了枚舉,也可見(jiàn)IO 的功能之多性能之強(qiáng)~!

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化IO口配置結(jié)束。

附注1:PLL(Phase Locked Loop): 為鎖相回路或鎖相環(huán),用來(lái)統(tǒng)一整合時(shí)脈訊號(hào),使內(nèi)存能正確的存取資料。PLL用于振蕩器中的反饋技術(shù)。許多電子設(shè)備要正常工作,通常需要外部的輸入信號(hào)與內(nèi)部的振蕩信號(hào)同步,利用鎖相環(huán)路就可以實(shí)現(xiàn)這個(gè)目的。

附注2:STM32的GPIO口的輸出:開(kāi)漏輸出和推挽輸出

1、推挽輸出與開(kāi)漏輸出的區(qū)別:

>>推挽輸出:可以輸出高,低電平,連接數(shù)字器件

>>開(kāi)漏輸出:輸出端相當(dāng)于三極管的集電極.要得到高電平狀態(tài)需要上拉電阻才行.適合于做電流型的驅(qū)動(dòng),其吸收電流的能力相對(duì)強(qiáng)(一般20ma以內(nèi)).

推挽結(jié)構(gòu)一般是指兩個(gè)三極管分別受兩互補(bǔ)信號(hào)的控制,總是在一個(gè)三極管導(dǎo)通的時(shí)候另一個(gè)截止.
要實(shí)現(xiàn) 線與 需要用OC(open collector)門電路.是兩個(gè)參數(shù)相同的三極管或MOSFET,以推挽方式存在于電路中,各負(fù)責(zé)正負(fù)半周的波形放大任務(wù),電路工作時(shí),兩只對(duì)稱的功率開(kāi)關(guān)管每次只有一個(gè)導(dǎo)通,所以導(dǎo)通損耗小,效率高。輸出既可以向負(fù)載灌電流,也可以從負(fù)載抽取電流。

當(dāng)端口配置為輸出時(shí):

開(kāi)漏模式:輸出 0 時(shí),N-MOS 導(dǎo)通,P-MOS 不被激活,輸出0。

輸出 1 時(shí),N-MOS 高阻, P-MOS 不被激活,輸出1(需要外部上拉電路),也就是說(shuō)此模式下只有N-MOS對(duì)輸出起作用;此模式可以把端口作為雙向IO使用。

推挽模式:輸出 0 時(shí),N-MOS 導(dǎo)通,P-MOS 高阻,輸出0。

輸出 1 時(shí),N-MOS 高阻,P-MOS 導(dǎo)通,輸出1(不需要外部上拉電路)。

簡(jiǎn)單來(lái)說(shuō),開(kāi)漏是0的時(shí)候接GND ,1的時(shí)候浮空;推挽是0的時(shí)候接GND ,1的時(shí)候接VCC。


2、開(kāi)漏電路特點(diǎn)及應(yīng)用

在電路設(shè)計(jì)時(shí)我們常常遇到開(kāi)漏(opendrain)和開(kāi)集(opencollector)的概念。所謂開(kāi)漏電路概念中提到的“漏”就是指MOSFET的漏極。同理,開(kāi)集電路中的“集”就是指三極管的集電極。開(kāi)漏電路就是指以MOSFET的漏極為輸出的電路。一般的用法是會(huì)在漏極外部的電路添加上拉電阻。完整的開(kāi)漏電路應(yīng)該由開(kāi)漏器件和開(kāi)漏上拉電阻組成。

組成開(kāi)漏形式的電路有以下幾個(gè)特點(diǎn):
1)利用外部電路的驅(qū)動(dòng)能力,減少IC內(nèi)部的驅(qū)動(dòng)。當(dāng)IC內(nèi)部MOSFET導(dǎo)通時(shí),驅(qū)動(dòng)電流是從外部的VCC流經(jīng)Rpull-up,MOSFET到GND。IC內(nèi)部?jī)H需很下的柵極驅(qū)動(dòng)電流。
2)可以將多個(gè)開(kāi)漏輸出的Pin,連接到一條線上。形成“與邏輯”關(guān)系。當(dāng)PIN_A、PIN_B、PIN_C任意一個(gè)變低后,開(kāi)漏線上的邏輯就為0了。這也是I2C,SMBus等總線判斷總線占用狀態(tài)的原理。
3)可以利用改變上拉電源的電壓,改變傳輸電平。IC的邏輯電平由電源Vcc1決定,而輸出高電平則由Vcc2決定。這樣我們就可以用低電平邏輯控制輸出高電平邏輯了。
4)開(kāi)漏Pin不連接外部的上拉電阻,則只能輸出低電平(因此對(duì)于經(jīng)典的51單片機(jī)的P0口而言,要想做輸入輸出功能必須加外部上拉電阻,否則無(wú)法輸出高電平邏輯)。
5)標(biāo)準(zhǔn)的開(kāi)漏腳一般只有輸出的能力。添加其它的判斷電路,才能具備雙向輸入、輸出的能力。

應(yīng)用中需注意:
1)開(kāi)漏和開(kāi)集的原理類似,在許多應(yīng)用中我們利用開(kāi)集電路代替開(kāi)漏電路。例如,某輸入Pin要求由開(kāi)漏電路驅(qū)動(dòng)。則我們常見(jiàn)的驅(qū)動(dòng)方式是利用一個(gè)三極管組成開(kāi)集電路來(lái)驅(qū)動(dòng)它,即方便又節(jié)省成本。
2)上拉電阻Rpull-up的阻值決定了邏輯電平轉(zhuǎn)換的沿的速度。阻值越大,速度越低功耗越小。反之亦然。

Push-Pull輸出就是一般所說(shuō)的推挽輸出,在CMOS電路里面Push-Pull輸出更合適,因?yàn)樵贑MOS里面的push-pull輸出能力不可能做得雙極那么大。輸出能力看IC內(nèi)部輸出極N管P管的面積。和開(kāi)漏輸出相比,push-pull的高低電平由IC的電源決定,不能簡(jiǎn)單的做邏輯操作等。push-pull是現(xiàn)在CMOS電路里面用得最多的輸出級(jí)設(shè)計(jì)方式。

3、什么是OC、OD

集電極開(kāi)路門(集電極開(kāi)路OC或源極開(kāi)路OD)
open-drain是漏極開(kāi)路輸出的意思,相當(dāng)于集電極開(kāi)路(open-collector)輸出,即ttl中的集電極開(kāi)路(oc)輸出。一般用于線或、線與,也有的用于電流驅(qū)動(dòng)。
open-drain是對(duì)mos管而言,open-collector是對(duì)雙極型管而言,在用法上沒(méi)啥區(qū)別。
開(kāi)漏形式的電路有以下幾個(gè)特點(diǎn):
1)利用外部電路的驅(qū)動(dòng)能力,減少IC內(nèi)部的驅(qū)動(dòng)。或驅(qū)動(dòng)比芯片電源電壓高的負(fù)載.
2)可以將多個(gè)開(kāi)漏輸出的Pin,連接到一條線上。通過(guò)一只上拉電阻,在不增加任何器件的情況下,形成“與邏輯”關(guān)系。這也是I2C,SMBus等總線判斷總線占用狀態(tài)的原理。如果作為圖騰輸出必須接上拉電阻。接容性負(fù)載時(shí),下降延是芯片內(nèi)的晶體管,是有源驅(qū)動(dòng),速度較快;上升延是無(wú)源的外接電阻,速度慢。如果要求速度高電阻選擇要小,功耗會(huì)大。所以負(fù)載電阻的選擇要兼顧功耗和速度。
3)可以利用改變上拉電源的電壓,改變傳輸電平。例如加上上拉電阻就可以提供TTL/CMOS電平輸出等。
4)開(kāi)漏Pin不連接外部的上拉電阻,則只能輸出低電平。一般來(lái)說(shuō),開(kāi)漏是用來(lái)連接不同電平的器件,匹配電平用的。
5)正常的CMOS輸出級(jí)是上、下兩個(gè)管子,把上面的管子去掉就是OPEN-DRAIN了。這種輸出的主要目的有兩個(gè):電平轉(zhuǎn)換和線與。
6)由于漏級(jí)開(kāi)路,所以后級(jí)電路必須接一上拉電阻,上拉電阻的電源電壓就可以決定輸出電平。這樣你就可以進(jìn)行任意電平的轉(zhuǎn)換了。
7)線與功能主要用于有多個(gè)電路對(duì)同一信號(hào)進(jìn)行拉低操作的場(chǎng)合,如果本電路不想拉低,就輸出高電平,因?yàn)镺PEN-DRAIN上面的管子被拿掉,高電平是靠外接的上拉電阻實(shí)現(xiàn)的。(而正常的CMOS輸出級(jí),如果出現(xiàn)一個(gè)輸出為高另外一個(gè)為低時(shí),等于電源短路。)
8)OPEN-DRAIN提供了靈活的輸出方式,但是也有其弱點(diǎn),就是帶來(lái)上升沿的延時(shí)。因?yàn)樯仙厥峭ㄟ^(guò)外接上拉無(wú)源電阻對(duì)負(fù)載充電,所以當(dāng)電阻選擇小時(shí)延時(shí)就小,但功耗大;反之延時(shí)大功耗小。所以如果對(duì)延時(shí)有要求,則建議用下降沿輸出。

4、什么是線或邏輯與線與邏輯?

在一個(gè)結(jié)點(diǎn)(線)上,連接一個(gè)上拉電阻到電源VCCVDDn個(gè)NPNNMOS晶體管的集電極C或漏極D,這些晶體管的發(fā)射極E或源極S都接到地線上,只要有一個(gè)晶體管飽和,這個(gè)結(jié)點(diǎn)(線)就被拉到地線電平上.
因?yàn)檫@些晶體管的基極注入電流(NPN)或柵極加上高電平(NMOS),晶體管就會(huì)飽和,所以這些基極或柵極對(duì)這個(gè)結(jié)點(diǎn)(線)的關(guān)系是或非NOR邏輯.如果這個(gè)結(jié)點(diǎn)后面加一個(gè)反相器,就是或OR邏輯.

注:個(gè)人理解:線與,接上拉電阻至電源。(~A)&(~B)=~(A+B),由公式較容易理解線與此概念的由來(lái);

如果用下拉電阻和PNPPMOS管就可以構(gòu)成與非NAND邏輯,或用負(fù)邏輯關(guān)系轉(zhuǎn)換與/或邏輯.

注:線或,接下拉電阻至地。(~A)+(~B)=~(AB);
這些晶體管常常是一些邏輯電路的集電極開(kāi)路OC或源極開(kāi)路OD輸出端.這種邏輯通常稱為線與/線或邏輯,當(dāng)你看到一些芯片的OCOD輸出端連在一起,而有一個(gè)上拉電阻時(shí),這就是線或/線與了,但有時(shí)上拉電阻做在芯片的輸入端內(nèi).
順便提示如果不是OCOD芯片的輸出端是不可以連在一起的,總線BUS上的雙向輸出端連在一起是有管理的,同時(shí)只能有一個(gè)作輸出,而其他是高阻態(tài)只能輸入.

5、什么是推挽結(jié)構(gòu)
一般是指兩個(gè)三極管分別受兩互補(bǔ)信號(hào)的控制,總是在一個(gè)三極管導(dǎo)通的時(shí)候另一個(gè)截止.要實(shí)現(xiàn)線與需要用OC(opencollector)門電路.如果輸出級(jí)的有兩個(gè)三極管,始終處于一個(gè)導(dǎo)通、一個(gè)截止的狀態(tài),也就是兩個(gè)三級(jí)管推挽相連,這樣的電路結(jié)構(gòu)稱為推拉式電路或圖騰柱(Totem-pole)輸出電路(可惜,圖無(wú)法貼上)。當(dāng)輸出低電平時(shí),也就是下級(jí)負(fù)載門輸入低電平時(shí),輸出端的電流將是下級(jí)門灌入T4;當(dāng)輸出高電平時(shí),也就是下級(jí)負(fù)載門輸入高電平時(shí),輸出端的電流將是下級(jí)門從本級(jí)電源經(jīng)T3、D1拉出。這樣一來(lái),輸出高低電平時(shí),T3一路和T4一路將交替工作,從而減低了功耗,提高了每個(gè)管的承受能力。又由于不論走哪一路,管子導(dǎo)通電阻都很小,使RC常數(shù)很小,轉(zhuǎn)變速度很快。因此,推拉式輸出級(jí)既提高電路的負(fù)載能力,又提高開(kāi)關(guān)速度。供你參考。
推挽電路是兩個(gè)參數(shù)相同的三極管或MOSFET,以推挽方式存在于電路中,各負(fù)責(zé)正負(fù)半周的波形放大任務(wù),電路工作時(shí),兩只對(duì)稱的功率開(kāi)關(guān)管每次只有一個(gè)導(dǎo)通,所以導(dǎo)通損耗小效率高。

輸出既可以向負(fù)載灌電流,也可以從負(fù)載抽取電流。


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專區(qū)

關(guān)閉