明解STM32—GPIO理論基礎知識篇之寄存器原理

来源:https://www.cnblogs.com/Sharemaker/archive/2023/04/02/17281410.html
-Advertisement-
Play Games

​ 一、前言 在之前的STM32的GPIO理論基礎知識中,分別對基本結構和工作模式進行了詳細的介紹。GPIO基本結構中主要對GPIO內部的各個功能電路逐一的進行的分析;GPIO工作模式中主要介紹GPIO應用在不同的使用場景下,GPIO埠的靜態特征配置和動態的工作模式,同時對信號的工作流進行了分析。 ...


 一、前言

        在之前的STM32的GPIO理論基礎知識中,分別對基本結構和工作模式進行了詳細的介紹。GPIO基本結構中主要對GPIO內部的各個功能電路逐一的進行的分析;GPIO工作模式中主要介紹GPIO應用在不同的使用場景下,GPIO埠的靜態特征配置和動態的工作模式,同時對信號的工作流進行了分析。

        這一篇主要對GPIO模塊使用到的寄存器進行詳細的分析介紹,適當瞭解GPIO寄存器的相關知識,可以對GPIO最底層的一些配置和工作原理有更好的認識,有助於加深對GPIO基本結構及工作模式的理解,同時對後續介紹到的GPIO在應用設計中有較好的幫助。


二、寄存器概述

        圖1為STM32的GPIO模塊中寄存器的概述,總共有5種類型的寄存器。這裡需要瞭解的是GPIO模塊的port和pin的概念。其中寄存器名稱中GPIOx的x表示不同的GPIO埠port,比如STM32晶元支持的port可以從A到I,GPIOA,GPIOB就表示了不同的埠;pin就是不同的port下支持的引腳,比如GPIOA下的引腳數從pin0到pin15。因此port就是pin的集合,不同的port都有它自己的如下圖列出來的寄存器。

圖1 GPIO寄存器概述


三、寄存器詳述

        本節對寄存器位、寄存器偏移地址、複位值、寄存器功能定義進行介紹。可通過位元組(8 位)、半字(16 位)或字(32 位)對 GPIO 寄存器進行訪問。

(1)埠模式寄存器GPIOx_MODER

        本寄存器的功能為設置GPIO埠的方向和模式,總共0到32位,每兩位就是該port下的pin值,例如將GPIOA_MODER的MODER0[1:0]配置為00,就是將GPIOA的pin0管腳功能配置為輸入類型的管腳,將GPIOA_MODER的MODER1[1:0]配置為00,就是將GPIOA的pin1管腳功能配置為輸入類型的管腳,以此類推。

圖2 GPIOx_MODER寄存器定義

(2)埠輸出類型寄存器GPIOx_OTYPER

        本寄存器設置GPIO埠的輸出類型,前提是該埠中的pin已經配置成輸出功能。該寄存器只有0到15位有效,每一位就是對應的pin值,例如將GPIOA_OTYPER的OT0設置為1,就是將GPIOA的pin0管腳設置為輸出開漏的類型。

 

圖3 GPIOx_OTYPER寄存器定義

