<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          STM32 IO 口操作

          作者: 時間:2016-11-13 來源:網(wǎng)絡 收藏
          STM32IO口操作STM32的0x2000_0000到0x200F_FFFF單元的SRAM被定義成BitBandRegion,共1MB字節(jié),與之相對應的是0x2200_0000到0x23FF_FFFF單元32MB。

          本文引用地址:http://www.ex-cimer.com/article/201611/316352.htm

          (一)開啟時鐘

          在初始化IO的時候,首先要初始化IO的時鐘。

          APB1ENR

          APB2ENR

          兩個從字面上看都是AdvancedPeripheryBusEnable,不同之處一個是1,一個是2。區(qū)別在哪里?IO初始化的應該根據(jù)需要開啟哪個時鐘總線?

          APB1外設時鐘使能寄存器(RCC_APB1ENR)低速APB使能,最大允許頻率36MHz

          APB2外設時鐘使能寄存器(RCC_APB2ENR)高速APB使能,最大允許頻率72MHz

          首先搞清楚這里的外設是相對CortexM3的內(nèi)核來講的。這兩個寄存器都是32的,占用四個字節(jié)。

          APB1外設時鐘使能寄存器的可用位為20位,這些都是R/W,對應的“外設”時鐘有:(1)DAC接口時鐘使能,(2)電源接口時鐘使能,(3)備份接口時鐘使能,(4、5)Can2和Can1接口時鐘使能,(6、7)IIC2和IIC1接口時鐘使能,(8、9、10、11)USART5、USART4、USART3、USART2接口時鐘使能,(12、13)SPI3和SPI2接口時鐘使能,(14)窗口看門狗時鐘使能,(15-20)定時器2-7時鐘使能,可以看得出,一個位對應一個“外設”,0關閉,1打開。

          APB2外設時鐘使能寄存器,在跑馬燈程序的IO_Configration函數(shù)初始化的第一個寄存器就是它。說明一下,這兩個寄存器都位于結構體RCC_TypeDef中,名字叫APB1ENR和APB2ENR。操作的時候就是RCC->APB1ENR=xxxxxxxx,這里是舉個例子。同樣這個寄存器和上面的1不一樣,它只有11個bit有效,其余的bit保留(保留位讀為0),開放出來的bit都是R/W(可讀可寫的)。這些外設都是:(1)USART1接口時鐘使能,

          (2)SPI1接口時鐘使能(3)定時器1時鐘使能,(4、5)ADC2和ADC1接口時鐘使能,(6-10)端口A-E時鐘使能,(11)輔助功能IO時鐘使能。可以看得出,也是一個位對應一個外設,1打開,0關掉。

          來看這段代碼

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

          RCC->APB2ENR|=1<<5;//使能PORTD時鐘

          上面這兩個操作就是打開端口A的端口D的時鐘。更為簡潔的寫法:

          RCC->APB2ENR|=0x00000014;//訪問:字,半字和字節(jié)訪問

          //這里采用字訪問

          或者

          RCC->APB2ENR|=(U32)0x14;//訪問:字,半字和字節(jié)訪問

          //這里采用字訪問

          (二)設置輸入輸出模式

          CRH-xcontrolregisterhigh端口配置高寄存器

          CRL-xcontrolregisterlow端口配置低寄存器

          //STM32每個端口有16個口線,GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,//GPIOF,GPIOG.目前IO口的數(shù)目最多的A-G,總共112個。

          后面的X表示屬于那一個端口,每個端口對應一個控制寄存器。GPIOA->CRH=0xxxxxxxx;

          就可以實現(xiàn)對A端口CRH的操作。

          CRL-x和CRH-x都是32位的寄存器,每一位都是RW。必須以字(32位)的方式操作這些外設寄存器。其中四位控制一個端口的輸入輸出模式,比如說速率是50M,2M,還是20M,輸出是OD,還是PP,輸入是FLOATING還是IPU。這個設置在庫函數(shù)中的體現(xiàn)就是GPIO_InitStructure.GPIO_Mode和GPIO_InitStructure.GPIO_Speed的參數(shù)配置。

          (三)讀寫端口數(shù)據(jù)

          端口輸出數(shù)據(jù)寄存器(GPIOx_ODR)(x=A..E),要寫數(shù)據(jù)到端口就給這個寄存器賦值。32位寄存器,高16位保留。低16位對應IO。

          端口輸入數(shù)據(jù)寄存器(GPIOx_IDR)(x=A..E),要讀取端口上的狀態(tài),就讀取這個寄存器的值。32位寄存器,高16位保留,低16位對應IO。

          (四)還有三個寄存器

          GPIOx_BSRRgpiobitsetorresetregister端口位設置清除寄存器

          這是一個32位寄存器,位寫1有效,寫0無影響,高16位寫清除對應的位,即對應位輸出0;低16位寫1置位對應位,對應位輸出1。該寄存器只能寫,不能讀,并且只支持字操作。

          GPIOx_BRRgpiobitresetregister端口位清除寄存器

          少了個S,對比上面的功能上了少了置位功能,其它相同。

          GPIOx_LCKRgpiolockregister端口位配置鎖定寄存器

          這個暫時估計不用,就不說了。



          關鍵詞: STM32IO口操

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();