新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 GPIO設置

        STM32 GPIO設置

        作者: 時間:2016-12-02 來源:網絡 收藏
        STM32的輸入輸出管腳有下面8種可能的配置:(4輸入+2輸出+2復用輸出)

        ① 浮空輸入_IN_FLOATING

        本文引用地址:http://www.104case.com/article/201612/325061.htm

        ② 帶上拉輸入_IPU

        ③ 帶下拉輸入_IPD

        ④ 模擬輸入_AIN
        ⑤ 開漏輸出_OUT_OD

        ⑥ 推挽輸出_OUT_PP

        ⑦ 復用功能的推挽輸出_AF_PP

        ⑧ 復用功能的開漏輸出_AF_OD

        1.1 I/O口的輸出模式下,有3種輸出速度可選(2MHz、10MHz和50MHz),這個速度是指I/O口驅動電路的響應速度而不是輸出信號的速度,輸出信號的速度與程序有關(芯片內部在I/O口的輸出部分安排了多個響應速度不同的輸出驅動電路,用戶可以根據自己的需要選擇合適的驅動電路)。通過選擇速度來選擇不同的輸出驅動模塊,達到最佳的噪聲控制和降低功耗的目的。高頻的驅動電路,噪聲也高,當不需要高的輸出頻率時,請選用低頻驅動電路,這樣非常有利于提高系統的EMI性能。當然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅動模塊,很可能會得到失真的輸出信號。關鍵是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口后,可以通過程序鎖住配置組合,直到下次芯片復位才能解鎖。

        2 在STM32中如何配置片內外設使用的IO端口

        首先,一個外設經過 ①配置輸入的時鐘和 ②初始化后即被激活(開啟);③如果使用該外設的輸入輸出管腳,則需要配置相應的GPIO端口(否則該外設對應的輸入輸出管腳可以做普通GPIO管腳使用);④再對外設進行詳細配置。

        對應到外設的輸入輸出功能有下述三種情況:
        一、外設對應的管腳為輸出:需要根據外圍電路的配置選擇對應的管腳為復用功能的推挽輸出或復用功能的開漏輸出。
        二、外設對應的管腳為輸入:則根據外圍電路的配置可以選擇浮空輸入、帶上拉輸入或帶下拉輸入。
        三、ADC對應的管腳:配置管腳為模擬輸入。

        如果把端口配置成復用輸出功能,則引腳和輸出寄存器斷開,并和片上外設的輸出信號連接。將管腳配置成復用輸出功能后,如果外設沒有被激活,那么它的輸出將不確定。

        3 通用IO端口(GPIO)初始化:

        3.1 GPIO初始化

        3.1.1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C,ENABLE):使能APB2總線外設時鐘

        3.1.2 RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C,

        DISABLE):釋放GPIO復位

        3.2 配置各個PIN端口(模擬輸入_AIN、輸入浮空_IN_FLOATING、輸入上拉_IPU、輸入下拉_IPD、開漏輸出_OUT_OD、推挽式輸出_OUT_PP、推挽式復用輸出_AF_PP、開漏復用輸出_AF_OD)

        3.3 GPIO初始化完成

        =======================================================================

        最近剛開始學習STM32,所以從最基本的GPIO開始學起;首先看看STM32的datasheet上對GPIO口的簡單介紹:每個GPI/O 端口有兩個32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個32位數據寄存器(GPIOx_IDR,GPIOx_ODR),一個32 位置位/復位寄存器(GPIOx_BSRR),一個16 位復位寄存器(GPIOx_BRR)和一個32 位鎖定寄存器(GPIOx_LCKR)。

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

        端口位配置 CNFx[1:0]=xxb,MODEx[1:0]=xxb

        再看GPIO功能很強大:

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

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

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

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

        MODEx[1:0]=00b)。

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

        6.GPIO鎖定機制:當在一個端口位上執行了所定(LOCK)程序,在下一次復位之前,將不能再更改端口位的配置。

        GPIO基本設置

        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, //開漏復用

        GPIO_Mode_AF_PP = 0x18 //推挽復用

        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))

        做一個GPIO輸出的試驗

        當I/O 端口被配置為推挽模式輸出時:輸出寄存器上的0 激活N-MOS,而輸

        出寄存器上的1 將激活P-MOS。

        用這段程序實現:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

        int main(void)

        {

        #ifdef DEBUG

        debug();

        #endif

        /* 設置系統時鐘 */

        RCC_Configuration();

        /* 嵌套中斷設置*/

        NVIC_Configuration();

        /* 激活GPIOC clock */

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

        /* Configure PC.04, PC.05, PC.06 and PC.07 as Output push-pull */

        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)

        {

        /*本試驗僅能實現LED1亮、熄功能*/

        GPIO_SetBits(GPIOC, GPIO_Pin_4); //設置PC.04 pin為高電平,點亮

        LED1

        Delay();

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

        LED1

        Delay();

        }

        }

        做一個GPIO輸入的試驗:以EK-STM32F中LCDdemo做例子

        這個試驗中把GPIO的PD.04做為按鍵輸入,當下降沿來臨時觸發。

        LCDdemo中的例程如下:首先配置按鍵PD.03, PD.04為按鍵輸入接口。

        void Button_Config(void)

        {

        GPIO_InitTypeDef GPIO_InitStructure;

        /* Enable GPIOD clock */

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

        /* Configure PD.03, PD.04 as output push-pull */

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOD, &GPIO_InitStructure);

        }

        下面為按鍵作用是啟動外部中斷

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);

        EXTI_InitStructure.EXTI_Line = EXTI_Line3; //設定外部中斷3

        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //設定中斷模式

        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //設定下降沿觸

        發模式

        EXTI_InitStructure.EXTI_LineCmd = ENABLE;

        EXTI_Init(&EXTI_InitStructure);

        /*******************************************************************************

        設置GPIO基本參數

        *******************************************************************************/

        void GPIO_Configuration(void)

        {

        GPIO_InitTypeDef GPIO_InitStructure;

        //根據GPIO_InitStruct中指定的參數初始化外設GPIOx寄存器

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4| GPIO_Pin_5 ;

        //設置的IO為pin4與pin5

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        /* GPIO_Speed 描述

        GPIO_Speed_10MHz 最高輸出速率10MHz

        GPIO_Speed_2MHz 最高輸出速率2MHz

        GPIO_Speed_50MHz 最高輸出速率50MHz

        */

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;

        /*

        GPIO_Speed 描述

        GPIO_Mode_AIN 模擬輸入

        GPIO_Mode_IN_FLOATING 浮空輸入

        GPIO_Mode_IPD 下拉輸入

        GPIO_Mode_IPU 上拉輸入

        GPIO_Mode_Out_OD 開漏輸出

        GPIO_Mode_Out_PP 推挽輸出

        GPIO_Mode_AF_OD 復用開漏輸出

        GPIO_Mode_AF_PP 復用推挽輸出通常有5種方式使用某個引腳功能,

        它們的配置方式如下:

        1)作為普通GPIO輸入:

        根據需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,

        同時不要使能該引腳對應的所有復用功能模塊。

        2)作為普通GPIO輸出:

        根據需要配置該引腳為推挽輸出或開漏輸出,同時不要使能該引

        腳對應的所有復用功能模塊。

        3)作為普通模擬輸入:

        配置該引腳為模擬輸入模式,同時不要使能該引腳對應的所有

        復用功能模塊。

        4)作為內置外設的輸入:

        根據需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,

        同時使能該引腳對應的某個復用功能模塊。

        5)作為內置外設的輸出:

        根據需要配置該引腳為復用推挽輸出或復用開漏輸出,同時使能

        該引腳對應的所有復用功能模塊。1、模擬輸入模式下,是用于AD輸入時輸入模擬量,此時施密特觸

        發器輸入關閉,施密特觸發器輸出為0.

        2、下拉輸入:打開內部下拉電阻

        3、上拉輸入:打開內部上拉電阻

        4、浮空輸入 :這個輸入模式,輸入電平必須由外部電路確定,

        要根據具體電路,加外部上拉電阻或下拉電阻。

        5、推挽輸出:可以輸出高,低電平,連接數字器件。推挽式輸出輸出電阻

        小,帶負載能力強。

        6、開漏輸出:輸出端相當于三極管的集電極. 要得到高電平狀態需要

        上拉電阻才行. 適合于做電流型的驅動,其吸收電流的能力相對強

        (一般20ma以內).能驅動大電流和大電壓。LED就使用這種模式

        7、復用是指該引腳打開remap功能。*/

        GPIO_Init(GPIOC, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

        GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4);

        EXTI_InitTypeDef EXTI_InitStructure;

        EXTI_InitStructure.EXTI_Line=EXTI_Line4;

        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

        EXTI_InitStructure.EXTI_LineCmd=ENABLE;

        EXTI_Init(&EXTI_InitStructure);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);

        EXTI_InitTypeDef EXTI_InitStructure;

        EXTI_InitStructure.EXTI_Line=EXTI_Line5;

        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

        EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);

        }

        /*GPIO常使用的幾條函數

        GPIO_ReadInputDataBit 讀取指定端口管腳的輸入

        u8 ReadValue;

        ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);

        使用setbits 與resetbits 是比較簡單,其實還是可以使用

        其它函數。例如可以使用GPIO_WriteBit

        GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);

        GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);對于好像流水燈呀這些一個整段IO,可以使用

        GPIO_Write(GPIOA, 0x1101);GPIO_EXTILineConfig 選擇GPIO管腳用作外部中斷線路

        GPIO_EXTILineConfig(GPIO_PortSource_GPIOB, GPIO_PinSource8);*/



        關鍵詞: STM32GPIO設

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 濉溪县| 张家界市| 平武县| 哈巴河县| 阳江市| 阿巴嘎旗| 剑河县| 临猗县| 清远市| 甘孜| 高雄县| 洪泽县| 林州市| 美姑县| 隆安县| 邛崃市| 沂南县| 桂平市| 新野县| 伊金霍洛旗| 鹤山市| 安溪县| 高淳县| 育儿| 黔江区| 桦南县| 西宁市| 胶州市| 鹤岗市| 九寨沟县| 安阳县| 周至县| 榆树市| 平乐县| 久治县| 石河子市| 靖江市| 开原市| 涡阳县| 德兴市| 邹城市|