帶你了解STM32:GPIO通用輸入輸出口

目錄

3.1 GPIO簡介

3.2 GPIO基本結構

3.3 GPIO位結構

輸入部分:

二極管的保護作用:

施密特觸發器:

片上外設端口

輸出部分:

MOS管

3.4 GPIO模式

3.4.1 浮空/上拉/下拉輸入

3.4.2 模擬輸入

3.4.3 開漏/推挽輸出

3.4.4 復用開漏/推挽輸出

3.5 LED和蜂鳴器簡介

3.5.1 LED和蜂鳴器的硬件電路

參考資料

3.6 面包板(供電區要通過跳線和中間區域連接)

3.7 LED代碼

第一步:開啟時鐘,初始化時鐘

第二步:將Delay函數加入工程,添加組,然后,魔術棒添加文件路徑

第三步:寫代碼點亮LED

第四步:按圖接線,如果要反接開漏模式,正接推挽模式,LED長線為正

3.8 LED流水燈代碼

第一步:按圖接線,將LED流水燈,連接到面包板上

第二步:復制LED閃爍代碼,然后,改名文件夾

第三步:修改LED閃爍代碼,實現LED流水燈

LED閃爍代碼

LED流水燈代碼

3.9 蜂鳴器代碼

第一步:按圖連接蜂鳴器到,面包板上,圖一畫圈按照圖二畫圈部分來接線

第二步:復制LED閃爍代碼,修改實現蜂鳴器代碼

LED閃爍

蜂鳴器代碼

3.10 按鍵簡介

3.11 傳感器模塊簡介

上下拉電阻思維理解AO端模擬電壓輸出(與圖形結合)

3.11.1 硬件電路

3.11.2 參考資料

3.12?按鍵控制LED代碼

第一步:按圖接線到面包板

第二步:復制新建工程代碼

第三步:打開文件夾,新建一個文件夾,命名為Hardware,用于模塊化編程,存放硬件驅動,然后在工程新建一個組和添加文件路徑

第四步:模塊化代碼

LED.c

LED.h(防止重復定義的條件編譯,最后一行必須是空的)

Key.c

Key.h

main.c

3.13?光敏傳感器控制蜂鳴器代碼

第一步:按圖接線到面包板

第二步:復制按鍵控制LED代碼

第三步:模塊化代碼

Buzzer.c(與LED.c的代碼基本一致,復制粘貼后只需要修改其中的端口、引腳即可)

Buzzer.h

LightSensor.c

LightSensor.h

main.c

3.15 總結GPIO的使用方法(以LED代碼模塊為例)

1.初始化時鐘

2.定義結構體,賦值結構體

3.將指定的GPIO外設初始化

3.16 GPIO庫函數

RCC開啟GPIO時鐘的庫函數

GPIO初始化庫函數

3.15上述的完整代碼


3.1 GPIO簡介

GPIO(General Purpose Input Output)通用輸入輸出口

可配置為8種輸入輸出模式

引腳電平:0V~3.3V,部分引腳可容忍5V

輸出模式下可控制端口輸出高低電平,用以驅動LED、控制蜂鳴器、模擬通信協議輸出時序等

輸入模式下可讀取端口的高低電平或電壓,用于讀取按鍵輸入、外接模塊電平信號輸入、ADC電壓采集、模擬通信協議接收數據等

3.2 GPIO基本結構

3.3 GPIO位結構

輸入部分:

I/O引腳,接了兩個保護二極管,這個是對輸入電壓進行限幅,上面二極管:接VDD,3.3V,下面二極管:接VSS,0V,電壓在0~3.3V之間二極管不會導通

二極管的保護作用:

如果輸入電壓比3.3V還要高,那上方這個二極管就會導通,輸入電壓產生的電流就會直接接入VDD而不會流入內部電路,這樣就會避免過高的電壓對內部這些電路產生傷害

如果輸入電壓比0V還低,這個電壓是相對于VSS的電壓,所以是可以有負電壓的,那這個時候下方這個二極管就會導通,電流會從VSS直接流出去,而不會從內部電路汲取電流,也是可以保護內部電路的

上拉電阻和下拉電阻,上拉電阻置VDD,下拉電阻置VSS,這個開關是可以通過程序進行配置的

(弱)上拉輸入模式:上面導通,下面斷開,默認高電平模式

(弱)下拉輸入模式:下面導通,上面斷開,默認低電平模式

