日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年01月30日(星期四)

2019年01月30日 | 關(guān)于stm32的GPIO的操作

發(fā)布者:wmghyu 來源: eefocus關(guān)鍵字:stm32  GPIO 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

首先先了解一下輸出的模式


比較常用的是 推挽輸出


1)GPIO_Mode_AIN 模擬輸入 


(2)GPIO_Mode_IN_FLOATING 浮空輸入


(3)GPIO_Mode_IPD 下拉輸入


(4)GPIO_Mode_IPU 上拉輸入


(5)GPIO_Mode_Out_OD 開漏輸出


(6)GPIO_Mode_Out_PP 推挽輸出


(7)GPIO_Mode_AF_OD 復(fù)用開漏輸出


(8)GPIO_Mode_AF_PP 復(fù)用推挽輸出

 


首先簡述一下stm3的gpio


接口(interface):主機(jī)(CPU)與外部設(shè)備(指MCU片上外設(shè))之間緩沖電路。它用于完成主機(jī)與外部設(shè)備設(shè)間速度匹配、信號轉(zhuǎn)換,并完成某些控制功能。按數(shù)據(jù)的傳輸方式可分為并行接口和串行接口,并行接口指一般I/O接口或通用I/O接口,而串行接口有I2C/SPI/UART等等。


端口(port):I/O接口電路中已經(jīng)編址并能進(jìn)行讀寫操作的寄存器。端口分為數(shù)據(jù)端口、狀態(tài)端口及控制端口,普遍存在于各個(gè)接口電路中。每個(gè)接口電路中都包含一組寄存器,CPU與外部設(shè)備進(jìn)行信息交換時(shí),各類信息在接口中存入不同的寄存器,這些寄存器就是I/O端口,簡稱I/O口,也稱為I/O端口寄存器。


引腳(pin):集成電路與外圍電路連接的管腳。


接口(端口)概念是對并行接口和串行接口(I2C/SPI/UART等片上外設(shè))而言的,MCU中大多數(shù)的功能模塊都有接口電路。狹義上,端口概念往往特指I/O并行接口電路中的寄存器。此外,通常我們所說的“I/O口”指的就是“I/O端口”。


一、GPIO的模式選擇


通過GPIO模式寄存器GPIOx_MODER(x是端口名稱,x=A…I/J/K)來設(shè)置GPIO端口位的方向: 

1、輸入模式(復(fù)位狀態(tài)) 

2、GPIO輸出模式 

3、復(fù)用功能模式 

4、模擬功能模式 

GPIOx_MODER的設(shè)置方法,詳見技術(shù)參考手冊TRM。


二、GPIO端口寄存器


每個(gè)I/O端口均有下列寄存器,每個(gè)端口位均可自由編程,但I(xiàn)/O端口寄存器必須按32位字、半字或字節(jié)被訪問。其中,GPIOx_BSRR寄存器旨在實(shí)現(xiàn)對GPIOx_ODR寄存器進(jìn)行原子讀取/修改訪問,具有對GPIOx_ODR按位寫權(quán)限。


1、4個(gè)32位配置寄存器:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR,這些寄存器位可通過軟件寫入。其中,輸出類型寄存器GPIOx_OTYPER是用1個(gè)寄存器位設(shè)置1個(gè)I/O位,其他配置寄存器均是用2個(gè)寄存器位設(shè)置1個(gè)I/O位。


GPIOx_MODER:選擇I/O端口方向?yàn)?輸入/通用輸出/AF/模擬,復(fù)位狀態(tài)為輸入。


GPIOx_OTYPER:選擇輸出類型為 推挽/開漏,復(fù)位狀態(tài)為推挽輸出。


GPIOx_OSPEEDR:選擇I/O輸出驅(qū)動(dòng)電路的響應(yīng)速度為 低速/中速/快速/高速,用于噪聲控制。(由下面Table 22. Port bit configuration table 可知,這個(gè)速度寄存器只對輸出模式和AF起作用)。 

注意:GPIO的引腳速度是指I/O口驅(qū)動(dòng)電路的響應(yīng)速度而不是輸出信號的速度,輸出信號的速度與程序有關(guān)。此外,如果較高頻率的信號經(jīng)過較低頻率的驅(qū)動(dòng)電路輸出,那么輸出的信號就會(huì)產(chǎn)生失真,所以驅(qū)動(dòng)電路的頻率和信號的頻率之間滿足采樣定理的要求。驅(qū)動(dòng)電路的頻率應(yīng)該適當(dāng)不能過大(建議10~20倍于信號的頻率),以便降低噪聲、功耗和電磁輻射。


