2018-06-25 STM32中的位帶操作

????支持了位帶操作后桂肌,可以使用普通的加載/存儲(chǔ)指令來對單一的比特進(jìn)行讀寫。在 CM3 中佩耳,有兩個(gè)區(qū)中實(shí)現(xiàn)了位帶谭跨。其中一個(gè)是 SRAM 區(qū)的最低 1MB 范圍螃宙,第二個(gè)則是片內(nèi)外設(shè)區(qū)的最低 1MB范圍。這兩個(gè)區(qū)中的地址除了可以像普通的 RAM 一樣使用外挂捅,它們還都有自己的“位帶別名區(qū)”堂湖,位帶別名區(qū)把每個(gè)比特膨脹成一個(gè) 32 位的字。當(dāng)你通過位帶別名區(qū)訪問這些字時(shí)伺糠,就可以達(dá)到訪問原始比特的目的训桶。

????位帶操作的概念其實(shí) 30 年前就有了渊迁,那還是8051單片機(jī)開創(chuàng)的先河,如今琉朽,CM3 將此能力進(jìn)化箱叁,這里的位帶操作是 8051 位尋址區(qū)的威力大幅加強(qiáng)版。

????CM3 使用如下術(shù)語來表示位帶存儲(chǔ)的相關(guān)地址:

????????位帶區(qū)??? 支持位帶操作的地址區(qū)

????????位帶別名? 對別名地址的訪問最終作用到位帶區(qū)的訪問上(這中途有一個(gè)地址映射過程)

????在位帶區(qū)中耕漱,每個(gè)比特都映射到別名地址區(qū)的一個(gè)字——這是只有 LSB 有效的字螟够。當(dāng)一個(gè)別名地址被訪問時(shí),會(huì)先把該地址變換成位帶地址若河。對于讀操作寞宫,讀取位帶地址中的一個(gè)字,再把需要的位右移到 LSB辈赋,并把 LSB 返回。對于寫操作悟民,把需要寫的位左移至對應(yīng)的位序號處逾雄,然后執(zhí)行一個(gè)原子的“讀-改-寫”過程鸦泳。

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

????????0x2000_0000‐0x200F_FFFF(SRAM 區(qū)中的最低 1MB)

? ? ? ? 0x4000_0000‐0x400F_FFFF(片上外設(shè)區(qū)中的最低1MB)

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

????????AliasAddr=0x22000000+((A-0x20000000)*8+n)*4=0x22000000+(A-0x20000000)*32+n*4

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

????????AliasAddr=0x42000000+((A-0x40000000)*8+n)*4=0x42000000+(A-0x40000000)*32+n*4

????上式中姊途,“*4”表示一個(gè)字為 4 個(gè)字節(jié),“*8”表示一個(gè)字節(jié)中有 8 個(gè)比特捷兰。

????舉例:

????位帶操作的作用:

????????1立叛、GPIO的管腳單獨(dú)控制(常用,重要)

????????2贡茅、使用標(biāo)志位時(shí)簡化判斷(理解秘蛇,可以嘗試使用)

????????3其做、多任務(wù)中,用于實(shí)現(xiàn)共享資源在任務(wù)間的“互鎖”訪問(不懂)

????在C編譯器中并沒有直接支持位帶操作赁还,所以庶柿,C編譯器并不知道同一塊內(nèi)存能夠使用不同的地址來訪問,也不知道對位帶別名區(qū)的訪問只對LSB有效秽浇。欲在C中使用位帶操作,最簡單的做法就是#define一個(gè)位帶別名區(qū)的地址甚负。

????以設(shè)置GPIOA柬焕,bit2為例理解位帶操作:

????GPIOA基址?? 0x4001 0800

????端口輸入數(shù)據(jù)寄存器? 0x4001 0800+0x8=0x4001 0808

????端口輸出數(shù)據(jù)寄存器? 0x4001 0800+0xC=0x4001 080C

????輸入寄存器位帶別名

? ????????Addr=0x4200 0000+((0x40010808-0x4000 0000)*32+2*4=0x4221 0108

????輸出寄存器位帶別名

? ????????Addr=0x4200 0000+((0x4001080C-0x4000 0000)*32+2*4=0x4221 0188

#define PA2in? ((volatileunsigned long *)(0x4221 0108))

#define PA2out ((volatile unsigned long *)(0x4221 0118))

*PA2out=1;??????????????? //PA2輸出1

????為簡化位帶操作斑举,將位帶別名計(jì)算定義成一個(gè)宏:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x2000000 +

((addr & 0xFFFFF) << 5)+(bitnum << 2))

????將該地址轉(zhuǎn)化成一個(gè)指針:

#define MEM_ADDR(addr)? *((volatileunsigned long? *)(addr))

????實(shí)現(xiàn)位帶操作的宏:

#define BIT_ADDR(addr, bitnum)??MEM_ADDR(BITBAND(addr, bitnum))

????I/O口寄存器地址映射:

#define GPIOA_ODR_Addr???(GPIOA_BASE+12) //0x4001080C,PA輸出寄存器

#define GPIOA_IDR_Addr??? ?(GPIOA_BASE+8)?//0x40010808赎懦,PA輸入寄存器

????對單一I/O的操作

#define PAout(n)??BIT_ADDR(GPIOA_ODR_Addr,n)? //輸出

#define PAin(n)??? ?BIT_ADDR(GPIOA_IDR_Addr,n)? //輸入

????定義I/O口

#define LED1 PAout(2)

????則實(shí)現(xiàn)點(diǎn)亮LED只需

????LED1=1;or LED1=0当悔;

????注意:當(dāng)使用位帶功能時(shí)盲憎,要訪問的變量必須用volatile來定義。因?yàn)镃編譯器并不知道同一個(gè)比特可以有兩個(gè)地址宏多。所以就要通過volatile,使得編譯器每次都如實(shí)地把新數(shù)值寫入存儲(chǔ)器更胖,而不再會(huì)出于優(yōu)化的考慮饵逐,在中途使用寄存器來操作數(shù)據(jù)的復(fù)本,直到最后才把復(fù)本寫回——這會(huì)導(dǎo)致按不同的方式訪問同一個(gè)位會(huì)得到不一致的結(jié)果捞烟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缩幸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铃肯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挑格,死亡現(xiàn)場離奇詭異,居然都是意外死亡挫望,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蛉幸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來提陶,“玉大人隙笆,你說我怎么就攤上這事。” “怎么了洋只?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長担锤。 經(jīng)常有香客問我,道長多糠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮怜俐,結(jié)果婚禮上盾沫,老公的妹妹穿的比我還像新娘。我一直安慰自己蕾哟,他們只是感情好谭确,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布昂秃。 她就那樣靜靜地躺著,像睡著了一般蚀腿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筛谚,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼别垮。 笑死扎谎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逊移。 我是一名探鬼主播岩遗,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼红且!你這毒婦竟也來了嗤放?” 一聲冷哼從身側(cè)響起次酌,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纲辽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鬼贱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年雁佳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炸站。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阀坏,死狀恐怖盒至,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酒唉,我是刑警寧澤雹锣,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布证薇,位于F島的核電站浑度,受9級特大地震影響甩骏,放射性物質(zhì)發(fā)生泄漏饮笛。R本人自食惡果不足惜福青,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一交惯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腰耙,卻和暖如春榛丢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沟优。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工涕滋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挠阁。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓宾肺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侵俗。 傳聞我的和親對象是個(gè)殘疾皇子锨用,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容