浮空輸入模式:兩個都斷開,不確定電平高低

上拉和下拉的作用,為了給輸入提供一個默認的輸入電平

施密特觸發器:

對輸入電壓進行整形,執行邏輯:輸入電壓大于某一閾值,輸出就會瞬間升為高電平,輸入電壓小于某一閾值,輸出就會瞬間降為低電平

通過施密特觸發器整形波形,可以直接寫入輸入數據寄存器,這時用程序讀取輸入數據寄存器對應的某一位的數據,就能知道端口的輸入

片上外設端口

模擬輸入:連接到ADC上,因為ADC需要接收模擬量,所以在施密特觸發器前面

復用功能輸入:連接到其他需要讀取端口的外設上,比如:串口的輸入引腳;這根線接收的數字量,所以在施密特觸發器后面

輸出部分:

輸出部分可以由輸出數據寄存器活片上外設控制,兩種控制方式通過數據選擇器接到了輸出部分;選擇輸出寄存器控制,就普通I/O口輸出,寫這個數據寄存器的某一位就可以操作對應的某個端口

位設置/清除寄存器這個可以用來單獨操作輸出數據寄存器的某一位,而不影響其他位,因為輸出數據寄存器同時控制16個端口,并且這個寄存器只能整體讀寫,所以想單獨控制其中某一個端口而不影響其他端口的話,需要一些獨特的方式

第一種方法:先讀出這個寄存器,然后按位與按位或的方式更改某一位,最后再將更改后的數據寫回去,這種方式效率不高,操作麻煩

第二種方法:就是用到位設置/清除寄存器,如果要對某一位進行置1的操作,在位設置寄存器的對應位寫1,,不需要的操作寫0,自動將輸出數據寄存器對應位置1,而剩下寫0的位則保持不變,這樣就保證了只操作其中某一位而不影響其他位,并且這是一步到位的操作,如果,想對輸出數據寄存器某一位進行清0的操作,在位清除寄存器的對應位寫1

MOS管

上面是P-MOS,下面是N-MOS,這個MOS管是一種電子開關,信號來控制開關的導通和關閉,開關負責將I/O口接到VDD或者VSS,可以選擇推挽、開漏、關閉三種模式

推挽輸出模式(強推輸出模式):P-MOS和N-MOS均有效;數據寄存器為1時,上管導通,下管斷開,輸出直接接到VDD,輸出高電平;數據寄存器為0時,下管導通,上管斷開,輸出直接接到VSS,輸出低電平

開漏輸出模式(只有低電平有驅動能力,高電平沒有驅動能力,通信協議的驅動方式(避免各個設備的相互干擾),還可輸出5V的電平信號):P-MOS是無效,N-MOS有效;數據寄存器為1時,下管斷開,這時輸出想當于斷開,也就是高阻模式;數據寄存器為0時,下管導通,輸出直接接到VSS,也就是輸出低電平

關閉輸出模式,P-MOS和N-MOS均無效,也就是輸出關閉,端口的電平由外部信號控制

3.4 GPIO模式

通過配置GPIO的端口配置寄存器,端口可以配置成以下8種模式

3.4.1 浮空/上拉/下拉輸入

輸入模式下,輸出驅動器是斷開的,端口只能輸入不能輸出,在上拉電阻和下拉電阻進行操作,使其加入浮空/上拉/下拉輸入,在施密特觸發器進行波形整形后,連接到輸入數據寄存器

3.4.2 模擬輸入

模擬輸入下,引腳直接接入片上外設,也就是ADC,將引腳配置為模擬輸入就行

3.4.3 開漏/推挽輸出

P-MOS無效,就是開漏輸出,P-MOS和N-MOS有效,推挽輸出,在輸出模式下,輸入模式是有效的,因為一個端口只能有一個輸出,但可以有多個輸入

3.4.4 復用開漏/推挽輸出

只由片上外設控制

3.5 LED和蜂鳴器簡介

LED:發光二極管,正向通電點亮,反向通電不亮

有源蜂鳴器:內部自帶振蕩源,將正負極接上直流電壓即可持續發聲,頻率固定

無源蜂鳴器:內部不帶振蕩源,需要控制器提供振蕩脈沖才可發聲,調整提供振蕩脈沖的頻率,可發出不同頻率的聲音

3.5.1 LED和蜂鳴器的硬件電路