GPIOx_PUPDR:選擇I/O端口為 無上拉或下拉/上拉/下拉/保留(與IO端口方向無關(guān))。


2、2個(gè)32位數(shù)據(jù)寄存器:GPIOx_IDR、GPIOx_ODR


GPIOx_IDR:這些寄存器位為只讀 形式,并且只能在字模式下訪問。


GPIOx_ODR:這些寄存器位可通過軟件讀取和寫入。


3、1個(gè)32位置位復(fù)位寄存器:GPIOx_BSRR


GPIOx_BSRR低半字用來置位GPIOx_ODR,即寫入“1”,而高半字用來復(fù)位GPIOx_ODR,即寫入“0”。GPIOx_BSRR旨在對GPIOx_ODR寄存器進(jìn)行原子讀寫操作,它只能在字、半字、字節(jié)模式下被訪問對GPIOx_ODR進(jìn)行原子操作。


4、1個(gè)32位鎖定寄存器:GPIOx_LCKR


鎖定寄存器GPIOx_LCKR的每個(gè)鎖定位用于鎖定端口位的配置。凍結(jié)的寄存器包括:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRH、GPIOx_AFRL,它只能以字的方式被訪問。鎖定寄存器鎖定配置后,就會(huì)避免因意外改寫端口寄存器配置造成大電流損壞芯片的故障或其他故障。


5、2個(gè)32位復(fù)用功能選擇寄存器:GPIOx_AFRH、GPIOx_AFRL


GPIOx_AFRL:用四位寄存器位選擇一個(gè)對應(yīng)的復(fù)用功能。該寄存器用于選擇AF0~AF7。


GPIOx_AFRH:用四位寄存器位選擇一個(gè)對應(yīng)的復(fù)用功能。該寄存器用于選擇AF8~AF15。


復(fù)用功能選擇寄存器只能通過字被訪問。


三、GPIO的工作模式


通過對4種端口配置寄存器進(jìn)行編程,可將GPIO口的各個(gè)端口位配置成以下8種工作模式:


輸入+懸空 

輸入+上拉 

輸入+下拉 

模擬(用作ADC輸入、DAC輸出或者捕獲輸入情況下) 

輸出+開漏+上拉/下拉(輸出模式時(shí)GPIO的輸出速度是可配置的) 

輸出+推挽+上拉/下拉(輸出模式時(shí)GPIO的輸出速度是可配置的) 

復(fù)用功能+推挽+上拉/下拉(復(fù)用功能時(shí)速度是可配置的) 

復(fù)用功能+開漏+上拉/下拉(復(fù)用功能時(shí)速度是可配置的)



● I/O輸入通道有個(gè)TTL施密特觸發(fā)器,它用于將變化緩慢的輸入信號整形成邊沿陡峭的矩形脈沖。同時(shí),施密特觸發(fā)器利用其回差電壓提高了電路的抗干擾能力; 

● 所有的I/O口均兼容TTL電平和CMOS電平; 

● 大多數(shù)I/O是5V電壓容限(FT 結(jié)構(gòu)的I/O是5V容限,其他結(jié)構(gòu)的I/O不是。詳細(xì)情況請參見相應(yīng)的STM32F4數(shù)據(jù)手冊); 

● 當(dāng)GPIO被配置為模擬功能時(shí),I/O不再是5V電壓容限,這時(shí)以VDDA為電壓容限; 

● 除了端口A和B(主要是PA13/PA14/PA15/PB3/PB4這5個(gè)端口位復(fù)位后專門用于片上調(diào)試模塊,不受4個(gè)GPIO控制寄存器控制),其他端口的所有端口位復(fù)位期間或者復(fù)位后都是懸空輸入狀態(tài); 

● 輸出通道中,輸出數(shù)據(jù)寄存器和復(fù)用功能輸出接到多路復(fù)用器,再經(jīng)過輸出控制連接到推挽電路的門極。值得注意的是輸出控制會(huì)將輸出數(shù)據(jù)寄存器和復(fù)用功能輸出的電平進(jìn)行反轉(zhuǎn)(即’1’變’0’,’0’變’1’)。仔細(xì)觀察會(huì)發(fā)現(xiàn)P-MOS管的門極有個(gè)小圈“。”,它表示P-MOS的門極為低電平’0’時(shí),P-MOS導(dǎo)通。反之,N-MOS是門極為高電平’1’時(shí)導(dǎo)通; 

