<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32中的位帶(bitband)操作(轉)

STM32中的位帶(bitband)操作(轉)

作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò ) 收藏
支持了位帶操作后,可以使用普通的加載/存儲指令來(lái)對單一的比特進(jìn)行讀寫(xiě)。在 CM3 中,有兩個(gè)區中實(shí)現了位帶。其中一個(gè)是 SRAM 區的最低 1MB 范圍,第二個(gè)則是片內外設區的最低 1MB范圍。這兩個(gè)區中的地址除了可以像普通的 RAM 一樣使用外,它們還都有自己的“位帶別名區”,位帶別名區把每個(gè)比特膨脹成一個(gè) 32 位的字。當你通過(guò)位帶別名區訪(fǎng)問(wèn)這些字時(shí),就可以達到訪(fǎng)問(wèn)原始比特的目的。

位帶操作的概念其實(shí) 30 年前就有了,那還是8051 單片機開(kāi)創(chuàng )的先河,如今,CM3 將此能力進(jìn)化,這里的位帶操作是 8051 位尋址區的威力大幅加強版。
CM3 使用如下術(shù)語(yǔ)來(lái)表示位帶存儲的相關(guān)地址:
位帶區:支持位帶操作的地址區
位帶別名:對別名地址的訪(fǎng)問(wèn)最終作用到位帶區的訪(fǎng)問(wèn)上(這中途有一個(gè)地址映射過(guò)程)
在位帶區中,每個(gè)比特都映射到別名地址區的一個(gè)字——這是只有 LSB 有效的字。當一個(gè)別名地址被訪(fǎng)問(wèn)時(shí),會(huì )先把該地址變換成位帶地址。對于讀操作,讀取位帶地址中的一個(gè)字,再把需要的位右移到 LSB,并把 LSB 返回。對于寫(xiě)操作,把需要寫(xiě)的位左移至對應的位序號處,然后執行一個(gè)原子的“讀-改-寫(xiě)”過(guò)程。

本文引用地址:http://dyxdggzs.com/article/201611/318093.htm

支持位帶操作的兩個(gè)內存區的范圍是:

0x2_0‐0x200F_FFFF(SRAM 區中的最低 1MB)

0x4_0‐0x400F_FFFF(片上外設區中的最低 1MB)

對 SRAM 位帶區的某個(gè)比特,記它所在字節地址為 A,位序號為 n(0<=n<=7),則該比特在別名區的地址為:

AliasAddr=0x22+((A-0x20)*8+n)*4=0x22+(A-0x20)*32+n*4

對于片上外設位帶區的某個(gè)比特,記它所在字節的地址為 A,位序號為 n(0<=n<=7),則該比特在別名區的地址為:

AliasAddr=0x42+((A-0x40)*8+n)*4=0x42+(A-0x40)*32+n*4

上式中,“*4”表示一個(gè)字為 4 個(gè)字節,“*8”表示一個(gè)字節中有 8 個(gè)比特。

這里再不嫌啰嗦地舉一個(gè)例子:

1. 在地址 0x20 處寫(xiě)入 0x3355AACC

2. 讀取地址0x22008。本次讀訪(fǎng)問(wèn)將讀取 0x20,并提取比特 2,值為 1。

3. 往地址 0x22008 處寫(xiě) 0。本次操作將被映射成對地址 0x20 的“讀-改-寫(xiě)”操作(原子的),把比特2 清 0。

4. 現在再讀取 0x20,將返回 0x3355AAC8(bit[2]已清零)。

位帶別名區的字只有 LSB 有意義。另外,在訪(fǎng)問(wèn)位帶別名區時(shí),不管使用哪一種長(cháng)度的數據傳送指令(字/半字/字節),都把地址對齊到字的邊界上,否則會(huì )產(chǎn)生不可預料的結果。

/////////////////////////////////////////////////////////////////位帶操作,實(shí)現51類(lèi)似的GPIO控制功能//具體實(shí)現思想,參考<>第五章(87頁(yè)~92頁(yè)).//IO口操作宏定義#define BITBAND(addr, bitnum) ((addr & 0xF0)+0x2+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) //IO口地址映射#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    #define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    #define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 #define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 #define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 #define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 #define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 #define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 #define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 //IO口操作,只對單一的IO口!//確保n的值小于16!#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //輸出 #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //輸入 #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //輸出 #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //輸入 #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //輸出 #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //輸入 #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //輸出 #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //輸入 #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //輸出 #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //輸入#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //輸出 #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //輸入#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //輸出 #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //輸入



關(guān)鍵詞: STM32位

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>