第一張圖是低電平驅動的電路,LED正極接3.3V,負極通過一個限流電阻接到PA0上,當PA0輸出低電平時,LED兩端就會產生電壓差,就會形成正向導通的電流,LED就會點亮,當PA0輸出高電平時,沒有電壓差,LED就熄滅;第二張圖,高電平驅動電路,PA0高電平亮,PA0低電平滅

要看I/O口高低電平的驅動能力如何,決定選擇哪種方式驅動,GPIO在推挽輸出模式下,高低電平均有比較強的驅動能力,這兩種都可以,如果高電平驅動能力弱,不能使用第二種連接方法

第一張圖是PNP三極管(PNP的三極管最好接上邊)的驅動電路,三極管的左邊是基極,帶箭頭的是發射極,剩下的是集電極,基極給低電平,三極管導通,通過3.3V和GND,就可以給蜂鳴器提供驅動電流,反之;第二張是NPN三極管(NPN的三極管最好接下邊)的驅動電路,三極管的左邊是基極,帶箭頭的是發射極,剩下的是集電極,基極給高電平導通,低電平斷開

參考資料

3.6 面包板(供電區要通過跳線和中間區域連接)

3.7 LED代碼

第一步:開啟時鐘,初始化時鐘

第二步:將Delay函數加入工程,添加組,然后,魔術棒添加文件路徑

第三步:寫代碼點亮LED

第四步:按圖接線,如果要反接開漏模式,正接推挽模式,LED長線為正

3.8 LED流水燈代碼

第一步:按圖接線,將LED流水燈,連接到面包板上

第二步:復制LED閃爍代碼,然后,改名文件夾

第三步:修改LED閃爍代碼,實現LED流水燈

LED閃爍代碼

LED流水燈代碼

3.9 蜂鳴器代碼

第一步:按圖連接蜂鳴器到,面包板上,圖一畫圈按照圖二畫圈部分來接線

第二步:復制LED閃爍代碼,修改實現蜂鳴器代碼

LED閃爍

蜂鳴器代碼

3.10 按鍵簡介

按鍵:常見的輸入設備,按下導通,松手斷開

按鍵抖動:由于按鍵內部使用的是機械式彈簧片來進行通斷的,所以在按下和松手的瞬間會伴隨有一連串的抖動

按鍵的抖動,對于高速運行的單片機來說,5~10ms是很漫長的,所以要消抖(在按鍵按下和松開時,都加一個延遲函數),否則就會出現,按一次按鍵單片機出現反映了多次的現象

3.11 傳感器模塊簡介

傳感器模塊:傳感器元件(光敏電阻/熱敏電阻/紅外接收管等)的電阻會隨外界模擬量的變化而變化,通過與定值電阻分壓即可得到模擬電壓輸出,再通過電壓比較器進行二值化即可得到數字電壓輸出

上下拉電阻思維理解AO端模擬電壓輸出(與圖形結合)

當這個N1阻值變小時,下拉作用就會增強,中間的AO端的電壓就會拉低(極端情況下,N1阻值為0,AO輸出被完全下拉,輸出為0V);當N1阻值變大,下拉作用就會減弱,中間的引腳由于R1的上拉作用,電壓就會升高(極端情況下,N1阻值無窮大,相當于斷路,輸出電壓被R1拉高至VCC)

AO端模擬電壓二值化輸出,就是數字輸出(與圖結合)

電壓比較器,當同向輸入端電壓大于反向輸入端的電壓時,輸出就會瞬間升高為最大值(VCC);反之,輸出瞬間降為最小值(GND)

3.11.1 硬件電路

按鍵的四種接法,圖一圖二是下接按鍵的方式(一般使用這種),圖三圖四是上接按鍵的方式

圖一:隨便選取一個GPIO口,比如PA0,然后通過K1接地,按鍵按下時,PA0被直接下拉到GND,此時讀取PA0口的電平就是低電平,當按鍵松手時PA0被懸空(電壓不確定),所以這種接法下,必須要求PA0是上拉輸入模式,這樣按下按鍵,引腳低電平,松手,引腳高電平

圖二:相比圖一多了一個上拉電阻,PA0可以使浮空輸入或者上拉輸入,這樣按下按鍵,引腳低電平,松手,引腳高電平

圖三:K1接到3.3V,必須要求PA0接到下拉輸入模式,這樣按鍵按下時高電平,松手是低電平

圖四:相比于圖三,多了一個下拉電阻,這樣按鍵按下時高電平,松手是低電平

