嵌入式八股文之 GPIO

1. GPIO 的基本概念

(1) 什么是 GPIO?

GPIO 的中文意思是通用輸入輸出端口(General Purpose Input/Output),是嵌入式系統中可編程控制的通用引腳,可通過軟件配置為輸入或輸出模式。(背誦)

(2) 它的主要功能是什么?(背誦)

輸入功能:讀取引腳電平狀態獲取按鍵和各類傳感器的信息輸入。

輸出功能:輸出高低電平,控制外圍設備。

復用功能:部分GPIO可配置為特殊功能(如UART、SPI、I2C)

2. GPIO 的 8 種工作模式(背誦)

模式名稱性質關鍵特征
浮空輸入數字輸入可讀取引腳電平,若引腳懸空,則電平不確定(巧記:輸入為讀取)
上拉輸入數字輸入可讀取引腳電平,內部連接上拉電阻,懸空時默認高電平
下拉輸入數字輸入可讀取引腳電平,內部連接下拉電阻,懸空時默認低電平
模擬輸入模擬輸入?GPIO 無效,引腳直接接入內部 ADC
開漏輸出數字輸出可輸出引腳電平,高電平為高阻態,低電平接 VSS(巧記:輸出為輸出)
推挽輸出數字輸出可輸出引腳電平,高電平接 VDD,低電平接 VSS
復用開漏輸出數字輸出由片上外設控制,高電平為高阻態,低電平為 VSS
復用推挽輸出數字輸出由片上外設控制,高電平接 VDD,低電平接 VSS

(1) 上拉/下拉電阻:上拉/下拉電阻用于設置引腳的默認電壓。上拉使能,引腳默認電壓為高電平,下拉使能,引腳默認電壓為低電平。

(2) VSS 通常指電路的負極,VDD 通常指電路的正電源。

3. 推挽輸出和開漏輸出的區別

(1)?

4. GPIO 初始化流程(以STM32為例,描述GPIO初始化的步驟)

(1) 使能GPIO時鐘

作用:微控制器中外設(如GPIO)默認處于關閉狀態以節省功耗。時鐘信號是數字電路工作的基礎,必須開啟對應GPIO端口的時鐘,才能配置和使用其引腳

操作實例:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  # 使能GPIOA的時鐘
  • RCC:Reset and Clock Control(復位與時鐘控制器),負責管理系統時鐘和外設時鐘。
  • APB2:一種低速總線,連接GPIO、USART等外設。
  • PeriphClockcmd:外設時鐘控制命令。

(2) 配置GPIO引腳參數(背誦)

① 關鍵參數:

  • Pin:選擇具體的引腳(如GPIO_PIN_5)。
  • Mode:設置引腳模式(輸入/輸出/復用/模擬)。
  • Pull:配置上拉或下拉電阻(上拉、下拉、無上下拉)。
  • Speed:輸出驅動速度(低速、中速、高速、超高速)。

(3) 調用 GPIO_Init() 生效

① 聲明結構體變量:

GPIO_InitTypeDef GPIO_InitStruct;  # 創建結構體實例

② 填充配置參數:

# 示例:配置PA5為推挽輸出,高速,無上下拉
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pull = GPIO_PuPd_NOPULL;

③ 調用初始化函數:

GPIO_Init(GPIOA, &GPIO_InitStruct);  # 應用配置到GPIOA端口

5. GPIO 必記函數

(1) 時鐘控制函數:

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

示例:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); # 開啟GPIOA的時鐘

(2) GPIO 初始化函數:

void GPIO_DeInit(GPIO_TypeDef* GPIOx); # 被指定的GPIO外設會被復位
void GPIO_AFIODeInit(); # 復位AFIO復用功能配置
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* InitStruct); # 配置GPIO引腳的工作模式、速度、上下拉等參數
void GPIO_StructInit(GPIO_InitTypeDef* InitStruct); # 把結構體變量賦值一個默認值

示例:

GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_5;        # 選擇PA5引腳
gpio.GPIO_Mode = GPIO_Mode_Out_PP; # 推挽輸出模式
gpio.GPIO_Speed = GPIO_Speed_50MHz; # 高速驅動
GPIO_Init(GPIOA, &gpio);           # 應用配置到GPIOA
GPIO_DeInit(GPIOA);  # 復位GPIOA所有寄存器的值
gpio.GPIO_Pin = GPIO_Pin_5;        # 仍選擇PA5
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; # 浮空輸入模式
GPIO_Init(GPIOA, &gpio);           # 重新初始化PA5

(3) 輸出控制類函數:

① GPIO_SetBits()

  • 功能:將指定引腳設置為高電平(1)。
  • 示例:點亮LED。
GPIO_SetBits(GPIOA, GPIO_Pin_5);  # PA5輸出高電平