(3)埠輸出速度寄存器GPIOx_OSPEEDR

        本寄存器設置GPIO的輸出速度頻率,前提是該埠中的pin已經應用作為輸出功能管腳。

        這個速度是指輸出驅動電路的響應速度:(晶元內部在I/O口的輸出部分安排了多個響應速度不同的輸出驅動電路,用戶可以根據自己的需要選擇合適的驅動電路,通過選擇速度來選擇不同的輸出驅動模塊,達到最佳的雜訊控制和降低功耗的目的。可理解為輸出驅動電路的帶寬:即一個驅動電路可以不失真地通過信號的最大頻率。

        速度高的IO耗電大、雜訊也大,速度低的IO耗電小、雜訊也小。使用合適的速度可以降低功耗和雜訊。高頻的驅動電路,雜訊也高,當不需要高的輸出頻率時,請選用低頻驅動電路,這樣非常有利於提高系統的EMI性能,也可以降低功耗。當然如果要輸出較高頻率的信號,但卻選用了較低頻率的速度,很可能會得到失真的輸出信號。關鍵是GPIO的引腳速度跟應用匹配。

        比如:

        ①USART串口,若最大波特率只需115.2k,那用2M的速度就夠了,既省電也雜訊小。

        ②I2C介面,若使用400k波特率,若想把餘量留大些,可以選用10M的GPIO引腳速度。

        ③SPI介面,若使用18M或9M波特率,需要選用50M的GPIO的引腳速度。

        當為該埠下寄存器值的pin配置為11時,輸出速度和電容C有關,這是指對於CMOS工藝的集成電路而言,輸入阻抗是非常高的,主要功耗來自於絕緣柵等效的電容充放電效應。既然是電容的充放電,考慮信號源的內阻(基於標準CMOS電路的輸出),根據RC充電常數和邏輯門限電平就能得出一個最小周期,其對應一個最高IO頻率。

圖4 GPIOx_OSPEEDR寄存器定義

(4)埠上拉/下拉寄存器GPIOx_PUPDR

        該寄存器是配置埠對應的pin上是否需要配置晶元內部的上拉或者下拉電阻。

圖5 GPIOx_PUPDR寄存器定義

        STM32晶元GPIO的上拉電阻和下拉電阻最小值,典型值和最大值如下:

 

(5)埠輸入數據寄存器 GPIOx_IDR

        本寄存器讀取GPIO埠引腳的信號電平值。該寄存器只有0到15位有效,每一位就是對應的pin值,例如GPIOA_OTYPER的IDR00值為1,就是此時讀到GPIOA的pin0管腳值為1高電平信號。

圖6 GPIOx_IDR寄存器定義

(6)GPIO 埠輸出數據寄存器 GPIOx_ODR

        本寄存器可以設置GPIO埠引腳的信號值。前提是該引腳為普通的IO輸出引腳。該寄存器只有0到15位有效,每一位就是對應的pin值,例如設置GPIOA_OTYPER的ODR0值為1,就是此時輸出GPIOA的pin0管腳值為1高電平信號。

圖7 GPIOx_ODR寄存器定義

(7)GPIO 埠置位/複位寄存器GPIOx_BSRR

        本寄存器可以通過寫入GPIOx_BSRR寄存器值,可以對GPIOx_ODR的對應位進行置位和複位。既然GPIOx_ODR 能控制管腳高低電平,為什麼還需要GPIOx_BSRR寄存器?

        原因是GPIOx_BSRR去改變管腳狀態的時候是原子操作置位/複位,沒有被中斷打斷的風險。也就不需要關閉中斷,關閉中斷明顯會延遲或丟失一事件的捕獲,所以控制GPIO的狀態最好可以用GPIOx_BSRR。

        該寄存器的0到15位為置位功能,16到31位為複位功能。例如設置GPIOA_BSRR的BS0值為1,相當於輸出GPIOA的pin0管腳值為1高電平信號;設置GPIOA_BSRR的BR0值為1,相當於輸出GPIOA的pin0管腳值為0低電平信號。

 

圖8 GPIOx_BSRR寄存器定義

(8)GPIO 埠配置鎖定寄存器GPIOx_LCKR

        本寄存器用於鎖定當前管腳的配置,可以保持管腳當前的狀態,保護管腳不受干擾,要使用該寄存器,需要先激活“鎖定”功能。當執行正確的寫序列設置了位16(LCKK)時,鎖定功能被激活,LCKK位的寫序列為:寫1 -> 寫0 -> 寫1 -> 讀0 -> 讀1。最後一個讀可省略,但可以用來確認鎖鍵已被激活。被鎖定的管腳pin只有等到下次MCU複位才能被解鎖。

        LCK0到LCK15為對應的pin0到pin15的鎖定配置,當需要鎖定對應的管腳pin時,在執行LCKK寫序列操作時,將對應的LCK位寫1。

 

  

 圖9 GPIOx_LCKR寄存器定義

(9)GPIO 復用功能低位寄存器GPIOx_AFRL

        本寄存器可以設置GPIO埠引腳的復用功能,比如將該引腳設置成USART或者SPI類型的功能管腳,本寄存器AFRL0~AFRL7分別對應引腳pin0~pin7,每個引腳又有4位可選,因此一個引腳可以在16中復用功能中選擇,例如將GPIOA_AFRL的AFRL0[3:0]=0001,就是將GPIOA的pin0管腳應用成第2種復用功能AF1。

 

 圖10 GPIOx_AFRL寄存器定義

(10)GPIO 復用功能高位寄存器GPIOx_AFRH

        本寄存器可以設置GPIO埠引腳的復用功能,本寄存器AFRL0~AFRL7分別對應引腳pin0~pin7,功能上和復用功能低位寄存器GPIOx_AFRL一樣。

圖11 GPIOx_AFRH寄存器定義

四、總結

        本篇對STM32的GPIO對應的寄存器分別進行了介紹,瞭解了各個寄存器的功能和對應寄存器位的定義可以更方便的去理解在實際使用GPIO時的配置功能,後續篇章將對GPIO在實際開發中的設計配置及應用進行詳細的分析。


更多技術內容和書籍資料獲取,入群技術交流敬請關註公眾號“明解嵌入式”

本文來自博客園,作者:Sharemaker,轉載請註明原文鏈接:https://www.cnblogs.com/Sharemaker/p/17281410.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、MySQL 中有哪幾種鎖? (1)表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最 高,併發度最低。 (2)行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最 低,併發度也最高。 (3)頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表 鎖 ...
  • 原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此聲明。 上個月,我們一個java服務上線後,偶爾會發生記憶體OOM(Out Of Memory)問題,但由於OOM導致服務不響應請求,健康檢查多次不通過,最後部署平臺kill了java進程,這導致定位這次OOM問題也變得困 ...
  • JavaSE:註解與反射(Annotation & Reflection) ​ 註解和框架是所有框架的底層,如Mybatis,spring。框架的底層實現機制就是註解和反射。註解相比於註釋,除了能較為直接的表示出這部分模塊的功能,也能實現一定的具體功能。 01 初識註解 1.1 什麼是註解 Anno ...
  • 多線程指的是在一個程式中同時運行多個線程,這些線程可以獨立運行或者相互協作,從而完成更加複雜的任務。Java中的多線程可以使用synchronized關鍵字來實現線程同步,避免多個線程同時訪問共用資源而導致的數據錯誤。此外,Java中還提供了Lock、Condition、Semaphore等類和介面... ...
  • 最近鴿了挺久的,因為最近要做課設,再加上被這個工程的調試給難到了。 在做該工程的時候,有一個良好的項目管理習慣會讓開發的時候不會讓人那麼的高血壓。 特別要註意的是,非同步FIFO的讀寫時鐘的速率匹配問題,這個問題卡了我好久。 1、sobel運算元 Sobel 演算法是像素圖像邊緣檢測中最重要的運算元之一,在 ...
  • 查看鏡像 conda config --show channels 刪除鏡像 conda config --remove channels 源名稱或鏈接 恢復預設鏡像 conda config --remove-key channels 添加鏡像 清華鏡像更新了 conda config --add ...
  • Soda.Http 基於HttpClient封裝的 Http 請求庫。如果有什麼好想法,可以提 Issue 或者 Pr。,如果想要使用,直接在nuget搜索Soda.Http即可。 Github項目地址:Soda.Http 用法 1 預載 預載配置並不是必須的,但是有助於我們進行一些通用基礎設置,例 ...
  • 1. 微軟擴展官網 微軟擴展官網:—>Visual Studio Marketplace 2. 待安裝的擴展包 | 序號 | 擴展包(vsix包) | 官方說明 | | | | | | 1 | ClaudiaIDE | 此擴展更改編輯器的背景圖像 | | 2 | Visual Studio Colo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...