1. 程式人生 > >STM32學習筆記之GPIO輸入與輸出

STM32學習筆記之GPIO輸入與輸出

        1、核心點:對於任意MCU中的外設(模組)操作方法:都是找該模組的工作框圖,根據框圖來寫程式

        對於ST中的任何一個外設,都是掛載在不同的時鐘線下的,所有的時鐘線預設都是關閉的;在使用該外設之前,要開啟該外設的時鐘

        步驟1 :
        開啟晶片手冊(MCU的英文晶片手冊)2.2章節,找外設在哪一條時鐘線下
        步驟2 :
        開啟資料手冊,第6.3章節(時鐘章節)找到對應外設時鐘線的使能暫存器
        步驟3:
        在該暫存器中找到你的外設,看寫入什麼值

        2、GPIO口功能:
        作為普通的輸入、輸出功能
        ---輸入/輸出普通的高、低電平
        作為複用的輸入、輸出功能

        ---作為其他外設傳輸時的功能

        ST中的IO 可以作為輸入,也可以作為輸出,但是要使用者自己配置

        3、輸出模式:
        推輓輸出:
        ---可以輸出 高電平  ,也可以輸出 低電平
        開漏輸出:

        ---只能輸出低電平,如果想在開漏模式下輸出高電平,必須在IO口外部外接一個上拉電阻

        4、上拉下拉

        在輸出配置時,選擇上拉/下拉對IO口電平、功能無明顯影響

        在輸入配置時,上拉: 增強訊號的驅動能力;下拉: 訊號更穩定

        我一直都不明白上拉/下拉到底有什麼用,有什麼影響,找了很多資料也沒有懂。這一部分都是硬體的知識,實在是搞不明白了。後來去問大佬這個到底該怎麼做,大佬說輸出時直接配置浮空就行,不用上下拉,輸入的話會有影響,不過一般影響不大,初學的話就都配置浮空。看來只能以後學的多了再回來看吧。

        5、輸出模式:
        推輓輸出:
        ---可以輸出高電平,也可以輸出低電平
        開漏輸出:
        ---只能輸出低電平,如果想在開漏模式下輸出高電平,必須在IO口外部外接一個上拉電阻

        6、輸出速率

        GPIO輸出速度: 2MHz  25MHz  50MHz; 
        又稱輸出驅動電路的響應速度:(晶片內部在I/O口的輸出部分安排了多個響應速度不同的輸出驅動電路,使用者可以根據自己的需要選擇合適的驅動電路,通過選擇速度來選擇不同的輸出驅動模組,達到最佳的噪聲控制和降低功耗的目的。)
        ---可理解為:輸出驅動電路的頻寬:即一個驅動電路可以不失真地通過訊號的最大頻率。
        如果一個訊號的頻率超過了驅動電路的響應速度,就有可能訊號失真。(訊號頻率為10MHz,而你配置了2MHz的頻寬,則10MHz的方波很可能就變成了正弦波。就好比是公路的設計時速,汽車速度低於設計時速時,可以平穩地執行,如果超過設計時速就會顛簸,甚至翻車。)如果GPIO驅動電路的響應速度相對於訊號頻率太快,會導致功耗加大、噪聲加大,會影響正常訊號的傳輸和識別。
        ---理解:CPU主頻為168M,這個速度就是類似的概念,驅動的頻率

        GPIO的翻轉速度指:

        輸入/輸出暫存器的0 ,1 值反映到外部引腳(APB2上)高低電平的速度.手冊上指出GPIO最大翻轉速度可達18MHz。

        也就是說輸出速度不是指的每秒輸出多快/輸出多少次電平;只是選擇不同的速率,在IO口內部連結不同的功耗電路(對外部現象無影響)

        7、輸出流程 :
        ①、把要輸出的電平寫到輸出資料暫存器
        ②、經過一個輸出驅動器控制(推輓/開漏)
        ③、經過一個上拉/下拉的開關

        ④、輸出的電平傳輸到IO口

        輸出配置相關暫存器:
        ①、模式暫存器
        ②、輸出型別暫存器
        ③、輸出速率暫存器

        ④、上拉/下拉暫存器(對輸出來說,影響不大)

        8、輸入流程:
         ①、外界過來的電平進入IO口
         ②、經過上拉/下拉的選擇
         ③、經過輸入模式配置
         ④、電平儲存在輸入資料暫存器中

         ⑤、通過讀輸入資料暫存器得到電平的狀態

        9、輸入模式
        ①、模擬輸入:
        ADC DAC 轉換 
        ②、上拉輸入:
        當硬體上IO口無外接上拉電阻,軟體上配置為該模式,虛擬一個外接電阻
        ③、下拉輸入: 使用較少
        當硬體上IO無外接下拉電阻,軟體上配置成該模式,虛擬一個外接電阻
        ④、浮空輸入:

        當硬體上IO口有外接電阻,軟體上配置該模式

        10、為什麼輸入無速率?

        輸入資料暫存器每隔1個AHB1時鐘週期對 I/O 引腳上的資料進行一次取樣

