新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32 GPIO入門學(xué)習(xí)

        STM32 GPIO入門學(xué)習(xí)

        作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
        今天下午開始學(xué)習(xí)STM32GPIO控制,開始以為跟AVR單片機(jī)一樣,只是設(shè)置方向寄存器跟引腳寄存器,一排引腳由8位變16位而已,誰知道一看資料才發(fā)現(xiàn)居然還有IO口狀態(tài)設(shè)置,設(shè)置速度設(shè)置…

        不過還好,使用的是STM32的FWLib3.0軟件包,里面的GPIO口函數(shù)都做好了,只要看一下使用就可以了。

        先看一些網(wǎng)上跟書上找到的資料跟自己總結(jié)的咚咚:

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

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

        3.GPIO_InitTypeDef是GPIO口的一個定義結(jié)構(gòu)體,包含一個16位的變量GPIO_Pin;一個GPIOSpeed_TypeDef枚舉結(jié)構(gòu)體GPIO_Speed;一個GPIOMode_TypeDef 枚舉結(jié)構(gòu)體GPIO_Mode;這3個變量可以在外部被定義,用于初始化或者改變某些GPIO的速度跟類型。

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

        typedef enum表示定義了一個枚舉型的數(shù)據(jù)結(jié)構(gòu),可以用GPIOSpeed_TypeDef去定義變量,這個變量的取值就是
        GPIO_Speed_10MHz ,GPIO_Speed_2MHz, GPIO_Speed_50MHz中的一個。默認(rèn)為零,其后面的依次加1。這些都可以自己取值,如
        GPIO_Speed_10MHz 就等于1,其后還是依次加1.




        4.強(qiáng)大的GPIO口設(shè)置:

        GPIOMode_TypeDef GPIO mode定義及偏移地址
        GPIO_Mode_AIN 0x00 模擬輸入
        GPIO_Mode_IN_FLOATING 0x04 懸空輸入
        GPIO_Mode_IPD 0x28 下拉輸入
        GPIO_Mode_IPU 0x48 上拉輸入
        GPIO_Mode_Out_OD 0x14 開漏輸出
        GPIO_Mode_Out_PP 0x10 推挽輸出 推挽模式,寫數(shù)據(jù)時,需要設(shè)置IO口為有上拉電阻模式
        GPIO_Mode_AF_OD 0x1c 開漏復(fù)用
        GPIO_Mode_AF_PP 0x18 推挽復(fù)用



        5.輸出速度可選擇:2MHz,10MHz,50MHz。

        6.IO口功能:通用I/O(GPIO)用,輸入輸出;單獨的位設(shè)置或位清除;外部中斷/喚醒線:端口必須配置成輸入模式時,所有端口都有外部中斷能力;復(fù)用功能(AF),并且軟件能重新映射I/O復(fù)用功能;GPIO鎖定機(jī)制:主要針對復(fù)位設(shè)定的,當(dāng)某端口位lock后,復(fù)位后將不改變的此端口的位配置。

        使用起來如果自己去讀寫寄存器地址操作,還是十分麻煩的,還好FWLib3.0軟件包里面的GPIO庫文件已經(jīng)為我們準(zhǔn)備好了很多的操作函數(shù),可以直接使用。

        下面熟悉一些會比較經(jīng)常使用的:

        1.void GPIO_DeInit(GPIO_TypeDef* GPIOx):直接初始化某排引腳的外圍寄存器到復(fù)位的默認(rèn)值。

        2.void GPIO_AFIODeInit(void):字面理解是復(fù)用IO的初始化,但是IO的服用現(xiàn)在還沒學(xué)習(xí)到…先空起

        3.void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct):根據(jù)GPIO_InitTypeDef里面的值,初始化某排里面的某些引腳的模式跟速度

        4.void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct):給GPIO_InitTypeDef里面的項目賦默認(rèn)值

        5.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):讀某一排引腳里面某個引腳的值

        6.uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx):讀整排引腳的值

        7.uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):讀某排引腳里面的輸出寄存器的某個引腳值

        8.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx):讀某排引腳輸出寄存器里面值

        9.void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):某排引腳某個引腳輸出1

        10.void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):某排引腳某個引腳輸出0

        11.void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal):設(shè)置某排引腳某個引腳的輸出值

        12.void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal):設(shè)置某排引腳輸出值

        13.void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):鎖定某排引腳中某個引腳,復(fù)位時候設(shè)置不變。

        14.void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource):選擇某個引腳當(dāng)事件輸出,不清楚蝦米意思…

        15.void GPIO_EventOutputCmd(FunctionalState NewState):啟用或禁止事件輸出..同上,不解

        16.void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState):修改復(fù)用引腳映射

        17.void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource):選擇某個引腳當(dāng)外部中斷用

        >.< 具體函數(shù)里面的操作看得有點暈 ..哎 后悔在學(xué)校時候C/C++沒學(xué)好,給UESTC丟人了…不過看注釋,參數(shù)加名字猜,作用還是可以猜到的,使用起來也比較方便…

        在昨天建好的新project里面,打開main.c,把里面內(nèi)容刪除,開始寫跑馬燈程序…

        #include "stm32f10x.h"
        #include "stm32f10x_conf.h"

        GPIO_InitTypeDef PC;

        void LED_Init(void)
        {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//開GPIOC時鐘
        PC.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
        PC.GPIO_Mode = GPIO_Mode_Out_PP;
        PC.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOC, &PC);

        }

        void Delay(vu32 nCount)
        {
        for(; nCount != 0; nCount—);
        }

        main()
        {
        LED_Init();
        while(1)
        { GPIO_SetBits(GPIOC, GPIO_Pin_6);//GPIOC.6=1
        Delay(0x8ffff);
        GPIO_ResetBits(GPIOC, GPIO_Pin_6);//GPIOC.6=0
        Delay(0x8ffff);
        GPIO_SetBits(GPIOC, GPIO_Pin_7);//GPIOC.7=1
        Delay(0x8ffff);
        GPIO_ResetBits(GPIOC, GPIO_Pin_7);//GPIOC.7=0
        Delay(0x8ffff);
        GPIO_SetBits(GPIOC, GPIO_Pin_8);//GPIOC.8=1
        Delay(0x8ffff);
        GPIO_ResetBits(GPIOC, GPIO_Pin_8);//GPIOC.8=0
        Delay(0x8ffff);
        GPIO_SetBits(GPIOC, GPIO_Pin_9);//GPIOC.9=1
        Delay(0x8ffff);
        GPIO_ResetBits(GPIOC, GPIO_Pin_9);//GPIOC.9=0
        Delay(0x8ffff);
        }

        }

        把LED的正極連在GPIO的6-9pin上,負(fù)極都連到地上后,Rebuilt All~然后Download and Debug… 然后在調(diào)試界面里面Run~ 嘿嘿 看到跑馬燈效果了…N年前開始玩51的時候也是這個開始的…不過那個程序多簡單- -||| 直接把一個1位移,然后PC等于過去就行了…

        跑馬燈之后我又試著用5個GPIO口來驅(qū)動一個串口的點陣屏幕,估計是2MHz還太快的原因,一直沒把它點亮…明天加延時跟修改下其他的,看看能不能把它點亮。


        關(guān)鍵詞: STM32GPIO入門學(xué)

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 永兴县| 依安县| 天台县| 应城市| 驻马店市| 二连浩特市| 乾安县| 昆明市| 彭阳县| 蚌埠市| 肥城市| 钟祥市| 马龙县| 资源县| 马山县| 绍兴市| 宝应县| 太仆寺旗| 吉木萨尔县| 昌邑市| 保德县| 青海省| 波密县| 炉霍县| 高邮市| 大姚县| 武夷山市| 南开区| 武陟县| 中西区| 海林市| 筠连县| 河北省| 醴陵市| 玛多县| 家居| 游戏| 瓦房店市| 滨海县| 吴桥县| 清水河县|