0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32基礎(chǔ)知識:GPIO(通用輸入輸出接口)

CHANBAEK ? 來源:上下求索電子er ? 作者:上下求索電子er ? 2023-10-24 15:22 ? 次閱讀

GPIO(通用輸入輸出接口)

1 GPIO 功能概述

GPIO 是通用輸入/輸出(General Purpose I/O)的簡稱,主要用于工業(yè)現(xiàn)場需要用到數(shù)字量輸入/輸出的場合,例如:

  • 輸出功能 :繼電器、 LED、蜂鳴器等的控制
  • 輸入功能傳感器狀態(tài)、高低電平等信息的讀取
  • 復用功能 :片內(nèi)外設(shè)的對外接口
  • 時序模擬 :模擬 SPI、I2CUART 等常用接口的時序

2 STM32 的 GPIO 特性

  • 多種工作模式:輸出/輸入/復用/模擬
  • 靈活的復用模式
  • 5V 電壓容限
  • 外部中斷功能

3 端口和引腳

  • 端口(PORT): 獨立的外設(shè)子模塊,包括多個引腳,通過多個硬件寄存器控制引腳。

GPIO 模塊由端口 GPIOA、GPIOB、GPIOC 等多個獨立的子模塊構(gòu)成。

例如:端口 GPIOA 包括 PA0 ~ PA15 這 16 個引腳,通過 10 個硬件寄存器控制引腳工作。

  • 引腳(PIN): 對應(yīng)微控制器的一個管腳,歸屬于端口,由端口寄存器的對應(yīng)位控制。

PA0,屬于端口 GPIOA,輸出電平由端口 GPIOA 的輸出數(shù)據(jù)寄存器 GPIOA_ODR 的第 0 位決定。

4 GPIO 電路

圖片

5 GPIO 工作模式

  • 輸入模式:浮空輸入/上拉輸入/下拉輸入
    • 浮空輸入:按鍵識別
    • 上拉輸入:IO 內(nèi)部上拉電阻輸入
    • 下拉輸入:IO 內(nèi)部下拉電阻輸入
  • 輸出模式:推挽輸出/開漏輸出
  • 推挽輸出時,P-MOS 管和 NMOS 管輪流工作,可以輸出高電平或低電平。主要用于連接數(shù)字器件,如指示燈和繼電器等模塊;
  • 開漏輸出時,P-MOS 管關(guān)閉,只有 N-MOS 管工作,此時只能輸出低電平。要輸出高電平必須外加上拉電阻,主要用于 I2C 總線。
  • 模擬模式
  • 模擬狀態(tài):表示引腳功能選擇為模擬模式,但不作為任何片內(nèi)模擬外設(shè)的復用腳,只是為了減少系統(tǒng)功耗。
  • 模擬外設(shè)復用引腳:表示引腳作為片內(nèi)模擬外設(shè)(A/D 轉(zhuǎn)換模塊、D/A 轉(zhuǎn)換模塊、模擬比較器等)的復用腳,用于完成相應(yīng)的功能操作。圖片
  • 復用模式
    在 CubeMX 軟件的引腳分配圖中點擊引腳即可彈出引腳的復用功能
  • 復用推挽:片內(nèi)外設(shè)功能(URAT 的 TX,RX,SPI 的 MOSI,MISO,SCK,SS );
  • 復用開漏:片內(nèi)外設(shè)功能( I2C 的 SCL,SDA )。

6 基于 HAL 庫控制 GPIO

6.1 GPIO 外設(shè)的數(shù)據(jù)類型

  1. 引腳初始化: 采用結(jié)構(gòu)體類型實現(xiàn),用于定義引腳的序號、工作模式、輸出速度等基本特性。
  2. 引腳電平狀態(tài): 采用枚舉類型實現(xiàn),用于定義引腳的電平狀態(tài):高電平和低電平。
  3. 引腳所屬端口: 采用結(jié)構(gòu)體指針實現(xiàn),用于訪問該端口所對應(yīng)的寄存器組。

引腳初始化數(shù)據(jù)類型