傳感器模塊電路

3.11.2 參考資料

3.12?按鍵控制LED代碼

第一步:按圖接線到面包板

第二步:復制新建工程代碼

第三步:打開文件夾,新建一個文件夾,命名為Hardware,用于模塊化編程,存放硬件驅動,然后在工程新建一個組和添加文件路徑

第四步:模塊化代碼

LED.c

LED.h(防止重復定義的條件編譯,最后一行必須是空的)

Key.c

Key.h

main.c

3.13?光敏傳感器控制蜂鳴器代碼

第一步:按圖接線到面包板

第二步:復制按鍵控制LED代碼

第三步:模塊化代碼

Buzzer.c(與LED.c的代碼基本一致,復制粘貼后只需要修改其中的端口、引腳即可)

Buzzer.h

LightSensor.c

LightSensor.h

main.c

3.15 總結GPIO的使用方法(以LED代碼模塊為例)

1.初始化時鐘

2.定義結構體,賦值結構體

GPIO_Mode,選擇8種輸入輸出模式

GPIO_Pin選擇引腳,可以用按位或(|)的方式同時選中多個引腳

GPIO_Speed選擇輸出速度,要求不高直接50MHz即可

3.將指定的GPIO外設初始化

3.16 GPIO庫函數

RCC開啟GPIO時鐘的庫函數

GPIO初始化庫函數

void GPIO_DeInit 調用這個函數之后,所指定的GPIO外設就會被復位

void GPIO_AFIODeInit 調用這個函數之后,可以復位AFIO外設

void GPIO_Init 這個函數作用是用結構體的參數來初始化GPIO口,需要先定義一個結構體變量,然后再給結構體賦值,最后調用這個函數,這個函數就會自動讀取結構體的值,然后自動把外設的各個參數配置好,一般初始化外設都是使用這個Init函數完成

void GPIO_StructInit 這個函數可以把結構體變量賦一個默認值

uint8_t GPIO_ReadInputDataBit、uint16_t GPIO_ReadInputData、uint8_t GPIO_ReadOutputDataBit、uint16_t GPIO_ReadOutputData這四個是GPIO讀取函數

void GPIO_SetBits、void GPIO_ResetBits、void GPIO_WriteBit、void GPIO_Write這四個是GPIO寫入函數

3.15上述的完整代碼

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

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

相關文章

Http(自寫)

作為一個程序員,假設我們要在a電腦的進程里發一段數據到b電腦,一般使用socket編程,可選項也就tcp,udp二選一socket本質上就是一個代碼庫tcp有粘包問題(字節流),純裸tcp不能之際拿來使用所以我們…

C#使用OpenVinoSharp和PP-Human進行行人檢測