附上一些程式碼:

/*****************************
函式名      :LED_Init
函式引數    :無
函式返回值  :無
函式功能    :實現開發板對應LED燈的輸出功能配置
函式描述    :PF6     LED1
                     PF9     LED2
                     PF10    LED3
                     PC0     LED4  
*****************************/
void LED_Init(void)
{
//開啟PF對應的外設時鐘
   RCC->AHB1ENR |=(1<<5);
//開啟PC對應的外設時鐘
   RCC->AHB1ENR |=(1<<2);
/*****配置PF6管腳的輸出功能****/
//模式暫存器
GPIOF->MODER &=~(0X3<<12); //清零
GPIOF->MODER |=(0X1<<12);  //通用輸出模式
//輸出型別暫存器
GPIOF->OTYPER &=~(1<<6);  //推輓輸出
//輸出速率暫存器
GPIOF->OSPEEDR &=~(0X3<<12); //清零
GPIOF->OSPEEDR |=(0X2<<12);  //輸出速率50MHZ 

/*****配置PF9管腳的輸出功能****/
//模式暫存器
GPIOF->MODER &=~(0X3<<18); //清零
GPIOF->MODER |=(0X1<<18);  //通用輸出模式
//輸出型別暫存器
GPIOF->OTYPER &=~(1<<9);  //推輓輸出
//輸出速率暫存器
GPIOF->OSPEEDR &=~(0X3<<18); //清零
GPIOF->OSPEEDR |=(0X2<<18);  //輸出速率50MHZ 

/*****配置PF10管腳的輸出功能****/
//模式暫存器
GPIOF->MODER &=~(0X3<<20); //清零
GPIOF->MODER |=(0X1<<20);  //通用輸出模式
//輸出型別暫存器
GPIOF->OTYPER &=~(1<<10);  //推輓輸出
//輸出速率暫存器
GPIOF->OSPEEDR &=~(0X3<<20); //清零
GPIOF->OSPEEDR |=(0X2<<20);  //輸出速率50MHZ 

/*****配置PC0管腳的輸出功能****/
//模式暫存器
GPIOC->MODER &=~(0X3<<0); //清零
GPIOC->MODER |=(0X1<<0);  //通用輸出模式
//輸出型別暫存器
GPIOC->OTYPER &=~(1<<0);  //推輓輸出
//輸出速率暫存器
GPIOC->OSPEEDR &=~(0X3<<0); //清零
GPIOC->OSPEEDR |=(0X2<<0);  //輸出速率50MHZ 

}

/*****************************
函式名:KEY_Init
函式引數:無
函式返回值:無
函式功能:實現開發板對應按鍵的輸入功能配置
函式描述:KEY1  ---PA0
KEY2 ----PE2
   KEY3 ----PE3
   KEY4 ----PE4
*****************************/
void KEY_init(void)
{
//開啟PA PE的外設時鐘 
RCC->AHB1ENR |= (1<<0 | 1<<4);
/*********PA0輸入配置******/
//模式暫存器
GPIOA->MODER &=~(0X3<<0); //輸入模式
//上下拉暫存器
GPIOA->PUPDR &=~(0X3<<0); //浮空

/*********PE2 E3 E4 輸入配置******/
//模式暫存器
GPIOE->MODER &=~(0X3F<<4); //輸入模式
//上下拉暫存器
GPIOE->PUPDR &=~(0X3F<<4); //浮空
}

相關推薦

STM32學習筆記GPIO輸入輸出

        1、核心點:對於任意MCU中的外設(模組)操作方法:都是找該模組的工作框圖,根據框圖來寫程式        對於ST中的任何一個外設,都是掛載在不同的時鐘線下的,所有的時鐘線預設都是關閉的;在使用該外設之前,要開啟該外設的時鐘        步驟1 :    

Python學習筆記輸入輸出

文章內容基於廖雪峰Python教程,參考慕課網相關課程,並進行了整理。文章僅供本人學習使用,若侵權將立刻刪除。 若無特別說明,文章內容都針對於Python2.7版本。 輸出 print加上字串、整數或變數,即可實現輸出。 多個輸出項需要用逗號隔開,輸出時會自動以空格隔

ceph學習筆記五 Pool映射過程

ceph sds Pool Pool是一個抽象的存儲池,它規定了數據冗余的類型以及對應的副本分布策略。目前實現了兩種Pool類型:Replicated類型和Erasure Code類型。一個Pool由多個PG構成。對象映射過程 對象映射過程指的是查找對象在集群中分布的位置信息,其過程分為兩步:A、

python學習筆記split()方法with

很好 self 所有 簡單 car 版本 指定 操作 發生 Python split()方法 以下內容摘自:http://www.runoob.com/python/att-string-split.html 描述 Python split()通過指定分隔符對字符串進行切片

Python學習筆記函數正則

