新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GPIO內部結構、工作原理及相關寄存器詳解(以STM32為例)

        GPIO內部結構、工作原理及相關寄存器詳解(以STM32為例)

        作者: 時間:2018-01-18 來源:網絡 收藏

          1. STM32實物圖:

        本文引用地址:http://www.104case.com/article/201801/374607.htm

            

         

          2. STM32引腳分布圖:

            

         

          STM32F103ZET6:共144個引腳,7組IO口,每組16個IO口

          7*16=112個IO口(這7組IO口分別為A,B…G)

          例如:PGIOA包含PA0,PA1,PA2…PA15,每組16個IO口

          二,IO口的基本結構和工作方式

          1. STM32F1系列IO口的基本結構()IO口內部電路結構)

            

         

          右側I/O引腳部分為芯片暴露在外部的引腳

          每個引腳在數據手冊都有說明是否支持(識別))5V電壓

          三,PGIO的8種工作方式

          4種輸入模式

          輸入浮空

          輸入上拉

          輸入下拉

          模擬輸入

          4種輸出模式

          開漏輸出

          開漏復用功能

          推挽輸出

          推挽復用功能

          可配置3種最大翻轉速度

          2MHz

          10MHz

          50MHz

          四,八種工作方式講解

          1,GPIO輸入工作模式1-輸入浮空模式

            

         

          1)外部通過IO口輸入電平,外部電平通過上下拉部分(浮空模式下都關閉,既無上拉也無下拉電阻)

          2)傳輸到施密特觸發器(此時施密特觸發器為打開狀態)

          3)繼續傳輸到輸入數據IDR

          4)CPU通過讀輸入數據IDR實現讀取外部輸入電平值

          在輸入浮空模式下可以讀取外部輸入電平

          2,GPIO輸入工作模式2-輸入上拉模式

            

         

          和輸入浮空模式相比較,不同之處在于內部有一個上拉電阻連接到VDD(輸入上拉模式下,上拉電阻開關接通,阻值約30-50K)

          外部輸入通過上拉電阻,施密特觸發器存入輸入數據IDR,被CPU讀取

          3,GPIO輸入工作模式3-輸入下拉模式

            

         

          和輸入浮空模式相比較,不同之處在于內部有一個下拉電阻連接到VSS(輸入下拉模式下,下拉電阻開關接通,阻值約30-50K)

          外部輸入通過下拉電阻,施密特觸發器存入輸入數據寄存器IDR,被CPU讀取

          4,GPIO輸入工作模式4-輸入模擬模式

            

         

          上拉和下拉部分均為關閉狀態(AD轉換-模擬量轉換為數字量)

          施密特觸發器為截止狀態

          通過模擬輸入通道輸入到CPU

          IO口外部電壓為模擬量(電壓形式非電平形式),作為模擬輸入范圍一般為0~3.3V

          5,GPIO輸出工作模式1-開漏輸出模式

            

         

          1,CPU寫入位設置/清楚寄存器BSRR,映射到輸出數據寄存器ODR

          2,聯通到輸出控制電路(也就是ODR的電平)

          3,ODR電平通過輸出控制電路進入N-MOS管

          -ODR輸出1:

          N-MOS截止,IO端口電平不會由ODR輸出決定,而由外部上拉/下拉決定

          在輸出狀態下,輸出的電平可以被讀取,數據存入輸入數據寄存器,由CPU讀取,實現CPU讀取輸出電平

          所以,當N-MOS截止時,如果讀取到輸出電平為1,不一定是我們輸出的1,有可能是外部上拉產生的1

          -ODR輸出0:

          N-MOS開啟,IO端口電平被N-MOS管拉倒VSS,使IO輸出低電平

          此時輸出的低電平同樣可以被CPU讀取到

          6,GPIO輸出工作模式2-開漏復用輸出模式

            

         

          與開漏輸出模式唯一的區別在于輸出控制電路之前電平的來源

          開漏輸出模式的輸出電平是由CPU寫入輸出數據寄存器控制的

          開漏推挽輸出模式的輸出電平是由復用功能外設輸出決定的

          其他與開漏輸出模式相似:

          控制電路輸出為1:N-MOS截止,IO口電平由外部上拉/下拉決定

          控制電路輸出為0:N-MOS開啟,IO口輸出低電平

          7,GPIO輸出工作模式3-推挽輸出模式

            

         

          與開漏輸出相比較:

          輸出控制寄存器部分相同

          輸出驅動器部分加入了P-MOS管部分

          當輸出控制電路輸出1時:

          P-MOS管導通N-MOS管截止,被上拉到高電平,IO口輸出為高電平1

          當輸出控制電路輸出0時:

          P-MOS管截止N-MOS管導通,被下拉到低電平,IO口輸出為低電平0

          同時IO口輸出的電平可以通過輸入電路讀取

          8,GPIO輸出工作模式4-復用推挽輸出模式

            

         

          與推挽輸出模式唯一的區別在于輸出控制電路之前電平的來源

          開漏輸出模式的輸出電平是由CPU寫入輸出數據寄存器控制的

          開漏推挽輸出模式的輸出電平是由復用功能外設輸出決定的

          9,推挽輸出和開漏輸出的區別:

          推挽輸出:

          可以輸出強高/強低電平,可以連接數字器件

          開漏輸出:

          只能輸出強低電平(高電平需要依靠外部上拉電子拉高),適合做電流型驅動,吸收電流能力較強(20ma之內)

          五,STM32-IO口相關寄存器

          每組GPIO包含系列7個寄存器(7組GPIO共包含7*7=49個寄存器)

          兩個32位配置寄存器

          GPIOx_CRL 低16位

          GPIOx_CRH 高16位

          兩個32位數據寄存器

          GPIOx_IDR 輸入數據寄存器

          GPIOx_ODR 輸出數據寄存器

          一個32位置位/復位寄存器

          GPIOx_BSRR

          一個16位復位寄存器

          GPIOx_BRR

          一個32位鎖定寄存器

          GPIOx_LCKR

          六,STM32-IO口相關寄存器講解

          1,端口配置寄存器:

          STM32每組GPIO位16個IO口,每4位控制一個IO口,所以32位控制8個IO口

          分為低16位:GPIOx_CRL和高16位:GPIOx_CRH共32位控制一組GPIO的16個IO口

            

         

          如圖:以端口配置寄存器低16位為例,每四位控制一個IO口(高16位同理)

          MODEx的2位 : 配置IO口輸出/輸出模式(1種輸出+3種不同速度的輸出模式)

          CNFx的2位 : 配置IO口輸入/輸出狀態下(由MODEx控制)的輸入/輸出模式

          以GPIOA_CRL為例,配置IO口PA0 -> MODE0=00(輸入模式) CNF0=10(上拉/下拉輸入模式)

          此種配置下到底是上拉還是下拉輸入模式還需由ODR寄存器決定

            

         

          關于上拉/下拉的控制我們將在下面-數據寄存器-中介紹ODR輸出寄存器時詳細說明

          2,數據寄存器(以輸入數據寄存器GPIOx_IDR為例)

          每一組IO口都具有一個GPIOx_IDR的32位寄存器(實際只使用低16位,高16位保留),即16位控制16個IO口,每一位控制一個

            

         

          如圖:IDR寄存器共32位,0~15位代表一組IO口16個IO當前值

          這里我們已經了解了輸入/輸出數據寄存器,現在說下上面提到的問題:

          當IO口配置為輸入模式且配置為上拉/下拉輸入模式(即MODEx=00 CNFx=10時),ODR決定到底是上拉還是下拉

          1)當輸出模式時,ODR為輸出數據寄存器

          2)當輸入模式時,ODR用作區分當前位輸入模式到底是上拉輸入(ODRx=0)還是下拉輸入(ODRx=1)

          3,端口位設置/清除寄存器(GPIOx_BSRR)

            

         

          BSRR寄存器作用:

          BSRR寄存器為32位寄存器,低16位BSx為設置為(1設置0不變),高16位BRx為重置位(1:清除0:不變)

          當然,最終的目的還是通過BSRR間接設置ODR寄存器,改變IO口電平

          4,端口位清除寄存器(GPIOx_BRR)

            

         

          GPIOx_BRR寄存器作用同GPIOx_BSRR寄存器高16位

          一般我們使用BSRR低16位和BRR的低16位(STM32F4系列取消了BSRR的高16位)

          5,鎖存寄存器:使用較少暫不分析

          七,端口的復用和重映射

          1,端口的復用:

          大部分IO口可復用為外部功能引腳,參考芯片數據手冊(IO口復用和重映射)

            

         

          例如:STM32F103ZET6的PA9和PA10引腳可復用為串口發送和接收功能引腳,也可復用為定時器1的通道2和通道3

          端口復用的作用:最大限度的利用端口資源

          2,端口的重映射:

            

         

          串口1默認引腳是PA9,PA10可以通過配置重映射映射到PB6,PB7

          端口重映射的作用:方便布線

          3,STM32所有的IO口都可作為中斷輸入(51單片機只有2個端口可以作為外部中斷輸入)



        關鍵詞: GPIO 寄存器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 光泽县| 曲周县| 柳河县| 华蓥市| 玛沁县| 新密市| 行唐县| 舞钢市| 盈江县| 固始县| 治县。| 桑日县| 沽源县| 辉县市| 靖西县| 来凤县| 昌乐县| 鄂托克前旗| 沁源县| 绥化市| 论坛| 山阳县| 合水县| 湖南省| 安丘市| 赤城县| 巴塘县| 益阳市| 墨玉县| 绥芬河市| 牟定县| 南丰县| 塔城市| 乐平市| 吉木乃县| 镇宁| 桦南县| 乌兰浩特市| 慈溪市| 北海市| 武穴市|