② GPIO_ResetBits()

  • 功能:將指定引腳設置為低電平(0)。
  • 示例:熄滅LED。
GPIO_ResetBits(GPIOA, GPIO_Pin_5); # PA5輸出低電平

③ GPIO_WriteBit()

  • 功能:動態設置單個引腳電平(可替代SetBits/ResetBits)。
  • 示例:根據條件設置電平。
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (condition ? Bit_SET : Bit_RESET));

(4) 輸入讀取類函數:

① GPIO_ReadInputDataBit()

  • 功能:讀取單個引腳的電平狀態(輸入模式時使用)。
  • 示例:檢測按鍵按下。
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {# 引腳PA0為低電平(按鍵按下)
}

② GPIO_ReadOutputDataBit()

  • 功能:讀取輸出寄存器的狀態(輸出模式時使用)。
  • 示例:檢測當前輸出值。
BitStatus pinState = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);

(5) 必須掌握的模式宏定義:

GPIO_Mode_AIN 是模擬輸入。

GPIO_Mode_IN_FLOATING 是浮空輸入。

GPIO_Mode_IPD 是下拉輸入。

GPIO_Mode_IPU 是上拉輸入。

GPIO_Mode_Out_OD 是開漏輸出。

GPIO_Mode_Out_PP 是推挽輸出。

GPIO_Mode_AF_OD 是復用開漏。

GPIO_Mode_AF_PP 是復用推挽。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90704.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Umi-OCR 的 Docker安裝(win制作鏡像,Linux(Ubuntu Server 22.04)離線部署)

前置博客:Ubuntu-Server 22.04.4 詳細安裝圖文教程 wget命令在windows終端下不能使用的原因及解決辦法 在 Ubuntu 22.04 LTS 上離線安裝 Docker 手把手教你在Win11下安裝docker Umi-OCR 安裝docker時報錯:workstation服務啟動報錯。錯誤1075&#…

力扣242.有效的字母異位詞

給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的 字母異位詞。示例 1:輸入: s "anagram", t "nagaram" 輸出: true示例 2:輸入: s "rat", t "car" 輸出: false提示:1 < s.length, t.length < 5 * 104s…

基于Springboot+UniApp+Ai實現模擬面試小工具二:后端項目搭建

本節介紹本項目后端項目的開發工具及基礎項目的搭建&#xff0c;包括開發工具介紹及后端項目的創建和依賴框架的引入及對應配置。 源碼下載&#xff1a; 點擊下載 講解視頻&#xff1a; UniappSpringbootKimi實現模擬面試小程序-Springboot項目創建一&#xff0e;開發工具 1.…

Linux711 Mysql

模版 root192.168.235.130s password:┌──────────────────────────────────────────────────────────────────────┐│ ? MobaXterm Personal Edition v23.2 ? ││…

QT 秘鑰生成工具

該項目是注冊機和驗證機項目&#xff0c;分別是密鑰生成工具&#xff0c;和密鑰驗證demo,可以識別電腦唯一標識碼。#include "frmmain.h" #include "ui_frmmain.h" #include "qmessagebox.h" #include "qfile.h" #pragma execution_ch…

PyTorch神經網絡訓練全流程詳解:從線性層到參數優化

目錄 一、神經網絡訓練的核心組件 二、代碼逐行解析與知識點 三、核心組件詳解 3.1 線性層(nn.Linear) 3.2 損失函數(nn.MSELoss) 3.3 優化器(optim.SGD) 四、訓練流程詳解 五、實際應用建議 六、完整訓練循環示例 七、總結 在深度學習實踐中&#xff0c;理解神經網絡…

從代碼學習深度學習 - 針對序列級和詞元級應用微調BERT PyTorch版

文章目錄 前言針對序列級和詞元級應用微調BERT單文本分類文本對分類或回歸文本標注問答總結前言 在自然語言處理(NLP)的廣闊天地里,預訓練模型(Pre-trained Models)的出現無疑是一場革命。它們如同站在巨人肩膀上的探索者,使得我們能夠利用在大規模文本語料上學到的豐富…

學習筆記丨卷積神經網絡(CNN):原理剖析與多領域Github應用

本文深入剖析了卷積神經網絡&#xff08;CNN&#xff09;的核心原理&#xff0c;并探討其在計算機視覺、圖像處理及信號處理等領域的廣泛應用。下面就是本篇博客的全部內容&#xff01;&#xff08;內附相關GitHub數據庫鏈接&#xff09; 目錄 一、什么是CNN&#xff1f; 二、…

cnpm exec v.s. npx

1. 核心定位與設計目標 npx (Node Package Executor): 定位: Node.js 內置工具&#xff08;npm 5.2 起捆綁&#xff09;&#xff0c;核心目標是便捷地執行本地或遠程 npm 包中的命令&#xff0c;無需全局安裝。核心價值: 避免全局污染&#xff1a; 臨時使用某個 CLI 工具&#…