圖片

  • 成員變量 Pin 的取值范圍:GPIO_PIN_0 ~ GPIO_PIN15

  • 成員變量 Pin 的取值范圍:

    GPIO_MODE_INPUT浮空輸入模式
    GPIO_MODE_OUTPUT_PP推挽輸出模式
    GPIO_MODE_OUTPUT_OD開漏輸出模式
    GPIO_MODE_AF_PP復用功能下的推挽模式
    GPIO_MODE_AF_OD復用功能下的開漏模式
    GPIO_MODE_ANALOG模擬模式
  • 成員變量 Pull 的取值范圍:

    GPIO_NOPULL沒有上拉或下拉電阻激活
    GPIO_PULLUP上拉電阻激活
    GPIO_PULLDOWN下拉電阻激活
  • 成員變量 Speed 的取值范圍:

    GPIO_SPEED_FREQ_LOW引腳輸出速度 2MHz
    GPIO_SPEED_FREQ_MEDIUM引腳輸出速度 12.5MHz ~ 50MHz
    GPIO_SPEED_FREQ_HIGH引腳輸出速度 25MHz ~ 100MHz
    GPIO_SPEED_FREQ_VERY_HIGH引腳輸出速度 50MHz ~ 200MHz
  • 成員變量 Alternate 的取值范圍

    • Alternate 表示引腳的復用功能;
    • 由于不同型號的 STM32 微控制器片內(nèi)集成的外設(shè)不同,因此該成員變量的取值范圍由芯片型號決定。
    • 以 STM32F1 系列芯片為例,通過查閱stm32f1xx_hal_gpio_ex.h文件可以了解 Alternate 的取值范圍;
    • 該成員變量的取值一般通過 CubeMX 軟件分配,不需要用戶手動設(shè)置;

引腳電平狀態(tài)數(shù)據(jù)類型

圖片

端口數(shù)據(jù)類型:指向端口寄存器組的結(jié)構(gòu)體指針

GPIOA,GPIOB,GPIOC

  • 不同型號的 STM32 微控制器的端口數(shù)量各不相同;
  • 端口數(shù)據(jù)類型的定義是在以芯片型號命名的.h 文件中.

6.2 使用 HAL 庫的引腳初始化步驟

  1. 定義變量: 利用引腳初始化結(jié)構(gòu)體類型GPIO_InitTypeDef 定義一個結(jié)構(gòu)體變量。
  2. 設(shè)置模式: 按照引腳的工作模式,依次對該結(jié)構(gòu)體的成員變量賦值,如 pin、mode、pull 等。
  3. 調(diào)用函數(shù): 調(diào)用初始化函數(shù)HAL_GPIO_Init將配置參數(shù)寫入到對應(yīng)的寄存器,入口參數(shù)為端口號和結(jié)構(gòu)體變量。

6.3 GPIO 外設(shè)接口函數(shù)的概述

  1. 引腳初始化函數(shù):HAL_GPIO_Init

    函數(shù)原型復位引腳到初始狀態(tài)
    功能描述引腳初始化
    入口參數(shù) 1GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK
    入口參數(shù) 2GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù)
    返回值
    注意事項該函數(shù)可以由 CubeMX 軟件自動生成
  2. 引腳復位函數(shù):HAL_GPIO_DeInit

    函數(shù)原型void HAL_GPIO_DeInit (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin)
    功能描述復位引腳到初始狀態(tài)
    入口參數(shù) 1GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK
    入口參數(shù) 2GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù)
    返回值
    注意事項該函數(shù)需要用戶調(diào)用
  3. 讀取引腳函數(shù):HAL_GPIO_ReadPin

    函數(shù)原型GPIO_PinState HAL_GPIO_ReadPin ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin )
    功能描述讀取引腳的電平狀態(tài)
    入口參數(shù) 1GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK
    入口參數(shù) 2GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù)
    返回值GPIO_PinState:表示引腳電平狀態(tài)的枚舉類型變量,可以是GPIO_PIN_SET 或 GPIO_PIN_RESET
    注意事項該函數(shù)需要用戶調(diào)用
  4. 寫入引腳函數(shù):HAL_GPIO_WritePin

    函數(shù)原型void HAL_GPIO_WritePin( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState )
    功能描述設(shè)置引腳輸出高/低電平
    入口參數(shù) 1GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK
    入口參數(shù) 2GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù)
    返回值GPIO_PinState:表示引腳電平狀態(tài)的枚舉類型變量,可以是 GPIO_PIN_SET 或 GPIO_PIN_RESET
    注意事項該函數(shù)需要用戶調(diào)用
  5. 翻轉(zhuǎn)引腳函數(shù):HAL_GPIO_TogglePin

    函數(shù)原型void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
    功能描述翻轉(zhuǎn)引腳狀態(tài)
    入口參數(shù) 1GPIOx:引腳端口號,取值范圍是 GPIOA ~ GPIOK
    入口參數(shù) 2GPIO_Init:指向引腳初始化類型 GPIO_InitTypeDef 的結(jié)構(gòu)體指針,該結(jié)構(gòu)體包含指定引腳的配置參數(shù)
    返回值
    注意事項該函數(shù)需要用戶調(diào)用

