0301STM32GPIO外設輸出

STM32GPIO外設輸出

  • STM32內部的GPIO外設
    • GPIO簡介
    • 基本結構
    • GPIO位結構
      • 輸入部分:
      • 輸出部分:
    • GPIO八種工作模式
      • 浮空/上拉/下拉輸入
      • 模擬輸入
      • 開漏/推挽輸出
      • 復用開漏/推挽輸出
    • 手冊寄存器描述
      • GPIO功能描述
      • 外設的GPIO配置
      • GPIO寄存器描述
      • 端口輸入數據寄存器
      • 端口輸出數據寄存器
      • 端口位設置/清除寄存器
      • 端口位清除寄存器
      • 端口配置鎖定寄存器
  • STM32外部的設備和電路
    • LED和蜂鳴器簡介
    • 硬件電路
    • 面包板
    • keilkill.bat
  • 點亮一個LED燈3步
    • RCC外設
    • GPIO外設
      • gpio.h的文件
      • 8種工作模式:

GPIO的輸出 輸入
庫函數里用了大量的結構體、指針、枚舉等知識。C語言中高級部分
LED閃爍、LED流水燈、蜂鳴器滴滴鳴響

STM32內部的GPIO外設

GPIO簡介

GPIO(General Purpose Input Output)通用輸入輸出口
可配置為8種輸入輸出模式
引腳電平:0V~3.3V,部分引腳可容忍5V(可以輸入5V,但是輸出只有3.3V,因為供電只有3.3V)FT(Five Tolerate)
輸出模式下可控制端口輸出高低電平,用以驅動LED、控制蜂鳴器、模擬通信協議輸出時序(IIC、SPI、芯片的特性協議)等
輸入模式下可讀取端口的高低電平或電壓,用于讀取按鍵輸入、外接模塊電平信號輸入、ADC電壓采集、模擬通信協議接收數據等

基本結構

在這里插入圖片描述
GPIO外設的名稱按照GPIOA、GPIOB、GPIOC等命令的
每個GPIO外設有16個引腳,編號從0-15。GPIOA的第0號引腳,一般成為PA0,第15號為PA15
每個GPIO模塊內,主要包含了寄存器和驅動器這些
寄存器(一段特殊的存儲器),內核可以通過APB2總線對寄存器進行讀寫,來完成輸出電平和讀取電平的功能。
寄存器的每一位對應一個引腳,其中輸出寄存器寫1,對應的引腳就會輸出高電平,寫0就輸出低電平
輸入寄存器讀取為1,就證明對應的端口目前是高電平,讀取為0,就是低電平
所有寄存器都是32位的,但是端口只有16位,所以寄存器只有低16位對應有端口,高16位沒有用到
驅動器用來增加信號的驅動能力。寄存器只負責存儲數據,如果要進行點燈操作,還是需要驅動器來負責增大驅動能力

GPIO位結構

在這里插入圖片描述

左邊三個是寄存器,中間部分是驅動器,右邊是IO引腳

整體結構分為兩部分:上面是輸入部分,下面是輸出部分

輸入部分:

IO引腳,接了兩個保護二極管,對輸入電壓進行限幅的。如果輸入電壓>VDD ,那么上面的二極管就會導通,輸入電壓產生的電流就會直接流入VDD而不會流入內部電路,可以避免過高的電壓對內部的電路產生傷害。如果輸入電壓<VSS,下方二極管導通,電流從VSS流出去,而不會從內部電路汲取電流,可以保護內部電路。如果輸入電壓在VSS到VDD之間,兩個二極管均不導通,這時二極管對電路沒有影響,這是保護二極管的作用。

上拉電阻至VDD,下拉電阻至VSS。開關可以通過程序配置。
上面導通,下面斷開,上拉輸入模式(默認為高電平的輸入方式)
下面導通,上面斷開,下拉輸入模式(默認為低電平的輸入方式)
兩個都斷開,浮空輸入模式。
上拉下拉式為了給輸入提供一個默認的輸入電平的。因為對于數字端口,輸入不是高電平就是低電平,如果浮空的話引腳的輸入電平極易受外接干擾而改變,為了避免輸出不確定,所以要確定下來用上拉電阻或者下拉電阻。上下拉電阻阻值都比較大,是一種弱上拉和弱下拉,目的是盡量不影響正常的輸入操作。

