STM32 BIT BAND 位帶別名區使用入門

2021-06-13 05:39:40 字數 2120 閱讀 7114

支援了位帶操作(bit_band),有兩個區中實現了位帶。其中乙個是sram 區的最低1mb 範圍,第二個則是片內外設 

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

//  己的「位帶別名區」,位帶別名區把每個位元膨脹成乙個32 位的字 

// 

//  每個位元膨脹成乙個32 位的字,就是把  1m  擴充套件為 32m , 

// 

//  於是;ram位址 0x200000000(乙個位元組)擴充套件到8個32 位的字,它們是: 

//   0x220000000 ,0x220000004,0x220000008,0x22000000c,0x220000010,0x220000014, 0x220000018,0x22000001c 

// 支援位帶操作的兩個記憶體區的範圍是: 

// 0x2000_0000‐0x200f_ffff(sram 區中的 

// 0x4000_0000‐0x400f_ffff(片上外設區中的最低1mb) 

/* 

對sram 位帶區的某個位元,記它所在位元組位址為a,位序號 

在別名區的位址為: 

aliasaddr= 0x22000000 +((a‐0x20000000)*8+n)*4 =0x22000000+ (a‐0x20000000)*32 + n*4 

對於片上外設位帶區的某個位元,記它所在位元組的位址為a,位序號為n(0<=n<=7),則該位元 

在別名區的位址為: 

aliasaddr= 0x42000000+((a‐0x40000000)*8+n)*4 =0x42000000+ (a‐0x40000000)*32 + n*4 

上式中,「*4」表示乙個字為4 個位元組,「*8」表示乙個位元組中有8 個位元。 

*/ 

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

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

//把該位址轉換成乙個指標 

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

// mem_addr(bitband( (u32)&crcvalue,1)) = 0x1; 

例如點亮led 

// 使用stm32庫

gpio_resetbits(gpioc, gpio_pin_4); //關led5 

gpio_setbits(gpioc, gpio_pin_7);   //開led2 

// 一般讀操作 

stm32_gpioc_regs->bsrr.bit.br4 =1;// 1:清除對應的odry位為0 

stm32_gpioc_regs->bsrr.bit.bs7 =1;// 1:設定對應的odry位為1 

//如果使用 位帶別名區操作 

stm32_bb_gpioc_regs->bsrr.br[4] =1;// 1:清除對應的odry位為0 

stm32_bb_gpioc_regs->bsrr.bs[7] =1;// 1:設定對應的odry位為1 

**比stm32庫 高效 十倍 !

對記憶體變數的位操作。

// sram  變數 

long crcvalue; 

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

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

//把該位址轉換成乙個指標 

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

// 對32位變數 的bit1 置 1 : 

mem_addr(bitband( (u32)&crcvalue,1)) = 0x1; 

//對任意一位( 第23位 ) 判斷: 

if(mem_addr(bitband( (u32)&crcvalue,23))==1) 

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...