任務(wù)實踐

基于STM32F103C8T6,開發(fā)板原理圖

圖片

采用查詢方式檢測按鍵KEY1狀態(tài),按鍵按下后執(zhí)行操作:翻轉(zhuǎn)指示燈 LED1 的狀態(tài)。

注:本任務(wù)例程使用的開發(fā)板,LED1與STM32的PA1相連接,KEY1與PA0相連接。KEY1原理圖如下:

圖片

使用按鍵時,需要設(shè)置PA0為輸入上拉模式,這樣在KEY1沒有按下時,PA0可以讀取到高電平,KEY1按下時PA0可以讀取到低電平。

按鍵消抖:

通常的按鍵所用開關(guān)為機械彈性開關(guān),當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關(guān)在閉合時不會馬上穩(wěn)定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖。

抖動時間的長短由按鍵的機械特性決定,一般為5ms~10ms。按鍵穩(wěn)定閉合時間的長短則是由操作人員的按鍵動作決定的,一般為零點幾秒至數(shù)秒。為確保CPU對鍵的一次閉合僅作一次處理,必須去除鍵抖動。在鍵閉合穩(wěn)定時讀取鍵的狀態(tài),并且必須判別到鍵釋放穩(wěn)定后再作處理。

下圖為按鍵按下時,電壓波形的變化。

圖片

  • 前沿抖動 5 ~ 10ms,后沿抖動 5 ~ 10ms
  • 按鍵的抖動會導致一次按鍵動作被當成多次按鍵,為確保 MCU 對按鍵的一次閉合僅作一次處理,必須消除按鍵的抖動,在按鍵處于穩(wěn)定狀態(tài)時讀取按鍵的狀態(tài)。
  • 硬件消抖:利用 RC 低通濾波器濾掉抖動
    圖片
  • 軟件消抖:
    1. 檢測出按鍵閉合后執(zhí)行延時程序,延時時間為 5ms ~ 10ms,用于去掉前沿抖動;
    2. 再次檢測按鍵狀態(tài),如果保持閉合狀態(tài),才認為按下,并執(zhí)行相應(yīng)的按鍵任務(wù);
    3. 按鍵的釋放可以采用延時或者循環(huán)檢測的方式去掉后沿抖動。
  1. 配置 PA0 為 GPIO_Input,PA1 為 GPIO_Output
    圖片
  2. PA1 保持默認 GPIO 輸出模式即可
    圖片
  3. PA0 配置為輸入模式,上拉
    圖片

以上步驟生成如下代碼:

stm32f1xx_hal_gpio.c中生成 GPIO 引腳初始化函數(shù)MX_GPIO_Init,并在 main.c 中調(diào)用

  • 開啟外設(shè)時鐘 RCC
  • 配置 PA0,PA1 兩個引腳結(jié)構(gòu)
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PA1 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}
  1. 編寫程序

main.c中編寫程序

/* USER CODE BEGIN 3 */
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
    {
      HAL_Delay(10);
      if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
      {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
      }
      while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);
    }
  }
  /* USER CODE END 3 */
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 繼電器
    +關(guān)注

    關(guān)注

    132

    文章

    5350

    瀏覽量

    148917
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8600

    瀏覽量

    151166
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10900

    瀏覽量

    356049
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1204

    瀏覽量

    52104
  • HAL庫
    +關(guān)注

    關(guān)注

    1

    文章

    121

    瀏覽量

    6243
