STM32 GPIO入門學(xué)習(xí)
不過還好,使用的是STM32的FWLib3.0軟件包,里面的GPIO口函數(shù)都做好了,只要看一下使用就可以了。
先看一些網(wǎng)上跟書上找到的資料跟自己總結(jié)的咚咚:
1.STM32每個(gè)GPI/O 端口有兩個(gè)32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR),一個(gè)32 位置位/復(fù)位寄存器(GPIOx_BSRR),一個(gè)16 位復(fù)位寄存器(GPIOx_BRR)和一個(gè)32 位鎖定寄存器(GPIOx_LCKR)。
2.GPIO 端口的每個(gè)位可以由軟件分別配置成多種模式。每個(gè)I/O 端口位可以自由編程,然而I/0 端口寄存器必須按32 位字被訪問(不允許半字或字節(jié)訪問)。GPIOx_BSRR 和GPIOx_BRR 寄存器允許對任何GPIO 寄存器的讀/更改的獨(dú)立訪問;這樣,在讀和更改訪問之間產(chǎn)生IRQ 時(shí)不會(huì)發(fā)生危險(xiǎn)。端口位配置 CNFx[1:0]=xxb,MODEx[1:0]=xxb
3.GPIO_InitTypeDef是GPIO口的一個(gè)定義結(jié)構(gòu)體,包含一個(gè)16位的變量GPIO_Pin;一個(gè)GPIOSpeed_TypeDef枚舉結(jié)構(gòu)體GPIO_Speed;一個(gè)GPIOMode_TypeDef 枚舉結(jié)構(gòu)體GPIO_Mode;這3個(gè)變量可以在外部被定義,用于初始化或者改變某些GPIO的速度跟類型。
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
typedef enum表示定義了一個(gè)枚舉型的數(shù)據(jù)結(jié)構(gòu),可以用GPIOSpeed_TypeDef去定義變量,這個(gè)變量的取值就是
GPIO_Speed_10MHz ,GPIO_Speed_2MHz, GPIO_Speed_50MHz中的一個(gè)。默認(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í),需要設(shè)置IO口為有上拉電阻模式
GPIO_Mode_AF_OD 0x1c 開漏復(fù)用
GPIO_Mode_AF_PP 0x18 推挽復(fù)用
5.輸出速度可選擇:2MHz,10MHz,50MHz。
6.IO口功能:通用I/O(GPIO)用,輸入輸出;單獨(dú)的位設(shè)置或位清除;外部中斷/喚醒線:端口必須配置成輸入模式時(shí),所有端口都有外部中斷能力;復(fù)用功能(AF),并且軟件能重新映射I/O復(fù)用功能;GPIO鎖定機(jī)制:主要針對復(fù)位設(shè)定的,當(dāng)某端口位lock后,復(fù)位后將不改變的此端口的位配置。
使用起來如果自己去讀寫寄存器地址操作,還是十分麻煩的,還好FWLib3.0軟件包里面的GPIO庫文件已經(jīng)為我們準(zhǔn)備好了很多的操作函數(shù),可以直接使用。
下面熟悉一些會(huì)比較經(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里面的項(xiàng)目賦默認(rèn)值
5.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):讀某一排引腳里面某個(gè)引腳的值
6.uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx):讀整排引腳的值
7.uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):讀某排引腳里面的輸出寄存器的某個(gè)引腳值
8.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx):讀某排引腳輸出寄存器里面值
9.void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):某排引腳某個(gè)引腳輸出1
10.void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):某排引腳某個(gè)引腳輸出0
11.void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal):設(shè)置某排引腳某個(gè)引腳的輸出值
12.void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal):設(shè)置某排引腳輸出值
13.void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):鎖定某排引腳中某個(gè)引腳,復(fù)位時(shí)候設(shè)置不變。
14.void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource):選擇某個(gè)引腳當(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):選擇某個(gè)引腳當(dāng)外部中斷用
>.< 具體函數(shù)里面的操作看得有點(diǎn)暈 ..哎 后悔在學(xué)校時(shí)候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時(shí)鐘
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的時(shí)候也是這個(gè)開始的…不過那個(gè)程序多簡單- -||| 直接把一個(gè)1位移,然后PC等于過去就行了…
跑馬燈之后我又試著用5個(gè)GPIO口來驅(qū)動(dòng)一個(gè)串口的點(diǎn)陣屏幕,估計(jì)是2MHz還太快的原因,一直沒把它點(diǎn)亮…明天加延時(shí)跟修改下其他的,看看能不能把它點(diǎn)亮。
評論