STM32單片機GPIO寄存器

2020-11-26 電子產品世界

每個GPIO埠有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分別控制每個埠的高八位和低八位,如果IO口是0-7號的話,則寫CRL寄存器,如果IO口是8-15號的話,則寫CRH寄存器,兩個32位數據寄存器(GPIOx_IDR,GPIOx_ODR)一個是只讀作輸入數據寄存器,一個是只寫作輸出寄存器,一個32位置位/復位寄存器(GPIOx_BSRR),一個16位復位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。常用的IO埠寄存器只有四個:CRH,CRL,IDR,ODR。

本文引用地址:

http://www.eepw.com.cn/article/201611/323042.htm

數據手冊中列出的每個I/O埠的特定硬體特徵, GPIO埠的每個位可以由軟體分別配置成多種模式。每個I/O埠位可以自由編程,然而I/0埠寄存器必須按32位字被訪問(不允許半字或字節訪問)。

另外,STM32的每個埠使用前都要將其時鐘使能,STM32的GPIO的時鐘統一掛接在APB2上,具體的使能寄存器為RCC_APB2ENR,該寄存器的第2位到第8位分別控制GPIOx(x=A,B,C,D,E,F,G)埠的時鐘使能,當外設時鐘沒有啟用時,程序不能讀出外設寄存器的數值,如打開PORTA時鐘:

RCC->APB2ENR|=1<<2; //使能PORTA時鐘

使能外設時鐘後,GPIOA的十六位就可以按照設定的狀態工作了,之後就是具體設置哪一位了以第八位為例即高位的首位,在GPIOx_CRH寄存器中進行設置,GPIOA的每一位都有該寄存器的四位來設定相應的參數,這四位中的高兩位(CNF0,CNF1)設置GPIO的輸入輸出模式,低兩位(MODE0,MODE1)是設置GPIO的輸出頻率,具體可以參考STM32參考手冊。

GPIOA->CRH&=0XFFFFFFF0; //清掉PA8原來的設置,同時屏蔽其它埠,不影響其它埠的設置

GPIOA->CRH|=0X00000003;//PA8 推輓輸出
十六進位中的3 換成二進位 00 11 前兩位00表示推輓輸出,11代表輸出頻率50Mhz,若CRH|=0x4,表示模擬輸入模式(ADC用),0x3表示推輓輸出模式(作輸出口用,50M速率),0x8表示上/下拉輸入模式(做輸入口用),0xB表示復用輸出(使用IO口的第二功能,50M速率)。
這是對一位的操作,當然也可以多位操作,因為STM32對GPIO操作必須是32位全字操作,設置完成後GPIOA的第8位就可以使用了之後給GPIOA->ODR=0x xxxx xxxx送數據就行了

STM32單片機,有了埠才能和外界聯繫,學會了埠控制,才能更好地利用外設。建立和外界的聯繫,發揮自身的優點。

首先介紹一下基本的GPIO相關的寄存器:

>1, >GPIOX_CRL 低8位埠配置寄存器

這個寄存器主要是對配置管腳是輸入還是輸出:

其中1)MODEy[1:0]主要是配置是輸入埠還是輸出埠的。配置為輸出得時候還可以配置輸出的管腳速度等級。

2)CNFy[1:0] 主要是兩種形式,在埠配置輸入的時候,即MODEy[1:0]位00(輸入),用來配置輸入的模式,主要是模擬輸入,浮空輸入,上拉模式和下拉模式。

3)CNFy[1:0]在埠配置為輸出的時候,用來控制輸入的模式。具體看手冊吧。

總得來說,就是MODEy[1:0] 先配置管腳是輸入還是輸出,是輸入就繼續配置CNFy[1:0]來配置輸出管腳的連接模式。要是輸出的話,就繼續配置MODEy[1:0]的管腳速度速度等級,之後再配置管腳的連接模式。上拉,下拉,推免,開漏等等。具體運用的時候看看手冊就明白了。

>2, >GPIOX_CRH 高8位埠配置寄存器

和GPIOX_CRH 完全一樣,只是埠換成高8位了。不說了,看看就明白了!

>3, >GPIOX_ODR 埠輸出數據寄存器

學過AVR的都知道,輸出的時候有輸出數據寄存器,STM32也一樣。思想COPY過來,就自然知道了GPIOX_ODR是做什麼的了。不過要注意的是,這個玩意不能一個位一個位的去操作,還是51的簡單啊,不過原子大哥已經把那個埠映射可操作位段,不明白,還是看自己的吧。一個GPIOA埠就16位,自然的32位的GPIOX_ODR 就只有低16位有效了,想輸出什麼就給這個寄存器賦值就OK了。