圖中的肖特基觸發器,應該為施密特觸發器才對(翻譯錯誤)(對輸入電壓進行整形)(類似遲滯比較器),經過施密特觸發器整形的波形就可以直接寫入數據寄存器了。再用程序讀取輸入數據寄存器對應的某一位數據,就可以指導端口的輸入電平了

模擬輸入和復用功能輸入就是連接到片上外設的一些端口,其中有模擬輸入(連接到ADC上的,因為ADC接收模擬量,所以在施密特觸發器之前)。復用功能輸入是連接到其他需要讀取端口的外設上的,比如串口的輸入引腳,這根線接收的是數字量,所以在施密特觸發器后面

輸出部分:

數字部分可以由輸出數據寄存器或片上外設控制,兩種方式通過數據選擇器接到了輸出控制部分。如果通過輸出數據寄存器進行控制,就是普通的IO口輸出,寫這個數據寄存器的某一位就可以操作對應的某個端口了
位設置/清除寄存器,可以用來單獨操作輸出數據寄存器的某一位,而不影響其他位,因為輸出數據寄存器同時控制16個端口,并且這個寄存器只能整體讀寫,所以只想單獨控制某一個端口而不影響其他端口的話,就需要一些特殊的操作方式
第一種方式是先讀出這個寄存器,然后用按位與和按位或的方式更改某一位,最后再將更改后的數據寫回去,在C語言中就是&=和|=操作,比較麻煩,效率不到,對于IO口的操作而言不太合適
第二種方式是設置這個位設置/清除寄存器,如果對某一位置1,在位設置寄存器的對應位寫1即可,剩下不需要操作的位寫0。內部有電路,自動將輸出數據寄存器中的對應位置位1,而剩下的寫0的位則保持不變。保證了只操作其中某一位而不影響其他位,并且是一步到位的操作。
如果相對某一位清0,就在位清除寄存器的對應位寫1即可,內部有電路,自動將輸出數據寄存器中的對應位置位0

第三種方式是讀取STM32中的“位帶”區域,這個“位帶”作用和51單片機的位尋址作用差不多,在STM32中,專門分配的有一段地址區域,這段地址映射了ARM和外設寄存器所有的位,讀寫這段地址中的數據,就相當于讀寫所映射位置的某一位。

目前暫不會用到。庫函數方法操作是讀寫位設置和位清除寄存器的方法

輸出控制之后接到兩個MOS管,推挽、開漏和關閉三種方式
推挽輸出在高低電平均有較強的驅動能力,所以推挽輸出模式也叫強推輸出模式
開漏輸出模式,數據寄存器為1時,輸出相當于斷開,也就是高阻模式,只有低電平有驅動能力。可以作為通信協議的驅動方式,比如IIC,多機通信時可以避免各個設備的相互干擾。還可以用于輸出5V的電平信號(用于兼容5V的設備)
關閉。引腳配置成輸入模式時,兩個MOS管都無效,輸出關閉,端口的電平由外部信號來控制

GPIO位結構的全部介紹

GPIO八種工作模式

通過配置GPIO的端口配置寄存器,位結構的電路就會根據配置進行改變(比如開關的通斷,NMOS和PMOS是否有效,數據選擇器的選擇等),端口可以配置成以下8種模式
在這里插入圖片描述

浮空/上拉/下拉輸入

浮空輸入時,端口一定要接上一個連續的驅動源,不能出現懸空的狀態。
在這里插入圖片描述
輸入模式下,輸出驅動器是斷開的。端口只能輸入不能輸出,
VDD或VDD_FT是3.3V端口和容忍5V端口的區別。特殊不同在哪手冊沒有說,我們也不用管,就知道就行了。上面的保護二極管需要做一下處理,要不然直接接VDD3.3V的話,外部接入5V電壓就會導致上邊二極管開啟,并且產生較大電流,這是不太妥當的。

模擬輸入

在這里插入圖片描述
從引腳直接接到片上外設ADC,所以使用ADC時,將引腳配置成模擬輸入就行了

開漏/推挽輸出

在這里插入圖片描述
在輸出模式下,輸入模式也是有效的。但是在輸入模式下,輸出都是無效的,這是因為一個端口只能有一個輸出,但可以有多個輸入,所以當配置成輸出模式的時候,內部也可以順便輸入,這個沒啥影響

