STM32之GPIO底層原理與編程實踐

来源:https://www.cnblogs.com/kensporger/archive/2020/01/15/12198209.html
-Advertisement-
Play Games

一、什麼是GPIO GPIO全稱為General Purpose Input Output,中文理解為通用輸入輸出埠。它指的是編程可控制的引腳,即可以控制引腳是作為輸入來用,還是輸出功能,又或者是交給片上外設使用(復用)。 二、GPIO結構框圖 理解GPIO硬體電路的實現,有助於編程的理解。下圖是 ...


一、什麼是GPIO

  GPIO全稱為General Purpose Input Output,中文理解為通用輸入輸出埠。它指的是編程可控制的引腳,即可以控制引腳是作為輸入來用,還是輸出功能,又或者是交給片上外設使用(復用)。

 

二、GPIO結構框圖

  理解GPIO硬體電路的實現,有助於編程的理解。下圖是官方手冊給出的GPIO框圖:

 

  此框圖中只有最右端的I/O pin是板上外露可見的,其他部分均在晶元內部。該框圖結構被分為兩個部分,其一是輸出結構,主要由引腳(I/O pin)、保護二極體(protection diode)、雙MOS管(P-MOS+N-MOS)、輸出控制(output control)、輸出數據寄存器(output data register)、位置位/複位寄存器(bit set/reset register)組成 ;其二是輸入結構,由引腳、保護二極體、雙開關(on/off)、TTL肖特基觸發器(TTL Schmitt trigger)、輸入數據寄存器(input data register)組成。

  1.保護二極體

    兩個二極體構成了雙向限幅電路。當外部輸入電壓大於VDD時,上方二極體導通(全文皆忽略二極體和MOS管導通壓降),使得電壓限制在VDD左右;當外部輸入電壓低於VSS,下方二極體導通,電壓限制在VSS左右。然而這樣的保護並不能使引腳直接驅動大功率器件,例如電機,就需要外加驅動電路。

  2.雙開關

    這個雙開關電路與上拉、下拉和浮空模式有關,當處於上拉模式時上方開關閉合,下方斷開,除非引腳的外部輸入為低電平,否則輸入到肖特基觸發器的電平都是高電平;當處於下拉模式時上方開關斷開,下方閉合,除非引腳的外部輸入為高電平,否則輸入到肖特基觸發器的電平都是低電平;當處於浮空模式時開關全部斷開,電平預設為高阻態,輸入的電平完全取決於外部輸入。上下拉多用於按鍵檢測,而浮空則常用於ADC檢測。

  3.肖特基觸發器

    該觸發器主要是將模擬電壓轉為0/1數字信號,上圖中模擬輸入(Analog input)就取自觸發器之前,而輸入數據寄存器則取自觸發器之後的數字信號。

  4.輸入數據寄存器

    這個寄存器用來存儲各個引腳電平狀態,可通過讀取該寄存器內容,來獲取任意引腳狀態。

  5.位置位/複位寄存器

    通過讀寫該寄存器,可以間接地更改輸出數據寄存器的值。

  6.輸出數據寄存器

    可以直接讀寫該寄存器,來更改各個引腳的輸出狀態,當寄存器值保持不變時,每個引腳的電平也就不發生變化。

  7.雙MOS管

    雙MOS管組成一個推輓輸出(push-pull)電路,當輸出寄存器中值為1時,經過反相器,兩管的共柵極輸入低電平,則PMOS導通,NMOS截止,引腳輸出高電平;當輸出寄存器中值為0時,經過反相器,兩管的共柵極輸入高電平,則NMOS導通,PMOS截止,引腳輸出低電平。當PMOS被禁用時,電路變為開漏輸出,引腳仍可輸出低電平,但無法正常輸出高電平,取而代之的是高阻態。如果此時想要輸出高電平,則必須接上拉電阻。開漏輸出僅在一些特殊場合下使用,更多的是推輓輸出。

 

三、GPIO寄存器

  1.APB2外設時鐘使能寄存器(RCC_APB2ENR)

    RCC_APB2ENR並不屬於GPIO的寄存器組,但是它控制著GPIO的引腳時鐘使能,晶元上電後,所有外設時鐘預設是關閉的,所以在使用GPIO前要先打開埠時鐘使能。該寄存器內容如下,我們只關心IOPxEN位,置1則開啟時鐘。

    

       

 

  2.埠配置低位寄存器(GPIOx_CRL)

    該寄存器可配置低8個GPIO引腳的工作模式:模擬輸入、浮空輸入、上拉\下拉輸入、通用推輓輸出、通用開漏輸出、復用推輓輸出、復用開漏輸出。復用輸入模式沒有單獨的配置,只要將引腳配置為浮空/上拉/下拉輸入模式,由片上外設驅動即可。CRL還可以在輸出模式下配置工作頻率,頻率越大,功耗越高。註意每個引腳模式配置占4bit。對於上拉\下拉輸入來說,是上拉還是下拉取決於ODR寄存器配置的值。

    

 

  3.埠配置高位寄存器(GPIOx_CRH)

    該寄存器同GPIOx_CRL,只是它控制的是高8個GPIO引腳的工作模式。

    

 

  4.輸入數據寄存器(GPIOx_IDR)

    該寄存器存儲了當前引腳的狀態,無論GPIO在哪種工作模式下,都可以讀取該寄存器,但在模擬輸入模式下,寄存器的值一直為0。

    

 

     

  5.輸出數據寄存器(GPIOx_ODR)

    在通用輸出模式下,該寄存器可用來控制電平高低;在復用推輓輸出模式下,可讀取ODR獲取引腳狀態(在復用開漏輸出模式下,可讀取IDR獲取引腳狀態)。在上拉或下拉輸入模式下,ODR可決定是上拉還是下拉。

    

 

 

   

  6.位置位/複位寄存器(GPIOx_BSRR)

    通過該寄存器,可以單獨控制某個引腳的電平變化。因為向這個寄存器寫0的結果是無操作,寫1是置位或者複位,所以訪問該寄存器可以直接用=號;而ODR寄存器寫0則表示給低電平,寫1表示給高電平,為了不影響其他引腳,寫入必須用&=和|=號。另外還有個寄存器叫GPIOx_BRR,同該寄存器差不多,只不過BRR只能複位,高16位是保留的。

    

 

 

 

