1 io口 stm32 STM32如何進行位繫結

2021-10-12 21:34:30 字數 2077 閱讀 1918

在我們學習51微控制器的時候,對io的操作可直接使用p0^1=0,p0^2=1,控制某個io口就可以單獨的對某個埠的io口進行操作,但在stm32中是不能直接這樣用的,為了可以像使用51微控制器一樣對某個埠的io口進行直接操作方便我們使用,就出現了位帶操作。

位繫結理解:

stm32對外設埠的操作是通過配置相應的暫存器的位來完成的,位繫結就是把對暫存器某一位的操作對映到某個記憶體位址,通過位繫結後我們可以使我們的的**效率更高,對外設的操作更加方便。

下圖顯示了cortex-m3 儲存器的對映

從圖中我們可以看出stm32儲存對映區包括兩個位繫結區(bit band區)。分別為sram區域中的低1mb位址即(0x20000000~0x200fffff)和外設儲存區的低 1mb位址處(0x4000 0000 ~ 0x400f ffff)。我們都知道stm32是32的,最快捷的操作方法就是操作乙個32的位址,所以stm32有設計出了別名區,對32mb sram的別名區的訪問對映為1m sram位繫結區(bit band)的訪問,對 32mb 外設別名區的訪問對映為對 1mb 外設位繫結區(bit band)區的訪問。為什麼別名區會是位帶區的32倍呢?因為位帶區是以位為單位,每八個位為乙個位址,而別名區是以字為單位,每個字等於4個位元組,就是32位。

對映的演算法:

對於位繫結的公式官方給出的如下:

比如我們要訪問的記憶體暫存器的位址為add;n為對應的每一位

sram區對映的位址 = 0x22000000 + ((add- 0x20000000) * 8 + n) * 4 = 0x22000000 + ((add - 0x20000000) * 32 + n * 4

片上外設區對映的位址 = 0x42000000 + ((add - 0x40000000) * 8 + n) * 4= 0x42000000 + ((add - 0x40000000) * 32 + n * 4

n*4是因為1位要用4個位址單元即前面說的只有4的倍數的位址才能被訪問。

byte_offset*32(add - 0x20000000)*32因為位帶區的乙個位要擴張到別名區的32個位,byte_offset*32是前面已經占用的位址。

程式實現:

#define bitband(addr, bitnum) ((addr & 0xf0000000)+0x2000000+((addr &0xfffff)<<5)+(bitnum<<2))

#define mem_addr(addr) *((volatile unsigned long *)(addr))

#define bit_addr(addr, bitnum) mem_addr(bitband(addr, bitnum))

#define gpioa_odr_addr (gpioa_base+20)

#define gpioa_idr_addr (gpioa_base+16) //0x40020010

對io口操作

#define paout(n) bit_addr(gpioa_odr_addr,n) //輸出

#define pain(n) bit_addr(gpioa_idr_addr,n) //輸入

因為不知道其是sram還是片上外設的對映,所以我們取其高位addr & 0xf0000000,然後加上0x2000000,這樣無論是sram還是片上外設的對映都可以得到其對應的別名區基位址,addr &0xfffff(add=0x2000_0000‐0x200f_ffff 0x4000_0000‐0x400f_ffff)遮蔽高三位就相當於與add- 0x20000000和add - 0x40000000<<5就相當於乘32,<<2就是乘以4,因為左移的速度比乘的要快,所以把乘都改為了左移。

STM32 STM32啟動方式

在復位時,會按照boot的狀態判斷進入哪種模式,boot腳不用保持長狀態。模式1 boot0拉低,使用使用者快閃儲存器區,這是最正常啟動的模式,即,在正常啟動時,boot0應該下拉為低電平 模式3 從sram執行,由於stm32的flash擦寫的次數是有限的,所以為了保護我們的flash,延長mcu...

STM32 STM32學習記錄3 按鍵輸入

1 io配置 上拉輸入模式 區別在於沒有輸入訊號的時候預設輸入高電平 因為 有弱上拉 下拉輸入模式 區別在於沒有輸入訊號的時候預設輸入低電平 因為有弱下拉 對於浮空輸入模式顧名思義也就 是輸入什麼訊號才是什麼訊號,對於浮空輸入要保證有明確的輸入訊號。2 stm32的gpio既可以設定為輸出也可以設定...

STM32 STM32的復用時鐘何時開啟?

stm32的afio時鐘真的是在開啟引腳復用功能的時候開啟嗎?其實並不是 我們知道,stm32有很多外設,這些外設的外部引腳都是與gpio共用的。我們可以通過軟體來配置引腳作為gpio引腳還是作為外設引腳。當引腳配置為外設引腳時就叫做復用。如串列埠預設復用的引腳為 pa9 pa10引腳可配置為普通i...