我花10個小時,寫出了小白也能看懂的數倉搭建方案

目錄 一、什么是數據倉庫 1.面向主題 2.集成 3.相對穩定 4.反映歷史變化 二、數倉搭建的優勢 1.性能 2.成本 3.效率 4.質量 三、數倉搭建要考慮的角度 1.需求 2.技術路徑 3.數據路徑 4.BI應用路徑 四、如何進行數倉搭建 1.ODS層 2.DW層 3.DM層 五、寫在最后…

OBB旋轉框檢測配置與訓練全流程(基于 DOTA8 數據集)

&#x1f680; YOLO交通標志識別實戰&#xff08;五&#xff09;&#xff1a;OBB旋轉框檢測配置與訓練全流程&#xff08;基于 DOTA8 數據集&#xff09; 在專欄前面四篇里&#xff0c;我們完成了&#xff1a; ? Kaggle交通標志數據集下載并重組標準YOLO格式 ? 訓練/驗證集拆…

uniapp制作一個視頻播放頁面

1.產品展示2.頁面功能(1)點擊上方按鈕實現頁面跳轉&#xff1b;(2)點擊相關視頻實現視頻播放。3.uniapp代碼<template><view class"container"><!-- 頂部分類文字 --><view class"categories"><navigator class"category-…

8.卷積神經網絡基礎

8.1 卷積核計算 import torch from torch import nn import matplotlib.pyplot as plt def corr2d(X,k):#計算二維互相關運算h,wk.shape#卷積核的長和寬Ytorch.zeros((X.shape[0]-h1,X.shape[1]-w1))#創建(X-H1,X-W1)的全零矩陣for i in range(Y.shape[0]):for j in range(Y.s…

【每天一個知識點】子空間聚類(Subspace Clustering)

“子空間聚類&#xff08;Subspace Clustering&#xff09;”是一種面向高維數據分析的聚類方法&#xff0c;它通過在數據的低維子空間中尋找簇結構&#xff0c;解決傳統聚類在高維空間中“維度詛咒”帶來的問題。子空間聚類簡介在高維數據分析任務中&#xff0c;如基因表達、圖…

《匯編語言:基于X86處理器》第7章 整數運算(2)

本章將介紹匯編語言最大的優勢之一:基本的二進制移位和循環移位技術。實際上&#xff0c;位操作是計算機圖形學、數據加密和硬件控制的固有部分。實現位操作的指令是功能強大的工具&#xff0c;但是高級語言只能實現其中的一部分&#xff0c;并且由于高級語言要求與平臺無關&am…

JVM故障處理與類加載全解析

1、故障處理工具基礎故障處理工具jps&#xff1a;可以列出正在運行的虛擬機進程&#xff0c;并顯示虛擬機執行主類&#xff08;Main Class&#xff0c;main()函數所在的類&#xff09;名稱以及這些進程的本地虛擬機唯一ID&#xff08;LVMID&#xff0c;Local Virtual Machine I…

Python 第三方庫的安裝與卸載全指南

在 Python 開發中&#xff0c;第三方庫是提升效率的重要工具。無論是數據分析、Web 開發還是人工智能領域&#xff0c;都離不開豐富的第三方資源。本文將詳細介紹 Python 第三方庫的安裝與卸載方法&#xff0c;幫助開發者輕松管理依賴環境。 一、第三方庫安裝方法 1. pip 工具…

RabbitMQ 高級特性之消息分發

1. 為什么要消息分發當 broker 擁有多個消費者時&#xff0c;就會將消息分發給不同的消費者&#xff0c;消費者之間的消息不會重復&#xff0c;RabbitMQ 默認的消息分發機制是輪詢&#xff0c;但會無論消費者是否發送了 ack&#xff0c;broker 都會繼續發送消息至消費者&#x…

Linux操作系統從入門到實戰:怎么查看,刪除,更新本地的軟件鏡像源

Linux操作系統從入門到實戰&#xff1a;怎么查看&#xff0c;刪除&#xff0c;更新本地的軟件鏡像源前言一、 查看當前鏡像源二、刪除當前鏡像源三、更新鏡像源四、驗證前言 我的Linux版本是CentOS 9 stream本篇博客我們來講解怎么查看&#xff0c;刪除&#xff0c;更新國內本…

兩臺電腦通過網線直連形成局域網,共享一臺wifi網絡實現上網

文章目錄一、背景二、實現方式1、電腦A&#xff08;主&#xff09;2、電腦B3、防火墻4、驗證三、踩坑1、有時候B上不了網一、背景 兩臺windows電腦A和B&#xff0c;想通過**微軟無界鼠標&#xff08;Mouse without Borders&#xff09;**實現一套鍵盤鼠標控制兩臺電腦&#xf…