STM32筆記(四)位帶操作介紹

2021-10-05 16:21:46 字數 2857 閱讀 3586

位帶操作就是對可以單一的位元bit進行讀寫,在51微控制器中可以用關鍵字sbit來實現位定義,在stm32微控制器中就沒有這樣的關鍵字,取而代之的是通過訪問位帶別名區來實現位帶操作的。

在 stm32 中,有兩個地方實現了位帶,乙個是sram 區的最低1mb範圍,另乙個是片內外設

區的最低 1mb 範圍,兩個區中的位址除了可以像普通的 ram 一樣使用外,它們還都有自

己的「位帶別名區,」位帶別名區「把這 1mb 的空間的每乙個位膨脹成乙個 32 位的字,當

訪問位帶別名區的這些字時,就可以達到訪問位帶區某個位元位的目的。

對於stm32f103系列來說,外設位帶區的位址是: 0x40000000~0x40100000,大小為 1mb,這些位址上包含了f103系列各種容量大小微控制器的暫存器。

外 設 位 帶 區 經 過膨 脹 後 的 位 帶 別 名 區 地 址為 :0x42000000~0x43ffffff

stm32 的全部暫存器都可以通過訪問位帶別名區的方式來達到訪問原始暫存器位元位的效果,而51微控制器只有部分暫存器可以,但一般我們不會以純暫存器進行開發,如果專案需要頻繁的操作各種io口的時候,位帶操作的作用就來了。

sram 的位帶區的位址為: 0x2000 0000~x2010 0000,大小為 1mb,

膨脹後的位帶別名區位址為: 0x2200 0000~0x23ff ffff,大小為 32mb,

一般很少用位帶操作操作sram區的單個位元。

4其中

0x42000000 是外設位帶別名區的起始位址

0x40000000 是外設位帶區的起始位址

aliasaddr =

0x22000000

+(a-

0x20000000)*

8*4+ n*

4

0x22000000 是sram位帶別名區的起始位址0x20000000 是sarm位帶區的起始位址為了方便操作,通常把這兩個公式合併成乙個公式,把「位帶位址+位序號」轉換成別名區位址統一成乙個巨集

// 把「位帶位址+位序號」轉換成別名位址的巨集

2 #define bitband

(addr, bitnum)

((addr &

0xf0000000)+

0x02000000+(

(addr &

0x00ffffff

)<<5)

+(bitnum<<2)

)

從左往右看

1、addr & 0xf0000000 主要是為了取出addr的頭四位,也就是取出sram位帶別名區的2或者外設位帶別名區的4

2、+ 0x02000000

外 設 位 帶 區 經 過膨 脹 後 的 位 帶 別 名 區 地 址為 :0x42000000~0x43ffffff

膨脹後的位帶別名區位址為: 0x2200 0000~0x23ff ffff

很明顯,每乙個膨化後的位址從左往右第二位上都有2,所以這裡就要加上0x02000000

3、addr & 0x00ffffff

通過前面兩步,已經把位帶別名區的十六位進製初始位址的頭兩位給確定了,我們不希望在後面的加減中重複的取到頭兩位的位址,所以通過這個操作把頭兩位給遮蔽掉以免影響後續的位址的疊加

4、<<5 與 <<2

<<5 相當於*8*4,<<2 相當於*4

#define gpiob_odr_addr (gpiob_base + 0x0c)

//設定gpiob_odr的位帶操作,控制gpio的輸出,bitnum是引腳號如pb1,pb2

#define pbout(bitnum) *(unsigned int *)((gpiob_odr_addr & 0xf0000000)+0x02000000+((gpiob_odr_addr & 0x00ffffff)<<5)+(bitnum<<2))

//這裡用*(unsigned int *)將位址轉化成可操作的暫存器

#define gpioa_idr_addr (gpioa_base + 0x08)

//設定gpioa_idr的位帶操作,也就是控制gpio的輸入

#define pain(bitnum) *(unsigned int *)((gpioa_idr_addr & 0xf0000000)+0x02000000+((gpioa_idr_addr & 0x00ffffff)<<5)+(bitnum<<2))

STM32位帶操作詳細介紹

3.gpio位帶實現 在stm32中,如果我們要使pb0埠輸出低電平,可以用如下語句 gpiob odr 0 0 在51微控制器中我們是這樣的 p0 0xff 匯流排操作 還有一種方法 sbit led1 p0 0 led1 0 位操作 在stm32中能不能實現位操作呢,當然是可以的,這種方法我們叫...

stm32之位帶操作

stm32相對於8位微控制cpu來說實在強大的不得了,依稀記得51控制i o空的時候是 sbit led1 p0 0 然而我們在32卻沒有想 sbit 類似的關鍵字進行i o的某位進行操作。於是引入了 位帶操作的概念 什麼事位帶操作?標準的定義是 通過訪問位帶別名區來實現,即通過將每個位元位膨脹成乙...

STM32筆記記錄

串列埠記錄 stm32有好幾個串列埠。比如說stm32f103zet6有5個串列埠,串列埠1的引腳對應的io為pa9,pa10.pa9,pa10預設功能是gpio,所以當pa9,pa10引腳作為串列埠1的tx,rx引腳使用的時候,那就是埠復用。復用埠初始化有幾個步驟 1 gpio埠時鐘使能。要使用到...