四、GPIO編程

  GPIO最常用的就是通用推輓輸出和上拉/下拉輸入這兩種模式。一下程式實現功能為:

    PA0為按鍵輸入,按下為低電平。PC13是led控制引腳,低電平點亮LED。當按下按鍵時,LED亮;鬆開按鍵時,LED滅。

  程式代碼如下,根據GPIO原理,編程順序一般是:先開啟時鐘使能,配置引腳工作模式,最後給引腳電平信號。

  

int main(void)
{
    
    uint32_t key_value;
    
    //開啟GPIO外設時鐘使能
    //PORTA,第三位置1
    RCC->APB2ENR |= (1<<2);
    //PORTC,第五位置1
    RCC->APB2ENR |= (1<<4);
    
    //GPIO輸入輸出模式配置
    //清零PA0控制位
    GPIOA->CRL &= ~((uint32_t)(0x0F)<<(4*0));
    //設置PA0為上拉輸入
    GPIOA->CRL |=  (uint32_t)(0x08)<<(4*0);
    GPIOA->ODR |=  (uint32_t)(0x01)<<0;    
    //清零PC13控制位
    GPIOC->CRH &= ~((uint32_t)(0x0F)<<(4*5));
    //設置PC13為推免輸出
    GPIOC->CRH |=  (uint32_t)(0x01)<<(4*5);
    
    
    while(1){
            //獲取PA0電平狀態,key_value==1表示按鍵沒有按下
            key_value = (GPIOA->IDR & (uint32_t)(0x01)) == (uint32_t)(0x01);
            //改變PC13電平
            if (key_value==0)
                //PC13低電平輸出
                GPIOC->ODR &= ~((uint32_t)(0x01)<<13);                
            else
                //PC13高電平輸出
                GPIOC->ODR |= (uint32_t)(0x01)<<13;
    }
}

  

 

  


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

-Advertisement-
Play Games
更多相關文章
  • Implementing languages on the Erlang VM ...
  • 參考:http://www.caodahua.cn/detail/3/ 模板繼承可以減少頁面內容的重覆定義,實現頁面內容的重用。我的個人博客右側的導航欄都是繼承base頁面從而讓代碼得到最大程度的復用。但是當父模板中有動態數據的話,這些動態數據在子模版中是不會顯示的。我們可以通過自定義上下文處理器來 ...
  • ...
  • 第一種,使用reversed 函數,reversed返回的結果是一個反轉的迭代器,我們需要對其進行 list 轉換 第二種,使用sorted函數,sorted是排序函數,它是對一個列表進行排序後生成一個新的list列表,而sort則是在原來的列表上直接進行排序。 其中,reverse是排序規則,Tr ...
  • 一、print()函數概述 print() 方法用於列印輸出,是python中最常見的一個函數。 該函數的語法如下: 參數的具體含義如下: objects 表示輸出的對象。輸出多個對象時,需要用 , (逗號)分隔。 sep 用來間隔多個對象。 end 用來設定以什麼結尾。預設值是換行符 \n,我們可 ...
  • typing模塊的作用 自python3.5開始,PEP484為python引入了類型註解(type hints) 類型檢查,防止運行時出現參數和返回值類型、變數類型不符合。 作為開發文檔附加說明,方便使用者調用時傳入和返回參數類型。 該模塊加入後並不會影響程式的運行,不會報正式的錯誤,只有提醒py ...
  • 2020年1月15號慕課網,騰訊課堂,龍果學院,更新資料整理 -買家看 微雲:鏈接:https://share.weiyun.com/5x8hmp6 密碼:202015 百度網盤:鏈接:https://pan.baidu.com/s/1voabjevl1BhoL7ul7yDskg 提取碼:a2z4 ...
  • java學習經驗總結 單鏈表的建立與結點的增刪 在該鏈表結點有data數據,並且還有cpu,分給cpu隨機的時間片,根據時間片大小進行結點data的排序 鏈表結點的建立 鏈表的構建過程以及添加節點、刪除節點 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...