關(guān)于STM32中的GPIO位設(shè)置,這些關(guān)鍵點(diǎn)要記?。?/h1>
1.在對(duì)GPIOx_ODR的個(gè)別位進(jìn)行編程時(shí),軟件不需要禁止中斷。
2.GPIO具有鎖定機(jī)制。主要是在一些關(guān)鍵引腳上為了防止程序跑掉而引起不必要的后果。
3.GPIO的庫函數(shù)問題,
GPIO_SetBits:置所選端口的一個(gè)或者多個(gè)位高;
GPIO_ResetBits:相應(yīng)的設(shè)置相應(yīng)的一個(gè)或者多個(gè)位高;
GPIO_Init:設(shè)置A,B,C,D,E端口的任一個(gè)I/O的輸入輸出配置信息,初始化I/O芯片;
GPIO_Pin:設(shè)置帶選擇的引腳號(hào)(GPIO_Pin_1:選中1引腳);
GPIO_Speed:設(shè)置所選中的引腳的頻率(GPIO_Speed_10MHz);
GPIO_Mode:設(shè)置所選中的引腳的工作狀態(tài),做以上幾步都必須先定義出引腳;
(STM32F系列的芯片的I/O口有8中工作狀態(tài),這里就不做太多的描述,其中是主要包括4輸入和4輸出,重要的是每一個(gè)I/O口只能是這8種狀態(tài)中的一種)
例說以上的GPIO口的基本設(shè)置
例:配置端口A的0、1、6引腳為推免輸出,并且最大的速度為10MHz。
GPIO_InitTypeDef GPIO_InitStructure //定義結(jié)構(gòu)體
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_pp;
GPIO_Init(GPIOA,&GPIO_InitStructure); //定義設(shè)置的是A口,并且取結(jié)構(gòu)體地址。
函數(shù)GPIO_SetBits的功能主要是置位所選定的端口的一個(gè)位或者多個(gè)位為高。
這里使用的是函數(shù)頭,具體函數(shù)
例:設(shè)置外設(shè)端口PA12,PA14,PA15為高電平。
GPIO_SetBits(GPIOA,GPIO_Pin_12|GPIO_Pin_14|GPIO_Pin_15)
GPIO_ResetBits的功能是設(shè)置所選定的端口的一個(gè)或者多個(gè)選定的位為低。
例:要清除外設(shè)數(shù)據(jù)端口PD2,PD10,PD15。
GPIO_Resetbits(GPIOD,GPIO_Pin_2|GPIO_Pin_10|GPIO_Pin15);
一般來說,需要將某位設(shè)置為低,也就是要清除該位。
GPIO_WriteBit的功能是設(shè)置或者清除所選端口的待定位。
該函數(shù)具有三個(gè)輸入?yún)?shù),通過第三個(gè)輸入?yún)?shù)來定義是設(shè)置還是清除位。
例:置位外設(shè)數(shù)據(jù)端口PE2為高|清除外設(shè)端口PE1.
GPIO_WriteBit(GPIOE,GPIO_Pin_2,Bit_SET);
GPIO_WriteBit(GPIOE,GPIO_Pin_1,Bit_RESET);
GPIO_Write的功能是向指定的外設(shè)端口寫入數(shù)據(jù)。
例:向外設(shè)端口C寫入0X3A4B.
GPIO_Write(GPIOC,0X3A4B);
GPIO_ReadOutputDataBit的功能是讀取指定外設(shè)端口的指定以及你叫的輸出值。
例:需要讀取輸出引腳PB14的值。
u8 ReadValue;//表示的是ReadValue是8位的數(shù)據(jù)
ReadValue = GPIO_ReadOutputDataBit(GPIOB.GPIO_Pin_14);
GPIO_ReadOutputData的功能是讀取指定外設(shè)端口的輸出值,是16位的數(shù)據(jù)
例:需要讀取外設(shè)端口C的值。
u16 ReadValue;
Readvalue = GPIO_ReadOutputData(GPIOC);
GPIO_ReadInputDataBit的功能是讀取指定外設(shè)端口的指定引腳的輸入值每次讀取1位,高電平為1,低電平為0.
例:需要讀取外設(shè)端口PA7引腳的值。
u8 ReadValue;//是一個(gè)8位的數(shù)據(jù)
ReadValue = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7);
//如果是高電平就返回1,低電平就返回0.
GPIO_ReadInputData的功能是讀取外設(shè)短褲輸入的值,是一個(gè)16為的數(shù)據(jù)。
例:需要讀取外設(shè)D口的I/O的值。
u16 ReadValue;
ReadValue = GPIO_ReadInputData(GPIOD);
總結(jié):(1)如果是端口設(shè)置成下拉輸GPIO_ReadInputDataBit,GPIO_ReadOutputDataBit,可以區(qū)分高低電平。
(2)如果是端口設(shè)置成開漏輸出GPIO_ReadInputDataBit,GPIO_ReadOutputDataBit,GPIO_ReadInputDataBit,GPIO_ReadOutputDataBit可以區(qū)分高低電平。
(3)如果是端口設(shè)置成上拉輸入GPIO_ReadOutputDataBit只能讀出高電平。按鍵沒按或者按下讀的都是高電平。