地址 tee 大於等於 格式 匿名函數 驗證碼 分組 indent 引用 Python函數 Pycharm 常用快捷鍵,例如復制當前行、刪除當前行、批量註釋、縮進、查找和替換。 常用快捷鍵的查詢和配置:Keymap Ctrl + D:復制當前行 Ctrl + E:刪除當前

Python學習筆記面對象錯誤處理

實現 單繼承 父類 成對 數據類型 itl 同時 屬性 子類 反射 __import__()函數用於加載類和函數 __import__(name[, globals[, locals[, fromlist[, level]]]]) 參數說明: n

Java學習筆記2(輸入隨機數簡單介紹)

args image public 數據類型 system double next class gpo 輸入: import java.util.Scanner; public class ScannerDemo{   public static void main(Str

Framework7學習筆記導航欄工具欄的布局類型

class 文件中 div 工具 gpo 導航 log 不同的 布局 一:布局類型 導航欄、工具欄 有多種布局類型,他們分別有不同的表現效果,主要有:靜態布局、固定布局、穿透布局。 二:靜態布局(少用) 靜態布局的導航欄、工具欄,是寫死在頁面文件中的,

Linux學習筆記基礎命令獲取幫助文檔

內容 大寫 用戶 協議 當前時間 switch 使用 主機 當前 一、linux的基本原則:1、 由目的單一的小程序組成,組合小程序,完成復雜任務;2、 一切皆文件;3、 盡量避免捕獲用戶接口;4、 配置文件保存為純文本格式二、shellGUI :Graphic U

es6學習筆記環境搭建結構賦值

全域性安裝Babel-cli 在終端中輸入以下命令,如果你安裝很慢的話,可以使用淘寶映象的cnpm來進行安裝。安裝cnpm的方法,大家自己百度吧。 npm install -g babel-cli 雖然已經安裝了babel-cli,只是這樣還不能成功進行轉換,如果你不相信可以輸入下邊的命令

併發程式設計學習筆記原子變數非阻塞同步機制(十二)

概述 java.util.concurrent包中的許多類,比如Semaphore和ConcurrentLinkedQueue,都提供了比使用Synchronized更好的效能和可伸縮性.這是因為它們的內部實現使用了原子變數和非阻塞的同步機制. 近年來很多關於併發演算法的研究都聚焦在非阻塞演算法(nonb

程世東老師TensorFlow實戰——個性化推薦,程式碼學習筆記②模型訓練測試

個性化推薦第二部分:模型訓練 程式碼來自於知乎:https://zhuanlan.zhihu.com/p/32078473 /程式碼地址https://github.com/chengstone/movie_recommender/blob/master/movie_recommender.

網路資訊保安學習筆記對稱密碼傳統加密技術

對稱密碼 對稱密碼即加密和解密是可逆的過程 傳統加密技術 一般的傳統加密技術均為對稱密碼 一、對稱密碼模型 1.對稱加密有五個基本成分 明文:原始的可理解的訊息或資料,是輸入-----》常用X表示 加密演算法:對銘文進行代替或變換----》E() 金鑰:也是加

Java學習筆記——自動裝箱拆箱

自動裝箱與拆箱 基本型別與引用型別的互相轉換 1. 基本型別對應的包裝類 byte    short       char      int &

《Android群英傳》學習筆記Android體系系統架構

一、Android系統架構 1.Linux核心層 Android核心系統服務依賴於Linux2.6核心,如安全性、記憶體管理、程序管理、網路協議棧和驅動模型。Linux核心也是作為硬體與軟體棧的抽象層

Java學習筆記抽象類介面的應用

1、抽象類的實際應用 — 定義模板 假設有這樣的場景,將人分為工人和學生,兩者都能說話,只是說話的內容不一樣,換句話說,說話這個功能應該是一個具體功能,說話的內容由學生和工人決定,我們可以用抽象類實現這個場景 abstract class Person2{ private S

STM32學習筆記ADC轉換

1. ADC簡介 stm32f103最少有2個AD模數轉換器,每個ADC都有18個通道,可以測量16個外部和2個內部模擬量。最大轉換頻率為1Mhz,也就是轉換時間為1us(在 ADCCLK = 14Mhz,取樣週期為1.5個時鐘週期時)。最大時鐘超過14Mhz,將導致ADC轉換準確度降低。stm32的A

android學習筆記客戶端服務端保持session登入狀態

剛進公司不久,也沒有具體專案任務,只有一個混合開發模式,使用AppCan開發的專案。 雖然混合開發很便捷、很高效,使用html和js就可以完成。 但我依然對android原生開發有著極高的熱情,尤其是在體驗了Android 5.0版本之後,更是對原生體驗著迷。 所以,我利用

STM32學習筆記ADC--DMA方式

}/*************************************************函式: void DMA_Config(void)功能: DMA配置 引數: 無返回: 無**************************************************/void DMA

Python學習筆記三:輸入輸出

        首先,登入        >>>是Python直譯器的提示符輸出1輸出字串,使用print(),在括號中加上字串,多個字串用逗號“,”隔開,每個字串用單引號包住注意:print()會依次列印每個字串,遇到逗號“,”會輸出一個空格2,print