收藏 人收藏

    評論

    相關(guān)推薦

    GPIO通用輸入輸出接口

    I/O接口GPIO、IIC、SPI、UART、USB、HDMI(1)GPIO通用輸入輸出接口,
    發(fā)表于 12-16 07:20

    STM32F2技術(shù)培訓_通用輸入輸出端口_GPIO

    STM32F2技術(shù)培訓_通用輸入輸出端口_GPIO
    發(fā)表于 12-03 17:34 ?0次下載

    6.2 通用輸入輸出GPIO(神舟王207)

    此文檔是關(guān)于神舟王開發(fā)板之輸入輸出GPIO的介紹和講解;
    發(fā)表于 05-25 10:01 ?2次下載

    F2產(chǎn)品技術(shù)培訓_8.通用輸入輸出端口(GPIO

    F2產(chǎn)品技術(shù)培訓_8.通用輸入輸出端口(GPIO
    發(fā)表于 03-15 14:43 ?11次下載

    MCU通用輸入輸出端口(GPIO)輸出模式

    對于常規(guī)MCU,通用輸入輸出GPIO)是其最基本、最常用的功能,用于實現(xiàn)最基本的數(shù)字量輸入輸出。 信號一般為:以3.3VDC為高電平的
    發(fā)表于 10-28 19:06 ?16次下載
    MCU<b class='flag-5'>通用</b><b class='flag-5'>輸入輸出</b>端口(<b class='flag-5'>GPIO</b>)<b class='flag-5'>輸出</b>模式

    04、STM8通用輸入輸出口(GPIO)

    04、STM8通用輸入輸出口(GPIO)文章目錄04、STM8通用輸入輸出口(GPIO)1、概述
    發(fā)表于 11-26 15:21 ?9次下載
    04、STM8<b class='flag-5'>通用</b><b class='flag-5'>輸入輸出</b>口(<b class='flag-5'>GPIO</b>)

    STM32的8種GPIO輸入輸出模式

    STM32的8種GPIO輸入輸出模式參考文章“STM32的8種GPIO輸入輸出模式深入詳解”和“
    發(fā)表于 11-26 17:06 ?16次下載
    <b class='flag-5'>STM32</b>的8種<b class='flag-5'>GPIO</b><b class='flag-5'>輸入輸出</b>模式

    [STM32]STM32F407系列教程之二,gpio輸入輸出實驗

    [STM32]STM32F407系列教程之二,gpio輸入輸出實驗
    發(fā)表于 11-29 14:06 ?19次下載
    [<b class='flag-5'>STM32</b>]<b class='flag-5'>STM32</b>F407系列教程之二,<b class='flag-5'>gpio</b><b class='flag-5'>輸入輸出</b>實驗

    2、【STM32F0系列學習】之—通用輸入輸出端口(GPIO)

    STM32F0系列學習】之—通用輸入輸出端口GPIO1、GPIO端口配置說明1、GPIO端口配
    發(fā)表于 11-29 16:51 ?66次下載
    2、【<b class='flag-5'>STM32</b>F0系列學習】之—<b class='flag-5'>通用</b><b class='flag-5'>輸入輸出</b>端口(<b class='flag-5'>GPIO</b>)

    GPIO通用輸入輸出

    GPIO通用輸入輸出一、GPIO的功能概述用途:GPIO通用
    發(fā)表于 12-20 18:58 ?6次下載
    <b class='flag-5'>GPIO</b><b class='flag-5'>通用</b><b class='flag-5'>輸入輸出</b>

    第二章 stm32 cubemx GPIO輸入輸出實驗以及proteus仿真

    第二章 stm32 cubemx GPIO輸入輸出實驗以及proteus仿真文章目錄第二章 stm32 cubemx GPIO
    發(fā)表于 01-17 10:28 ?10次下載
    第二章 <b class='flag-5'>stm32</b> cubemx <b class='flag-5'>GPIO</b><b class='flag-5'>輸入輸出</b>實驗以及proteus仿真

    通用輸入輸出GPIO是什么

    GPIO代表通用輸入/輸出。它是集成電路上的一種引腳,沒有特定功能。雖然大多數(shù)引腳都有專用用途,例如向特定組件發(fā)送信號,但 GPIO 引腳的
    發(fā)表于 03-23 14:04 ?1436次閱讀
    <b class='flag-5'>通用</b><b class='flag-5'>輸入輸出</b><b class='flag-5'>GPIO</b>是什么

    樹莓派GPIO(通用輸入輸出)講解

    界面(GUI),網(wǎng)絡(luò)通信等等。但目前的知識已經(jīng)可以讓我們使用Python編寫簡單程序了。我們先放下Python,開始學習樹莓派最好玩的部分GPIO(通用輸入輸出)。
    的頭像 發(fā)表于 07-02 15:00 ?5823次閱讀
    樹莓派<b class='flag-5'>GPIO</b>(<b class='flag-5'>通用</b><b class='flag-5'>輸入輸出</b>)講解

    STM32單片機的GPIO輸入、輸出模式與配置方法

    STM32 單片機是一款高性能、低功耗的 32 位微控制器,具有強大的計算能力、靈活的外設(shè)模塊和實現(xiàn)微控制器應(yīng)用所需的社區(qū)支持。在單片機應(yīng)用中,GPIO 輸入輸出模式是必不可少的硬件接口
    發(fā)表于 08-15 18:23 ?8354次閱讀

    gpio接口是干什么的 gpio四種輸入輸出模式怎么選擇

    GPIO接口的作用 GPIO(General Purpose Input/Output)接口,即通用輸入
    的頭像 發(fā)表于 10-06 16:07 ?2767次閱讀