復用開漏/推挽輸出

在這里插入圖片描述
這兩個模式和普通的開漏輸出和推挽輸出差不多,只不過引腳電平由片上外設控制,引腳控制權有片上外設掌控。在輸入部分,片上外設也可以讀取引腳的電平,同時普通的輸入也是有效的,順便接受一下電平信號

8種模式中,除了模擬輸入這個模式會關閉數字的輸入功能,其他7個模式中所有的輸入都是有效的

手冊寄存器描述

GPIO功能描述

可以看GPIO8種方式詳情可以看手冊,
在這里插入圖片描述

外設的GPIO配置

使用片上外設的引腳時,可以參考手冊里給的配置(外設的GPIO配置)
在這里插入圖片描述

GPIO寄存器描述

GPIO配置寄存器,每個端口的模式由4位進行控制,16個端口需要64位,所以配置寄存器有2個,1個端口配置低寄存器,1個端口配置高寄存器
在這里插入圖片描述

多出了GPIO輸出的速度(可以限制輸出引腳的最大翻轉速度),這個設計出來是為了低功耗和穩定性的。一般要求不高時配置50MHz即可。

端口輸入數據寄存器

里面的低16位對應16個引腳,高16位沒有使用
在這里插入圖片描述

端口輸出數據寄存器

里面的低16位對應16個引腳,高16位沒有使用
在這里插入圖片描述

端口位設置/清除寄存器

高16位進行位清除,低16位進行位設置。寫1進行設置或者清除,寫0不產生影響
在這里插入圖片描述

端口位清除寄存器

低16位和端口位設置/清除寄存器的高16位功能一樣,為啥還需要這個寄存器,是為了方便操作設置的。如果只想單一地進行位設置或者位清除。位設置時,用上面的寄存器,位清除時,用下面的寄存器。因為設置和清除時,使用的都是低16位的數據,這樣方便一些。如果想對多個端口同時進行位設置和位清除,那使用第一個寄存器就可以了,這樣可以保證位設置和位清除的的同步性。
在這里插入圖片描述

端口配置鎖定寄存器

可以對端口的配置進行鎖定,防止意外更改。
在這里插入圖片描述

STM32外部的設備和電路

LED和蜂鳴器簡介

在這里插入圖片描述
沒有剪過得LED實物,長腳是正極,短腳是負極。
LED內部也可以看正負極,較小的一般是正極,較大的一般是負極

硬件電路

在這里插入圖片描述
LED燈的限流電阻一定要接。看IO口的高低電平的驅動能力如何來選取怎么接。一般選取第一種接法。很多單片機或者芯片,使用高電平弱驅動,低電平強驅動的規則。可以一定程度上避免高低電平打架。
三極管驅動電路。(更好的驅動電路和阻值選型可以看模電和數電部分)

面包板

在這里插入圖片描述
面包板的正反面。
金屬爪的排放規律:
豎著的5孔金屬爪連接,上面兩排和下面兩排的金屬爪是橫著連接(還標了供電的紅+ ,藍-標識)(有的正中間橫的可能斷開)

keilkill.bat

批處理文件,可以把工程編譯產生的中間文件都刪掉,因為編譯產生的文件比較大,主要占空間的就是Listing和Objects這兩個文件夾,這些都是中間文件,如果要把工程分享給別人,可以雙擊一下這個批處理文件,會把中間文件都刪掉

點亮一個LED燈3步

1.使用RCC開啟GPIO的時鐘
2.使用GPIO_Init函數初始化GPIO
3.使用輸出或者輸入的函數控制GPIO口

設計RCC和GPIO兩個外設 可以先看下這兩個外設都有哪些庫函數

RCC外設

可以在Library中找到rcc.h文件,在.h文件的最下面,一般都是庫函數所有函數的聲明。
可以看到rRCC有很多函數,但是大部分函數我們都不會用到,最常用的只有只有這3個函數
在這里插入圖片描述
在這里插入圖片描述
以AHB為例:
brief 簡介
param 參數
看簡介描述它的功能,看參數如何選擇。
如果不清楚哪個外設連接在哪一個總線上,還可以到arg這個列表里面找一下

GPIO外設

gpio.h的文件

