久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4285|回復: 2
打印 上一主題 下一主題
收起左側

STM32與LPC17XX中的位帶(bit-band)操作理解

[復制鏈接]
跳轉到指定樓層
樓主
        支持了位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進行讀寫。在 CM3 中,有兩個區中實現了位帶。其中一個是 SRAM 區的最低 1MB范圍,第二個則是片內外設區的最低 1MB范圍。這兩個區中的地址除了可以像普通的 RAM 一樣使用外,它們還都有自己的“位帶別名區”,位帶別名區把每個比特膨脹成一個 32 位的字。當你通過位帶別名區訪問這些字時,就可以達到訪問原始比特的目的。
       位帶操作的概念其實 30 年前就有了,那還是8051 單片機開創的先河,如今,CM3 將此能力進化,這里的位帶操作是 8051 位尋址區的威力大幅加強版。
       CM3 使用如下術語來表示位帶存儲的相關地址:
              位帶區:支持位帶操作的地址區
              位帶別名:對別名地址的訪問最終作用到位帶區的訪問上(這中途有一個地址映射過程)
       在位帶區中,每個比特都映射到別名地址區的一個字——這是只有 LSB 有效的字。當一個別名地址被訪問時,會先把該地址變換成位帶地址。對于讀操作,讀取位帶地址中的一個字,再把需要的位右移到 LSB,并把 LSB 返回。對于寫操作,把需要寫的位左移至對應的位序號處,然后執行一個原子的“讀-改-寫”過程。
讀以上描述有點累

我個人理解如下
位帶解釋
位帶處理把一寄存器的每一位轉換成寄存器(32位)。
這樣一個寄存器(32位)變成32個寄存器(32位)。
占硬件資源大。
51單片機有專門硬位區。位處理編程高效
Cortex-M3沒有專門硬位區,位處理通過軟件方法,可用轉成。
具體操作如下
       支持位帶操作的兩個內存區的范圍是:
              0x2000_0000‐0x200F_FFFF(SRAM 區中的最低 1MB)
              0x4000_0000‐0x400F_FFFF(片上外設區中的最低 1MB)
       對 SRAM 位帶區的某個比特,記它所在字節地址為 A,位序號為 n(0<=n<=7),則該比特在別名區的地址為:
           
   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 個比特。
       這里再不嫌啰嗦地舉一個例子:
       1. 在地址 0x20000000 處寫入 0x3355AACC
       2. 讀取地址0x22000008。本次讀訪問將讀取 0x20000000,并提取比特 2,值為 1。
       3. 往地址 0x22000008 處寫 0。本次操作將被映射成對地址 0x20000000 的“讀-改-寫”操作(原子的),把比特2 清 0。
       4. 現在再讀取 0x20000000,將返回 0x3355AAC8(bit[2]已清零)。
       位帶別名區的字只有 LSB 有意義。另外,在訪問位帶別名區時,不管使用哪一種長度的數據傳送指令(字/半字/字節),都把地址對齊到字的邊界上,否則會產生不可預料的結果。
///////////////////////////////////////////////////////////////
//位帶操作,實現51類似的GPIO控制功能
//具體實現思想,參考<<CM3權威指南>>第五章(87頁~92頁).
//IO口操作宏定義
#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))
//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)  //輸入

以上方法可移植到LPC17xx。只是地址不同。

完整的Word格式文檔51黑下載地址:
STM32與LPC17XX中的位帶理解.zip (165.87 KB, 下載次數: 14)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:128531 發表于 2018-10-20 22:47 | 只看該作者
寫的很好
回復

使用道具 舉報

板凳
ID:417138 發表于 2018-10-29 13:56 | 只看該作者
thanks for sharing!!!!!!!!!!!!!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久久久久 | 久久精品在线 | 欧美日韩国产三级 | 中文字幕专区 | 国产精品18毛片一区二区 | 天天干天天干 | 亚洲第一视频网 | 久久视频精品 | 殴美黄色录像 | 精品久久久久久久久久久下田 | 日韩一区二区三区在线 | 精品少妇一区二区三区日产乱码 | 91免费在线视频 | 华丽的挑战在线观看 | 91高清视频在线观看 | 国产专区视频 | 黄视频免费 | 欧美视频第二页 | 国产精品a久久久久 | 久久久国产亚洲精品 | 在线成人免费视频 | 国产精品九九视频 | 久久综合狠狠综合久久综合88 | 国产在线一区二区三区 | 国产精品一区2区 | 国户精品久久久久久久久久久不卡 | 日本a视频 | 亚洲欧美激情国产综合久久久 | 大久| 日韩成人免费视频 | 日韩综合| 男女爱爱网站 | 国产精品久久久久久中文字 | 毛片免费看 | k8久久久一区二区三区 | www.黄色网 | 久久精品国产99国产 | 国产精品亚洲一区二区三区在线观看 | 欧美午夜精品 | 国产午夜在线观看 | www成年人视频 |