● 推挽輸出的驅(qū)動(dòng)能力強(qiáng),并且推挽輸出時(shí),若P-MOS導(dǎo)通,引腳上的電壓不會(huì)因?yàn)橥獠科骷蛟O(shè)備(即引腳帶負(fù)載)而有所降低; 

● I/O端口位的最大狀態(tài)切換頻率為90MHZ。

● 輸出緩沖器被禁止; 

● 施密特觸發(fā)輸入被激活; 

● 根據(jù)寄存器GPIOx_PUPDR中的值選擇引腳為弱上拉或弱下拉或懸空輸入; 

● I/O引腳上的數(shù)據(jù)在每個(gè)AHB1時(shí)鐘周期被采樣到輸入數(shù)據(jù)寄存器; 

● 對輸入數(shù)據(jù)寄存器的讀訪問可獲得I/O狀態(tài)。



● 輸出緩沖器被激活 

─ 開漏模式:輸出寄存器上的 ‘0’ 激活N-MOS,而輸出寄存器上的 ‘1’ 將端口置于高阻狀態(tài)(PMOS從不被激活); 

─ 推挽模式:輸出寄存器上的 ‘0’ 激活N-MOS,而輸出寄存器上的 ‘1’ 將激活P-MOS; 

● 施密特觸發(fā)器輸入被激活; 

● 選擇引腳為弱上拉或弱下拉輸出或懸空; 

● I/O腳上的數(shù)據(jù)在每個(gè)AHB1時(shí)鐘周期被采樣到輸入數(shù)據(jù)寄存器; 

● 對輸入數(shù)據(jù)寄存器的讀訪問可得到I/O狀態(tài); 

● 對輸出數(shù)據(jù)寄存器的讀訪問得到最后一次寫的值。


由圖4可以看出,當(dāng)I/O端口被配置為復(fù)用功能AF(Alternate Function)時(shí): 

● 輸出緩沖器可以被配置成開漏或推挽; 

● 輸出緩沖器被片上外設(shè)信號驅(qū)動(dòng); 

● 施密特觸發(fā)器輸入被激活; 

● 根據(jù)寄存器GPIOx_PUPDR中的值選擇引腳為弱上拉或弱下拉或懸空輸出; 

● I/O腳上的數(shù)據(jù)在每個(gè)AHB1時(shí)鐘周期被采樣到輸入數(shù)據(jù)寄存器; 

● 對輸出數(shù)據(jù)寄存器的讀訪問得到最后一次寫的值。


 



● 輸出緩沖器被禁止; 

● 施密特觸發(fā)器輸入被暫停,0功耗,并且輸出一直維持在0值狀態(tài); 

● 管腳的弱上拉和下拉被禁止; 

● 訪問輸入數(shù)據(jù)寄存器得到的數(shù)值為0;


五、GPIO引腳作為一般IO輸入時(shí),引腳的狀態(tài)和端口輸入寄存器GPIOx_IDR的狀態(tài)是否一致?


在學(xué)習(xí)51核單片機(jī)時(shí),由于51單片機(jī)I/O接口電路結(jié)構(gòu)的原因,I/O輸入時(shí),I/O的引腳狀態(tài)會(huì)出現(xiàn)與鎖存器不一樣的情況。所以,往往在I/O上拉輸入前,提前向鎖存器寫入“1”,指令上也分為讀引腳和讀鎖存器指令。


那么,基于Cortex-M內(nèi)核的MCU的I/O引腳輸入時(shí)是否也有與51單片機(jī)同樣的問題呢??


答案是否定的!因?yàn)镃ortex-M內(nèi)核的MCU的GPIO引腳在被配置為I/O輸入時(shí),其輸出電路是斷開的。這樣,輸出電路就不會(huì)影響到引腳的狀態(tài)。所以,引腳上的狀態(tài)和輸入寄存器GPIOx_IDR中的數(shù)據(jù)始終一致。

 


 


為什么要配置端口?

因?yàn)镚PIO中端口的作用很多,沒有固定的一種模式,因此需要配置.