在這里插入圖片描述
需要了解的就是紅框里的函數
1.GPIO_DeInit,參數可以寫GPIOA、GPIOB等等,調用這個函數之后,所指定的GPIO外設就會被復位
2.GPIO_AFIODeInit,可以復位AFIO外設

3.GPIO_Init 非常重要,作用:用結構體的參數來初始化GPIO口,需要先定義一個結構體變量,然后再給結構體賦值,最后調用這個函數
這個函數內部會自動讀取結構體的值,執行一堆判斷和運算,寫入到GPIO配置寄存器,然后自動把外設的各個參數配置好(操作細節就不需要關心了)。這種Init函數在STM32中基本所有的外設都有,一般初始化外設都使用Init函數來完成。
4.GPIO——StructInit,可以把結構體變量賦一個默認值,

接下來4個是GPIO的讀取函數
再下面4個事GPIO的寫入函數
這些函數可以實現讀寫GPIO口的功能,
剩下的函數暫時不會用到
重要的函數就是GPIO_Init和8個讀寫函數

8種工作模式:

AIN (Analog IN) 模擬輸入
IN_FLOATING 浮空輸入
IPD (In Pull Down) 下拉輸入
IPU (In Pull Up) 上拉輸入
Out_OD (Out Open Drain)開漏輸出
Out_PP (Out Push Pull) 推挽輸出
AF_OD (Atl Open Drain) 復用開漏
AF_PP (Atl Push Pull) 復用推挽

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

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

相關文章

QT入門筆記-自定義控件封裝 30

具體代碼如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

并查集(還有反集也在)

一.定義 定義&#xff1a; 并查集是一種樹型的數據結構&#xff0c;用于處理一些不相交集合的合并及查詢問題&#xff08;即所謂的并、查&#xff09;。比如說&#xff0c;我們可以用并查集來判斷一個森林中有幾棵樹、某個節點是否屬于某棵樹等。 主要構成&#xff1a; 并查集…

PHP-實例-文件上傳

1 需求 2 basename 在 PHP 中&#xff0c;basename() 函數用于返回路徑中的文件名部分。如果路徑中包含了文件擴展名&#xff0c;則該函數也會返回它。如果路徑的結尾有斜杠&#xff08;/&#xff09;或反斜杠&#xff08;\&#xff09;&#xff0c;則 basename() 函數會返回空…

Android計算器界面的設計——表格布局TableLayout實操

目錄 任務目標任務分析任務實施 任務目標 使用TextView、Button等實現一個計算器界面&#xff0c;界面如圖1所示。 圖1 計算器界面效果圖 任務分析 界面整體使用表格布局&#xff0c;第一行使用一個TextView控件&#xff0c;橫跨4列&#xff0c;中間4行4列&#xff0c;最后一…

Laravel HTTP客戶端:網絡請求的瑞士軍刀

標題&#xff1a;Laravel HTTP客戶端&#xff1a;網絡請求的瑞士軍刀 Laravel的HTTP客戶端是一個功能強大的工具&#xff0c;它提供了一種簡潔、直觀的方式來發送HTTP請求。無論是與外部API集成&#xff0c;還是進行網絡數據抓取&#xff0c;Laravel的HTTP客戶端都能滿足你的需…

小紅書選品中心商家采集 小紅書商家電話采集軟件

可采集名稱銷量評分聯系方式等 需要有1000粉絲以上已實名認證過的小紅書達人才可以使用 以下是一個示例程序&#xff0c;可以用于批量獲取小紅書選品中心商家的信息&#xff1a; import requestsdef get_merchants(page_num):url f"https://www.xiaohongshu.com/selec…

git 添加本地分支, clean

//以develop為源創建本地分支fromdevelop git checkout -b fromdevelop git add . git commit -m "local" git checkout -b local/dev //切換到遠程分支. git checkout dev git clean_git clean -f -d-CSDN博客 git clean -f -d #刪除當前目錄下沒有被track…

RAC spfile 坑 +data INSTANCE_NUMBER thread x is mounted by another instance

RAC相關三個參數 thread reset 就可以默認 instance_number 需要單獨設置 sid‘SIDX’ cluster_database boolean TRUE SQL> alter system reset instance_number sid* scopespfile; alter system reset instance_number sid* scopespfile …

解析Torch中`Transformer`

