1. 程式人生 > >STM32入門之GPIO

STM32入門之GPIO

STM32的一般學習流程

1、學習STM32 基礎知識,系統框架 ,並熟悉其開發環境

2、新建工程,下載程式

3、GPIO使用,位段操作

4、SysTick 定時器及定時器

5、中斷概念,中斷系統

6、外部中斷

7、定時器中斷及脈衝寬度調製

8、串列埠通訊及串列埠中斷

9、TFTLCD 顯示

10、觸控式螢幕

11、RTC 實時時鐘

12、模擬/數字轉換 和數字/模擬轉換 (AD/DA)

13、IIC 與 EEPROM

14、SPI 與 FLASH

(以下為非必須)

15、看門狗

16、DMA 資料傳送

17、.UCOS作業系統

18、SDIO 與 SD 卡

19、ucGUI 及檔案系統

STM32之GPIO操作

今天主要講的是STM32 GPIO口的操作,對比起51微控制器,是STM32的IO資源變豐富了。

以STM32F103為例,GPIO口分為A,B,C,D,E,F,G  7組,每組16個I/O。所有的IO都是多功能的,使用前使用者要先配置(輸入/輸出/複用),預設輸入功能。

每個GPIO埠有2個32位配置暫存器(GPIOx_CRL、GPIOx_CRH); 2個32位資料暫存器( GPIOx_IDR、GPIOx_ODR );1個32位置位/復位暫存器( GPIOx_BSRR); 埠位清除暫存器(GPIOx_BRR) 和1個32位鎖定暫存器( GPIOx_LCKR)。 

 0~7:低IO,用GPIOx_CRL配置;8~15:高IO, GPIOx_CRH配置。GPIOx_CRL和GPIOx_CRH 的每4個位配置一個IO口。

GPIO暫存器描述

埠配置低暫存器 :用於配置GPIOx.0~GPIOx.7模式。


埠配置低暫存器(GPIOx_CRL) (x=A..E)

埠配置高暫存器:用於配置GPIOx.8~GPIOx.15模式。


埠配置高暫存器(GPIOx_CRH) (x=A..E)

埠輸入資料暫存器:判斷IO口狀態。


埠輸入資料暫存器(GPIOx_IDR) (x=A..E)

埠輸出資料暫存器:對IO口輸出電平進行控制。


埠輸出資料暫存器(GPIOx_ODR) (x=A..E)

示例程式

1、IO輸出模式以點亮LED(GPIOB.5)為例,步驟如下:

led初始化
(1)開啟對應GPIO口時鐘(APB2ENR外設時鐘使能暫存器)

(2)GPIO埠配置:1)GPIOB5口置零    2)設定GPIOB5口模式(推輓輸出)

程式

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
      /* GPIOC Configuration:kuozhangban as alternate function push-pull */
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

      GPIO_Init(GPIOB, &GPIO_InitStructure);

}

GPIO_SetBits(GPIOB,GPIO_Pin_5);//按鍵置“1”
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//按鍵置“0”

2、IO輸入模式按鍵控制(GPIOB.5)為例,步驟如下:

按鍵初始化
(1)開啟對應GPIO口時鐘(GPIOA和E)
(2)GPIO埠配置:1)GPIOA0口置零  2)設定GPIOA0口模式(上(下)拉輸入) 3)設定輸出資料暫存器ODR(輸出高)
(3)或設定成浮空輸入,不需要設定ODR端

程式

void GPIO_Configuration(void)
{

     GPIO_InitTypeDef GPIO_InitStructure;

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

     GPIO_Init(GPIOB, &GPIO_InitStructure);
}

判斷:if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) )//高電平為“1”,低電平為“0”

最後寫一個按鍵掃描函式就可以了。

STM32位段操作

Cortex™-M3儲存器映像包括兩個位段(bit-band)區。這兩個位段區將別名儲存器區中的每個字對映到位段儲存器區的一個位,在別名儲存區寫入一個字具有對位段區的目標位執行讀-改-寫操作的相同效果。

C52微控制器可以簡單的將位單獨操作:P1.2=0;STM32的位段、位帶別名區就是為了實現這樣的功能,物件是SRAM、IO外設空間實現對這些地方的某一位的操作。

在定址空間另一地方,取一個別名區空間,從這個地址開始處,每一個字(32bit)就對應SRAM或I/O的一位.這樣1MB的SRAM就可以有32MB的對應別名區空間,就是1位膨脹成32位(1bit便是一個字),我們對這個別名區空間開始的某一字操作,置0或者1,就等於對映的SRAM或I/0相應的某一位進行操作。