效果 項目依賴 OpenCvSharp 4.11.0.20250507 OpenVINO.CSharp.Windows 2024.0.0.1 主要代碼 using OpenCvSharp; using OpenVinoSharp; using System; using System.Windows.Forms;namespace HelloPPHuman {public partial class Form1 : Form{public Form1(){InitializeCo…

四、Scala深入面向對象:類、對象與伴生關系

在前幾節中,我們學習了 Scala 的基礎語法和流程控制。現在,我們將深入探索 Scala 作為一門純粹的面向對象語言的核心。在 Scala 中,萬物皆對象,沒有像 Java 那樣的原始類型和靜態成員的區分。本節將重點介紹如何定義對象的藍圖&am…

【大語言模型 58】分布式文件系統:訓練數據高效存儲

分布式文件系統:訓練數據高效存儲 關鍵詞:分布式文件系統、HDFS、Lustre、GlusterFS、數據本地性、I/O優化、存儲架構、大數據存儲、訓練數據管理、存儲性能調優 摘要:本文深入探討大語言模型訓練中的分布式文件系統技術,從存儲架…

【科研繪圖系列】R語言繪制散點圖以及線性回歸擬合曲線圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 加載R包 數據下載 函數 導入數據 數據預處理 畫圖 總結 系統信息 介紹 數據導入 代碼的開始部分涉及多個數據集的導入,這些數據集涵蓋了不同類型的生態學數據,包括實驗室培養…

SQL 數據庫操作語言詳解

1. SQL 語言概述SQL(Structured Query Language)是用于管理關系型數據庫的標準語言,主要分為以下幾個子語言:- DQL(數據查詢語言):SELECT - 用于數據查詢 - DML(數據操作語言&#x…

積分變換的前世今生

積分變換常應用于解微分方程微分方程的解法:時域經典法;頻域變換法;“積分變換”最初并不是為了解微分方程,而是出于更“純粹”的數學動機——理解函數的結構、求解代數或幾何問題,以及簡化復雜的積分運算。微分方程的…

《Linux——gflags》

一、什么是gflags? gflags 是一個由 Google 開發的命令行參數解析庫,主要用于在 C(也支持其他語言)程序中便捷地處理命令行參數。它的核心作用是幫助開發者快速定義、解析和使用命令行選項,避免手動編寫繁瑣的參數解析…

編譯器的前端中端和后端

前面說的詞法分析和語法分析,確實是編譯器前端 (Front End) 最核心的兩個部分。但前端的工作還沒有結束。編譯器各階段劃分 一個完整的編譯器通常可以分為三個部分:前端、中端 (Middle End)、后端 (Back End)。 前端 (Front End) 核心職責: 理解源代碼。…

黑馬Java進階教程,全面剖析Java多線程編程,并發和并行,筆記02

黑馬Java進階教程,全面剖析Java多線程編程,并發和并行,筆記02 一、并發和并行 并發:在同一時刻,有多個指令在單個CPU上交替執行 并行:在同一時刻,有多個指令在多個CPU上同時執行 二、為什么有…

20250908 背包DP總結

引子 ~ 我們都有一個家,名字叫背包 ~ 背包DP 顧名思義,背包DP是用來解決背包最值問題的。題目會給出背包的容量,以及幾個物品的屬性,比如重量,價值,限額等等,具體是什么看題目。 01背包 01…

Redis持久化之RDB:快照機制原理、配置與最佳實踐

Redis持久化之RDB:快照機制原理、配置與最佳實踐 1. RDB持久化概述 1.1 什么是RDB RDB(Redis Database)是Redis的默認持久化方式,它在指定的時間間隔內生成數據集的快照(snapshot),并將快照保…

daily notes[44]

文章目錄基礎references基礎 hello,world是幾乎所有編程語言的第一例子,rust也不例外。但和其它語言不一樣,Rust的源碼最好擁有自己的項目目錄。 $ mkdir ~/pro $ cd ~/pro $ mkdir helloWorld $ cd helloWorld源代碼文件名為main.rs,內容如…

JavaScript對象創建方式完全指南:從原始到現代的演進之路

前言 作為一名前端開發者,JavaScript中對象創建是很重要。在JavaScript這門基于原型的語言中,對象幾乎無處不在。今天,我將帶領大家回顧JavaScript對象創建的7種方式,從最原始的字面量到現代的ES6 class,每一步演進都解…

基于單片機的無線水塔監控系統設計(論文+源碼)

本設計為基于單片機的無線水塔監控系統設計,主要由以下幾部分組成:均采用STC89C52RC單片機為主控;主機:NRF24L01無線通訊模塊,1602LCD液晶顯示屏。從機:NRF24L01無線通訊模塊,水位傳感器&#x…

凌晨0-3點不睡,你熬的不是夜,是人生!

“熬夜”這個詞,早已成為現代生活的常態。有人為了工作加班到深夜,有人為了娛樂刷劇到天明,但你知道嗎?熬夜最“要命”的時間段,其實是凌晨0點到凌晨3點。別以為只是少睡幾個小時而已,這個時間段不睡&#…

大語言模型基石:Transformer

一、引言 如今火爆的 GPT、LLaMA、通義千問、ChatGLM 等大語言模型,背后都離不開一個核心架構——Transformer。 2017 年,Google 在論文《Attention Is All You Need》中首次提出 Transformer 模型,徹底改變了自然語言處理的發展方向。它摒…

【算法】【鏈表】160.相交鏈表--通俗講解

算法通俗講解推薦閱讀 【算法–鏈表】83.刪除排序鏈表中的重復元素–通俗講解 【算法–鏈表】刪除排序鏈表中的重復元素 II–通俗講解 【算法–鏈表】86.分割鏈表–通俗講解 【算法】92.翻轉鏈表Ⅱ–通俗講解 【算法–鏈表】109.有序鏈表轉換二叉搜索樹–通俗講解 【算法–鏈表…

MySQL——庫的操作

1、創建數據庫語法:CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name這里的CHARACTER SET表示指定數據庫采用的字符集…