或者用GPIOA->ODR |=(1<

ODR &=(0<

完成了這一步,我們就可以軟體延時,控制輸出流水燈了。前提是開啟設備時鐘哦。

>4, >GPIOX_IDR 埠輸入數據寄存器

這個寄存器用到的前提是埠配置為輸入模式時候。什麼時候想讀取值,就什麼時候讀取吧。大家都明白。

>5, >GPIOX_BSRR 埠位設置/清除寄存器

這個寄存器我用了一些,別的也不會。就感覺超級好用。用起來很方便。比如你埠配置好了。想PA5輸出「1」。就GPIOA->BSRR |=(1<<5);5是對應的哦。輸出「0」,一樣的

GPIO->BSRR |=(1<

>6, >GPIOX_BRR 埠位清除寄存器

晚上百度了一下,有了GPIOX_BSRR 為什麼還要有GPIOX_BRR ,沒看明白。有了拿來就用就對了。一樣的和GPIOx_BSRR一樣的用法。專門清除的。GPIOA->BRR |= (1<

>7, >埠配置鎖定寄存器GPIOX_LCKR,鎖定了當然就不能修改了。保護了。避免不小心造成的失誤。以後用到了在琢磨吧。


技術專區

相關焦點

  • GPIO相關寄存器配置詳解
    推薦閱讀 GPIO的描述和配置 首先介紹stm32的GPIO,這是入門的起點,也是最容易上手的部分。一、GPIO的綜合描述stm32每一個GPIO埠擁有2個32bits的configuration寄存器(GPIOx_CRL,GPIOx_CRH),2個32bits的數據寄存器(GPIOx_IDR,GPIOx_ODR),1個32bits的set/reset寄存器(GPIOx_BSRR),1個16bits的reset寄存器(GPIOx_BRR)和1個32bits的Lock寄存器(GPIOx_LCKR)
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?   avr單片機特點:   1. avr系列沒有類似累加器A的結構,它主要是通過R16~R31寄存器來實現A的功能。
  • STM32 GPIO 相關寄存器(二)
    STM32單片機,有了埠才能和外界聯繫,學會了埠控制,才能更好地利用外設。建立和外界的聯繫,發揮自身的優點。首先介紹一下基本的GPIO相關的寄存器:1,GPIOX_CRL 低8位埠配置寄存器這個寄存器主要是對配置管腳是輸入還是輸出:其中1)MODEy[1:0]主要是配置是輸入埠還是輸出埠的。配置為輸出得時候還可以配置輸出的管腳速度等級。
  • 怎麼學習STM32單片機?看老司機是怎麼說的!
    本文引用地址:http://www.eepw.com.cn/article/201705/359058.htm  我不是說STM32不好,而是這種為了學習單片機而去學習單片機的思路不對。  你問,如何系統地入門學習stm32?  本身就是一個錯誤的問題。
  • stm32單片機中使用GPIO口模擬PWM輸出解析
    gpio   General Purpose Input Output (通用輸入/輸出)簡稱為GPIO,或總線擴展器,人們利用工業標準I2C、SMBus或SPI接口簡化了I/O口的擴展。當微控制器或晶片組沒有足夠的I/O埠,或當系統需要採用遠端串行通信或控制時,GPIO產品能夠提供額外的控制和監視功能。
  • STM32教程(五)HAL庫之GPIO函數及實例詳細介紹!
    今天介紹STM32 HAL庫的GPIO函數庫,首先打開stm32f4xx_hal_gpio.h文件,我們能看到一些結構體定義以及GPIO引腳的地址定義等等,這些都很好理解,我們需要重點看HAL庫中GPIO的函數庫有哪些?以及這些函數庫有什麼作用以及怎麼使用這些函數?
  • STM32學習筆記——使用函數庫編程控制GPIO口輸出
    看了網上許多人的代碼以及各類開發板所帶的例程,大多數使用的都是官方發布的函數庫來編程,通過查詢後發現,使用函數庫來編程可以簡化開發過程,並不需要追溯到各個寄存器,通過查看庫手冊,新手也可以快速應用STM32,因此
  • GPIO內部結構、工作原理及相關寄存器詳解(以STM32為例)
    每組GPIO包含系列7個寄存器(7組GPIO共包含7*7=49個寄存器)  兩個32位配置寄存器  GPIOx_CRL 低16位  GPIOx_CRH 高16位  兩個32位數據寄存器  GPIOx_IDR 輸入數據寄存器  GPIOx_ODR 輸出數據寄存器  一個32位置位/復位寄存器
  • STM32四種庫對比:寄存器、標準外設庫、HAL、LL
    STM32Snippets主要針對底層開發人員,或者從51轉過來,直接操作寄存器開發的人員。 是沒有經過封裝,可見底層寄存器的一套示例代碼。 https://www.st.com/en/embedded-software/stm32snippets.html (公號不支持外連結,請複製連結到瀏覽器打開)
  • stm32庫函數學習篇通用定時器輸入捕獲功能
    本文引用地址:http://www.eepw.com.cn/article/201611/318488.htm先有必要了解stm32定時器的輸入觸發模塊,如下圖:stm32定時器輸入觸發功能其實挺簡單的,與AVR單片機幾乎一樣。就是單片機引腳上一旦出現一個有效邊沿(可以配置為上升、下降或者上升下降均觸發),那麼定時器計數器CNT裡面的值就會被相應的Capture/Compare X Register保存下來。這裡X可以是1,2,3,4任何一個。並且中斷標誌位被置位。
  • 嵌入式Linux設備驅動開發之:GPIO驅動程序實例
    為了控制這些埠,S3C2410處理器為每個埠組分別提供幾種相應的控制寄存器。其中最常用的有埠配置寄存器(GPACON~GPHCON)和埠數據寄存器(GPADAT~GPHDAT)。因為大部分I/O管腳可以提供多種功能,通過配置寄存器(PnCON)設定每個管腳用於何種目的。數據寄存器的每位將對應於某個管腳上的輸入或輸出。
  • stm32編碼器的接口模式
    編碼器是什麼玩意呢,它可是一個好玩的東西,做小車測速必不可少的玩意,下面,我將從編碼器的原理講起,一直到用stm32的編碼器接口模式,測出電機轉速與方向。2.stm32編碼器接口模式(寄存器)        stm32的編碼器接口模式在STM32中文參考手冊中有詳細的說明,在手冊273頁,14.3.12節。程序是完全按照 下圖方式,設置寄存器的。
  • 基於STM32的OV7670攝像頭總結
    下面介紹帶FIFO和不帶FIFO的工作原理:      圖1:不帶FIFO  圖2:帶FIFO  下面就講解這兩種方式的適用範圍:  不帶FIFO:這種方法最簡單,最直接,但是最不好實現的方法,原因是多數的CMOS晶片(如OV7670)的時鐘速度可以高達24M,一般單片機的
  • LPC2103之GPIO寄存器
    寄存器描述訪問復位值地址FIODIR快速GPIO管腳方向控制寄存器。該寄存器獨立控制每個管腳方向,寫1置相應管腳為輸出。R/W0x0000 00000x3FFF C000FIO0DIRFIOMASK快速GPIO管腳屏蔽寄存器,對快速IO管腳的任何操作只有在對該寄存器對應位激活(寫0)時有效R/W0x0000 00000x3FFF C010FIO0MASK
  • 使用國產單片機是什麼體驗?(文末申請開發板測評)
    伴隨著濃濃的中國芯熱情下,國產晶片越來越好了,國產單片機也逐漸成為工程師的優選。 那麼用國產單片機開發究竟是怎樣的體驗? 1、利用東軟載波開發板進行ADC及PWM調光測試 ADC 的結果存儲在一個左對齊或右對齊的 16 位數據寄存器中。 ESF0654 PDS開發板ADC接在PB0接口,PB0為ADC0的14通道。
  • 用ULN2003驅動24BYJ48步進電機時,怎麼接stm32單片機比較好?
    stm32單片機是一種高性能、低成本、低功耗的單片機,可以說很多應用場合都會用到,特別是對於大型系統,像電源、充電樁、交互機、電機驅動、PLC、逆變器、印表機、掃描儀、警報系統、視頻電話、 HVAC 等。那麼對於如何用STM32驅動步進電機呢?
  • Stm32的TFT LCD顯示器控制學習筆記
    學習stm32,TFT LCD顯示屏控制是很重要的一章,本人在初步學習STM32遇到了很多困難,所以把學習中積累的部分感覺重要的知識點羅列出來
  • 乾貨 | 143條 超詳細整理STM32單片機學習筆記
    30、OCx=OCxREF+極性31、自動裝載寄存器和影子寄存器:前者相當於51當中的溢出設定數值。而影子寄存器顧名思義是影子,就是寄存器的另一分copy。實際起作用的是影子寄存器,而程式設計師操縱的則是自動裝載寄存器。如果APPE位使能,表明自動裝載寄存器的值在下一次更新事件發生後才寫入新值。
  • STM32 GPIO工作原理及LED電路原理
    9,推輓輸出和開漏輸出的區別:推輓輸出:可以輸出強高/強低電平,可以連接數字器件開漏輸出:只能輸出強低電平(高電平需要依靠外部上拉電子拉高),適合做電流型驅動,吸收電流能力較強(20ma之內)五、STM32-IO口相關寄存器每組GPIO包含系列7個寄存器(7組GPIO共包含7*7=49個寄存器)兩個32位配置寄存器GPIOx_CRL 低16位GPIOx_CRH 高16位兩個32位數據寄存器GPIOx_IDR
  • stm32f407之高級定時器 死區互補PWM(操作寄存器)
    其實死區互補PWM跟通用定時器的PWM配置差異不大,只是需要設置多CCER寄存器中的幾個位以及剎車與死區寄存器BDTR。對寄存器的具體描述請參考數據手冊。配置步驟:1.     使能相關時鐘。2.     配置相關的引腳模式、速度、以及復用功能。3.     使能TIM時鐘4.     設置分頻。