解析torch官方代碼腳本文件&#xff1a;transformer.py。版本&#xff1a;1.9.1cu111。 首先查看《Torch中多頭注意力MultiheadAttention的中文注釋》解析&#xff1b; 最后查看下方transformer解析。 話不多說&#xff0c;看代碼吧&#xff01; import copy from typing imp…

Vue的學習之class與style綁定

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>Vue的學習</title><script src"vue.js" type"text/javascript" charset"utf-8"></script></head><body><…

如何在std::map中查找元素

在std::map中查找元素可以通過幾種不同的方式完成&#xff0c;但最常用的方法是使用find成員函數。std::map是一個基于鍵值對的關聯容器&#xff0c;其中每個元素都是一個鍵值對。鍵是唯一的&#xff0c;并且用于排序和快速查找。 使用find成員函數 find成員函數接受一個鍵作…

io流 多線程

目錄 一、io流 1.什么是io流 2.流的方向 i.輸入流 ii.輸出流 3.操作文件的類型 i.字節流 1.拷貝 ii.字符流 ?3.字符流輸出流出數據 4.字節流和字符流的使用場景 5.練習 6.緩沖流 1.字節緩沖流拷貝文件 2.字符緩沖流特有的方法 1.方法 2.總結 7.轉換流基本用法…

第2集《修習止觀坐禪法要》

請打開補充講表第一面&#xff0c;附表一、念佛攝心方便法。 我們前面講到修止&#xff0c;就是善取所緣境的相貌&#xff0c;然后心于所緣&#xff0c;專一安住&#xff1b;心于所緣&#xff0c;相續安住&#xff1b;達到心一境性的目的。 站在修學凈土的角度&#xff0c;他…

FastAPI+SQLAlchemy數據庫連接

FastAPISQLAlchemy數據庫連接 目錄 FastAPISQLAlchemy數據庫連接配置數據庫連接創建表模型創建alembic遷移文件安裝初始化編輯env.py編輯alembic.ini遷移數據庫 視圖函數查詢 配置數據庫連接 # db.py from sqlalchemy import create_engine from sqlalchemy.orm import sessio…

9、程序化創意

程序化創意 程序化創意&#xff08;Programmatic Creative&#xff09;是指通過自動化的方式制作并優化廣告創意&#xff0c;以提高廣告效果。針對不同受眾的多樣化需求&#xff0c;以及同一受眾在不同場景下的消費需求&#xff0c;程序化創意能夠自動生成個性化的精準創意&am…

《C語言》預處理

文章目錄 一、預定義符號二、#define定義常量三、#define定義宏四、宏更函數的對比五、#和##1、#運算符2、##運算符 一、預定義符號 C語言設置了一些預定義符號&#xff0c;可以直接使用&#xff0c;在預處理期間進行處理的。 __FILE__//進行編譯的源文件 __LINE__//文件當前的…

在網站存在漏洞的情況下強化安全防御

一、引言 網絡安全是一個持續的戰斗&#xff0c;尤其是在網站存在已知或未知漏洞的情況下。本文將探討如何在網站存在漏洞的情況下&#xff0c;采取有效措施進行安全防御。 二、理解漏洞 首先&#xff0c;我們需要理解網站的漏洞。這些可能包括SQL注入、跨站腳本&#xff08…

【數據結構與算法】插入排序

&#x1f493; 博客主頁&#xff1a;倔強的石頭的CSDN主頁 &#x1f4dd;Gitee主頁&#xff1a;倔強的石頭的gitee主頁 ? 文章專欄&#xff1a;《數據結構與算法》 期待您的關注 ?

深入Laravel服務容器:構建靈活應用的秘訣

標題&#xff1a;深入Laravel服務容器&#xff1a;構建靈活應用的秘訣 Laravel框架的服務容器是一個強大的工具&#xff0c;它負責管理類的依賴關系和執行依賴注入&#xff08;DI&#xff09;。服務容器是Laravel依賴注入系統的核心&#xff0c;使得應用組件之間的耦合度降低&…

一周速遞|全球車聯網產業動態(2024年7月7日)

政策法規 1、7月5日&#xff0c;工業和信息化部部長金壯龍在新聞發布會上表示&#xff0c;新興產業要培育壯大。對新材料、人工智能、智能網聯新能源汽車、新型儲能、氫能、生物制造、商業航天、低空經濟等新興產業&#xff0c;要繼續用好國內大市場和豐富應用場景&#xff0c…