STM32 位帶應用

2021-06-17 21:00:33 字數 1320 閱讀 2768

from 

cortex-m3 支援了位操作後,可以使用普通的載入/儲存指令來對單一的位元進行讀寫。

在 cm3  支援的位帶中,有兩個區中實現了位帶。

其中乙個是 sram區的最低 1mb 範圍, 0x20000000 ‐ 0x200fffff(sram 區中的最低 1mb);

第二個則是片內外設區的最低 1mb範圍, 0x40000000 ‐ 0x400fffff(片上外設區中的最低 1mb)。

這兩個區中的位址除了可以像普通的 ram 一樣使用外,它們還都有自己的「位帶別名區」,位帶別名區把

每個bit膨脹成乙個 32 位的字。當你通過位帶別名區訪問這些字時,就可以達到訪問原始位元的目的。

如ram 位址0x20000000(乙個位元組)擴充套件到「位帶別名區」的8個32位的字,分別是 

0x20000000.0 = 0x22000000, 0x20000000.1 = 0x22000004,

0x20000000.2 = 0x22000008, 0x20000000.3 = 0x2200000c,

0x20000000.4 = 0x22000010, 0x20000000.5 = 0x22000014,

0x20000000.6 = 0x22000018, 0x20000000.7 = 0x2200001c,

cm3 使用如下術語來表示位帶儲存的相關位址

*  位帶區:    支援位帶操作的位址區

*  位帶別名:  對別名位址的訪問最終作用到位帶區的訪問上(注意:這中間有乙個位址對映過程)

位帶區中的每個位元都對映到別名位址區的乙個字 —— 這是只有 lsb 有效的字(位帶別名區的字只有最低位有意義)。

位帶操作有很多好處,其中重要的一項就是,在多工系統中,用於實現共享資源在任務間的「互鎖」訪問。多工的共享資源必須滿足一次只有乙個任務訪問它——亦即所謂的「原子操作」。

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

#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))

可進行位操作。

bit_addr(porta, 2) = 0;   // gpioa.2 = 0;

bit_addr(portb, 3) = 1;   // gpiob.3 = 4;

STM32中的位帶 bit band 操作

支援了位帶操作後,可以使用普通的載入 儲存指令來對單一的位元進行讀寫。在 cm3 中,有兩個區中實現了位帶。其中乙個是 sram 區的最低 1mb 範圍,第二個則是片內外設區的最低 1mb範圍。這兩個區中的位址除了可以像普通的 ram 一樣使用外,它們還都有自己的 位帶別名區 位帶別名區把每個位元膨...

STM32中的位帶 bit band 操作

支援了位帶操作後,可以使用普通的載入 儲存指令來對單一的位元進行讀寫。在 cm3 中,有兩個區中實現了位帶。其中乙個是 sram 區的最低 1mb 範圍,第二個則是片內外設區的最低 1mb範圍。這兩個區中的位址除了可以像普通的 ram 一樣使用外,它們還都有自己的 位帶別名區 位帶別名區把每個位元膨...

STM32中的位帶 bit band 操作

位帶操作,實現51類似的gpio控制功能 具體實現思想,參考 io口操作巨集定義 define bitband addr,bitnum addr 0xf0000000 0x2000000 addr 0xfffff 5 bitnum 2 define mem addr addr volatile un...