新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32小筆記(一) GPIO口的配置

        STM32小筆記(一) GPIO口的配置

        作者: 時間:2016-11-24 來源:網絡 收藏
        GPIO口的使用:
        1.GPIO和AFIO全系列支持

        GPIO寄存器
        (1)兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH);
        (2)兩個32位數據寄存器(GPIOx_IDR,GPIOx_ODR);
        (3)一個32位置為/復位寄存器(GPIOx_BSRR);
        (4)一個16位復位寄存器(GPIOx_BRR);
        (5)一個32位鎖存器(GPIOx_LCKR);

        輸入配置
        當I/O端口配置為輸入時:
        輸出緩沖器被禁止
        施密特觸發輸入被激活
        根據輸入配置(上拉,下拉或浮動)的不同,弱上拉和下拉電阻被連接
        出現在I/O腳上的數據在每個APB2時鐘被采樣到輸入數據寄存器
        對輸入數據寄存器的讀訪問可得到I/O狀態

        輸出配置
        當I/O端口被配置為輸出時:
        輸出緩沖器被激活
        開漏模式:輸出寄存器上的’0’激活N-MOS,而輸出寄存器上的’1’將端口置于高阻狀態(PMOS從不被激活)。
        推挽模式:輸出寄存器上的’0’激活N-MOS,而輸出寄存器上的’1’將激活P-MOS。
        施密特觸發輸入被激活
        弱上拉和下拉電阻被禁止
        出現在I/O腳上的數據在每個APB2時鐘被采樣到輸入數據寄存器
        在開漏模式時,對輸入數據寄存器的讀訪問可得到I/O狀態
        在推挽式模式時,對輸出數據寄存器的讀訪問得到最后一次寫的值。

        STM32中的配置寄存器在固件函數庫中早已生成,因此無需再對寄存器的每個設定寫定義,而是直接調用關鍵字。這樣我們可以不再關心寄存器的具體配置(因為那已經在固件配置好了);因此直觀的從配置函數中去看,更能有效的提高。

        GPIO相關的庫函數如下,位于在“stm32f10x_gpio.h”
        GPIO相關函數如下:

        voidGPIO_DeInit(GPIO_TypeDef*GPIOx);
        voidGPIO_AFIODeInit(void);
        voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);
        voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);
        uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);
        uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);
        voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal);
        voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);
        voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        voidGPIO_EventOutputConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);
        voidGPIO_EventOutputCmd(FunctionalStateNewState);
        voidGPIO_PinRemapConfig(uint32_tGPIO_Remap,FunctionalStateNewState);
        voidGPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);
        voidGPIO_ETH_MediaInterfaceConfig(uint32_tGPIO_ETH_MediaInterface);

        以下將逐個說明函數功能及注釋說明:
        ·voidGPIO_DeInit(GPIO_TypeDef*GPIOx);

        該函數原型在"stm32f10x_gpio.C"當中,類似C++的注釋說明如下:

        *@briefDeinitializestheGPIOxperipheralregisterstotheirdefaultresetvalues.
        *@paramGPIOx:wherexcanbe(A..G)toselecttheGPIOperipheral.
        *@retvalNone
        其中是為不同組的IO口進行寄存器值的初始化。
        初始化語句如下:
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,DISABLE);”
        再追根溯源到這個函數,位于“stm32f10x_rcc.C”當中
        "voidRCC_APB2PeriphResetCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState)"
        {

        assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
        assert_param(IS_FUNCTIONAL_STATE(NewState));
        if(NewState!=DISABLE)
        {
        RCC->APB2RSTR|=RCC_APB2Periph;
        }
        else
        {
        RCC->APB2RSTR&=~RCC_APB2Periph;
        }
        }
        函數注釋如下:

        一目了然,即配置IO口時鐘狀態為使能或者失效。

        當然在其中此函數作為一個初學實例還是值得深究的:
        assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
        assert_param(IS_FUNCTIONAL_STATE(NewState));
        此處兩句即類似于C++中的斷言函數,作為函數運行的先決條件。這里將斷言函數直接說明,在后續的實例中,仍舊會有使用到的地方。

        #defineassert_param(expr)((expr)?(void)0:assert_failed((uint8_t*)__FILE__,__LINE__))

        voidassert_failed(uint8_t*file,uint32_tline);
        #else
        #defineassert_param(expr)((void)0)
        #endif
        #endif
        若滿足斷言值為"1"的條件,否則判定失敗輸出文件名和所在行。不為"0"返回0.

        再返回“assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));”此句中。“IS_RCC_APB2_PERIPH”如下定義:
        ·#defineIS_RCC_APB2_PERIPH(PERIPH)((((PERIPH)&0xFFC00002)==0x00)&&((PERIPH)!=0x00))
        此處使用到的是AP2進入該函數還可以看到AP2、AP1、AP三個高速時鐘族的各項定義。姑且在這里認為是判定開啟對應時鐘前的時鐘功能驗證。
        ·#defineIS_FUNCTIONAL_STATE(STATE)(((STATE)==DISABLE)||((STATE)==ENABLE))
        只為考慮還是的形參是否是“DISABLE”or“ENABLE”兩個狀態。

        if(NewState!=DISABLE)
        {
        RCC->APB2RSTR|=RCC_APB2Periph;
        }
        else
        {
        RCC->APB2RSTR&=~RCC_APB2Periph;
        }

        而APB2RSTR則即將牽扯到RCC的設置問題,我們下一節再講。


        ·voidGPIO_AFIODeInit(void);功能復用,重新映射事件控制。
        同樣調用“RCC_APB2PeriphResetCmd”。也是串口初始化判斷
        ·voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);
        寄存器手冊中記為:根據GPIO_InitStruct中指定參數初始化外設GPIOx寄存器
        不想在此處在贅述此函數,主要通過寫寄存器的值來配置GPI0x,GPIO_pin,GPIO_Mode,GPIO_speed,以及寫GPIOCRL/CRH寄存器。
        ·voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);被上一結構體調用
        GPIO_Speed描述
        GPIO_Speed_10MHz最高輸出速率10MHz
        GPIO_Speed_2MHz最高輸出速率2MHz
        GPIO_Speed_50MHz最高輸出速率50MHz

        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復用推挽輸出

        ·
        uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);,
        uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);
        讀取指定管腳輸入/輸出,讀取管腳輸入/輸出數據值。一個讀取的是管腳的狀態,而一個讀取的輸入or輸出數據寄存器的值。這一點要分清
        ·
        voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal);
        "bitvalmustbeBit_RESETorBit_SET“
        voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);
        “Portval為將寫入數據寄存器的值”
        設定/清除指定的數據位
        ·voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
        鎖存管腳寄存器,鎖存指定GPIO組指定引腳。
        ·voidGPIO_EventOutputConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);
        voidGPIO_EventOutputCmd(FunctionalStateNewState);
        配置GPIO為事件輸出,其后我們來解決這個疑問。
        ·voidGPIO_PinRemapConfig(uint32_tGPIO_Remap,FunctionalStateNewState);
        此函數決定了IO口的重新映射,實際是IO復用功能的實現,GPIO_Remap選擇輸入引腳,NewState的配置值如下:GPIO_Remap_SPI1SPI1復用功能映射
        GPIO_Remap_I2C1I2C1復用功能映射
        GPIO_Remap_USART1USART1復用功能映射
        GPIO_PartialRemap_USART3USART2復用功能映射
        GPIO_FullRemap_USART3USART3復用功能完全映射
        GPIO_PartialRemap_TIM1USART3復用功能部分映射
        GPIO_FullRemap_TIM1TIM1復用功能完全映射
        GPIO_PartialRemap1_TIM2TIM2復用功能部分映射1
        GPIO_PartialRemap2_TIM2TIM2復用功能部分映射2
        GPIO_FullRemap_TIM2TIM2復用功能完全映射
        GPIO_PartialRemap_TIM3TIM3復用功能部分映射
        GPIO_FullRemap_TIM3TIM3復用功能完全映射
        GPIO_Remap_TIM4TIM4復用功能映射
        GPIO_Remap1_CANCAN復用功能映射1
        GPIO_Remap2_CANCAN復用功能映射2
        GPIO_Remap_PD01PD01復用功能映射
        GPIO_Remap_SWJ_NoJTRST除JTRST外SWJ完全使能(JTAG+SW-DP)
        GPIO_Remap_SWJ_JTAGDisableJTAG-DP失能+SW-DP使能
        GPIO_Remap_SWJ_DisableSWJ完全失能(JTAG+SW-DP)
        每個功能在后面小節的應用中體現。
        ·voidGPIO_EXTILineConfig(u8GPIO_PortSource,u8GPIO_PinSource)
        GPIO配置為外部中斷,兩個值分別為端口值和引腳。
        ·voidGPIO_ETH_MediaInterfaceConfig(uint32_tGPIO_ETH_MediaInterface)
        最后一個配置以太網接口。該函數只有兩行語句。此處不作介紹。


        例程就不做介紹了,奮斗和微雪的板子都還不錯,初學者使用剛好。
        下一節研究下定時器的使用。


        關鍵詞: STM32GPIO配

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 绥芬河市| 宿松县| 左权县| 麻城市| 乌审旗| 忻州市| 蓝山县| 泸溪县| 安多县| 青铜峡市| 澎湖县| 博客| 秦皇岛市| 霍林郭勒市| 锦屏县| 息烽县| 织金县| 神农架林区| 凤庆县| 绥宁县| 丹东市| 温宿县| 广东省| 杭锦后旗| 永德县| 石城县| 德令哈市| 峡江县| 长岭县| 保康县| 交城县| 民权县| 噶尔县| 微博| 茌平县| 白水县| 两当县| 容城县| 高碑店市| 垣曲县| 蛟河市|