每個(gè)GPI/O端口有兩個(gè)32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR),一個(gè)32位置位/復(fù)位寄存器(GPIOx_BSRR),一個(gè)16位復(fù)位寄存器(GPIOx_BRR)和一個(gè)32位鎖定寄存器(GPIOx_LCKR)。


本文引用地址:http://www.eepw.com.cn/article/201611/318989.htm


GPIO端口的每個(gè)位可以由軟件分別配置成多種模式。每個(gè)I/O端口位可以自由編程,然而I/0端口寄存器必須按32位字被訪問(不允許半字或字節(jié)訪問)。GPIOx_BSRR和GPIOx_BRR寄存器允許對任何GPIO寄存器的讀/更改的獨(dú)立訪問;這樣,在讀和更改訪問之間產(chǎn)生IRQ時(shí)不會(huì)發(fā)生危險(xiǎn)。


配置為輸出模式 , 驅(qū)動(dòng)led , 配置思路是什么樣的?


使能端口時(shí)鐘;

選定需要配置的管腳;

配置端口的模式;

初始化端口; 

代碼如下:


#include "led.h"

#include "sys.h"

void LED_Init(void)

{

    GPIO_InitTypeDef  GPIO_InitStructure;//結(jié)構(gòu)體變量定義


  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF時(shí)鐘


  GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_9|GPIO_Pin_10); //LED0=PF9,LED1=PF10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//輸出模式

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50M

  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF

}

以下是配置按鍵的接口


程序如下:


/按鍵初始化函數(shù)

void KEY_Init(void) //IO初始化

     GPIO_InitTypeDef GPIO_InitStructure;

 

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE時(shí)鐘


    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入

     GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4


    //初始化 WK_UP-->GPIOA.0      下拉輸入

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0設(shè)置成輸入,默認(rèn)下拉      

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0


}


 


以下是配置ds18b20的接口


//IO方向設(shè)置

#define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}

#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}

////IO操作函數(shù)                                               

#define    DS18B20_DQ_OUT PGout(11) //數(shù)據(jù)端口    PA0 

#define    DS18B20_DQ_IN  PGin(11)  //數(shù)據(jù)端口    PA0 



//////IO方向設(shè)置  gpio13  每4個(gè)位控制1個(gè)IO。

//#define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFF0FFFFF;GPIOG->CRH|=8<<20;}

//#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFF0FFFFF;GPIOG->CRH|=3<<20;}

//////IO操作函數(shù)                                               

//#define    DS18B20_DQ_OUT PGout(13) //數(shù)據(jù)端口    PA0 

//#define    DS18B20_DQ_IN  PGin(13)  //數(shù)據(jù)端口    PA0 

 


 


 


再看GPIO功能很強(qiáng)大:


1.通用I/O(GPIO):最最基本的功能,可以驅(qū)動(dòng)LED、可以產(chǎn)生PWM、可以驅(qū)動(dòng)蜂鳴器等等;


2.單獨(dú)的位設(shè)置或位清除:方便軟體作業(yè),程序簡單。端口配置好以后只需GPIO_SetBits(GPIOx, GPIO_Pin_x)就可以實(shí)現(xiàn)對GPIOx的pinx位為高電平;


3.外部中斷/喚醒線:端口必須配置成輸入模式時(shí),所有端口都有外部中斷能力;


4.復(fù)用功能(AF):復(fù)用功能的端口兼有IO功能等。復(fù)位期間和剛復(fù)位后,復(fù)用功能未開啟,I/O端口被配置成浮空輸入模式:(CNFx[1:0]=01b,MODEx[1:0]=00b)。


5.軟件重新映射I/O復(fù)用功能:為了使不同器件封裝的外設(shè)I/O功能的數(shù)量達(dá)到最優(yōu),可以把一些復(fù)用功能重新映射到其他一些腳上。這可以通過軟件配置相應(yīng)的寄存器來完成。這時(shí),復(fù)用功能就不再映射到它們的原始引腳上了;


6.GPIO鎖定機(jī)制:主要針對復(fù)位設(shè)定的,當(dāng)某端口位lock后,復(fù)位后將不改變的此端口的位配置。


GPIO基本設(shè)置


GPIOMode_TypeDef GPIO mode定義及偏移地址


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,//開漏復(fù)用


