新聞中心

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

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

作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
今天下午開始學(xué)習(xí)STM32GPIO控制,開始以為跟AVR單片機一樣,只是設(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中的一個。默認為零,其后面的依次加1。這些都可以自己取值,如
GPIO_Speed_10MHz 就等于1,其后還是依次加1.




4.強大的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鎖定機制:主要針對復(fù)位設(shè)定的,當(dāng)某端口位lock后,復(fù)位后將不改變的此端口的位配置。

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

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

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

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里面的項目賦默認值

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

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


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

評論


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

關(guān)閉