STM32 GPIO入門學習

今天下午開始學習STM32的GPIO控制,開始以爲跟AVR單片機一樣,只是設置方向寄存器跟引腳寄存器,一排引腳由8位變16位而已,誰知道一看資料才發現居然還有IO口狀態設置,設置速度設置…

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

先看一些網上跟書上找到的資料跟自己總結的咚咚:

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

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

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

typedef enum

GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz, 
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

typedef enum表示定義了一個枚舉型的數據結構,可以用GPIOSpeed_TypeDef去定義變量,這個變量的取值就是
GPIO_Speed_10MHz ,GPIO_Speed_2MHz, GPIO_Speed_50MHz中的一個。默認爲零,其後面的依次加1。這些都可以自己取值,如 
GPIO_Speed_10MHz 就等於1,其後還是依次加1.




4.強大的GPIO口設置:

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 推輓輸出  推輓模式,寫數據時,需要設置IO口爲有上拉電阻模式
GPIO_Mode_AF_OD 0x1c 開漏複用 
GPIO_Mode_AF_PP 0x18 推輓複用 



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

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

使用起來如果自己去讀寫寄存器地址操作,還是十分麻煩的,還好FWLib3.0軟件包裏面的GPIO庫文件已經爲我們準備好了很多的操作函數,可以直接使用。 

下面熟悉一些會比較經常使用的: 

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

2.void GPIO_AFIODeInit(void):字面理解是複用IO的初始化,但是IO的服用現在還沒學習到…先空起 

3.void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct):根據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):設置某排引腳某個引腳的輸出值 

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

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

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

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

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

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

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

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

#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… 然後在調試界面裏面Run~ 嘿嘿 看到跑馬燈效果了…N年前開始玩51的時候也是這個開始的…不過那個程序多簡單- -||| 直接把一個1位移,然後PC等於過去就行了…

跑馬燈之後我又試着用5個GPIO口來驅動一個串口的點陣屏幕,估計是2MHz還太快的原因,一直沒把它點亮…明天加延時跟修改下其他的,看看能不能把它點亮。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章