GPIO_Mode_AF_PP = 0x18//推挽復(fù)用


GPIO輸入輸出速度選擇:


typedef enum


{


GPIO_Speed_10MHz = 1,


GPIO_Speed_2MHz,


GPIO_Speed_50MHz


}


GPIOSpeed_TypeDef;


#define IS_GPIO_SPEED(SPEED) ((SPEED == GPIO_Speed_10MHz) || (SPEED == GPIO_Speed_2MHz) ||(SPEED == GPIO_Speed_50MHz))


做一個(gè)GPIO輸出的試驗(yàn)


當(dāng)I/O端口被配置為推挽模式輸出時(shí):輸出寄存器上的0激活N-MOS,而輸出寄存器上的1將激活P-MOS。


用這段程序?qū)崿F(xiàn):GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


int main(void)


{


#ifdef DEBUG


debug();


#endif


RCC_Configuration();


NVIC_Configuration();


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


GPIO_Init(GPIOC, &GPIO_InitStructure);


while (1)


{


GPIO_SetBits(GPIOC, GPIO_Pin_4); //設(shè)置PC.04 pin為高電平,點(diǎn)亮LED1


Delay();


GPIO_ResetBits(GPIOC, GPIO_Pin_4); //設(shè)置PC.04 pin為低電平,熄滅LED1


Delay();


}


}

關(guān)鍵字:stm32  GPIO 引用地址:關(guān)于stm32的GPIO的操作

上一篇:STM32時(shí)鐘基礎(chǔ)知識(shí)
下一篇:基于STM32系列的模擬串口(非阻塞式)

推薦閱讀

MSP430用ADC10來測片內(nèi)溫度兩極管的電壓#include "msp430x22x4.h" //此程序是用ADC10來測片內(nèi)溫度兩極管的電壓 //執(zhí)行程序來查看ADC10MEM寄存器的值, //并用V(temp)=0.00355*TempC+0.986公式來計(jì)算片子溫度 //最后ad采樣值存在ad_value,溫度值存在value中,設(shè)置斷點(diǎn)查看各個(gè)計(jì)數(shù)值// MSP430F2274 // ----------------- // ...
臺(tái)系面板大廠友達(dá)董事長彭雙浪表示,隨著新增產(chǎn)能陸續(xù)開出,面板供過于求將是常態(tài),未來幾年都是,且恐“持續(xù)一段滿長的時(shí)間”,同時(shí)經(jīng)濟(jì)情勢也充滿變量,友達(dá)將繼續(xù)朝向健全財(cái)務(wù)體質(zhì),強(qiáng)化整體競爭力。友達(dá)29日舉行財(cái)報(bào)發(fā)布會(huì),彭雙浪指出,2018年因終端市場有運(yùn)動(dòng)賽事加商用換機(jī)潮,電視產(chǎn)品銷售不錯(cuò),不過下半年開始,有幾個(gè)大時(shí)代線產(chǎn)能開出,對產(chǎn)能及...
旋進(jìn)旋渦流量計(jì)采用最新微處理技術(shù),具有功能強(qiáng)、流量范圍寬、操作維修簡單,安裝使用方便等優(yōu)點(diǎn);旋進(jìn)旋渦流量計(jì)集流量、溫度、壓力檢測功能與一體,并能進(jìn)行溫度、壓力自動(dòng)補(bǔ)償,旋進(jìn)旋渦流量計(jì)主要技術(shù)指標(biāo)達(dá)到國外同類產(chǎn)品先進(jìn)水平。旋進(jìn)旋渦流量計(jì)廣泛應(yīng)用于石油、化工、電力、冶金煤炭等行業(yè)各種氣體計(jì)量。今天我們來了解旋進(jìn)旋渦流量計(jì)的工作原理,...
1、超級電容器的原理與分類 超級電容器主要由陰陽兩電極、電解質(zhì)溶液、分離器和集流器組成,其中浸在電解液中的分離器使陰陽電極保持分離。超級電容器基于電極/電解液界面的充放電過程進(jìn)行儲(chǔ)能,其儲(chǔ)能原理與傳統(tǒng)電容器相同,但更適合于能量的快速釋放和存儲(chǔ)。 與傳統(tǒng)電容相比,超級電容具有更大的有效表面積,可使其電容量比傳統(tǒng)電容提高1萬倍,同時(shí)...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved