那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Cortex-M位帶操作的原理

jf_pJlTbmA9 ? 來源:嵌入式專欄 ? 作者:嵌入式專欄 ? 2023-10-24 15:27 ? 次閱讀

位帶操作可能現在用的比較少了,但在以前MCU性能不是很好的時候,位帶操作卻是眾多軟件工程師常用操作。

本文主要結合Cortex-M3內核(STM32F1)來講述,相信許多朋友在初學的時候都被繞暈過。

1、關于位帶操作

Bit-banding簡稱位帶,有人也叫位段。支持位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進行讀寫。

很多朋友是從學習51單片機過來的,都知道P1.1這個引腳可以單獨控制,我們操作的這個引腳就是一個Bit位。

我們都知道在STM32中不能直接操作寄存器的某一個Bit位,比如單獨控制PA端口輸出數據寄存器中的ODR1,如下圖:

wKgaomUD0CCAatdkAADVwIpeqmM981.jpg

STM32F1內核Cortex-M3早就考慮到了這個問題,為了能達到直接操作ODR1這類Bit位,就在內核中開辟了一塊地址區域(位帶別名):可以將ODR1這類Bit位(位帶區)映射到位帶別名區域對應的地址,只需要操作映射后的地址,就可以實現操作這個ODR1位了。

簡單來說就是映射操作,只是這個映射操作有許多約定要遵循。

2、位帶操作中的映射關系

在Cortex-M3中有兩個區實現了位帶操作,其中一個是SRAM區的最低 1MB 范圍,第二個則是片內外設區的最低 1MB 范圍。

這兩個區域如下圖紅色標注的區域:

wKgZomUD0CGAHZg2AANS7rEHUY8648.jpg

這兩個1MB將分別映射到另外兩個地址區域:1.SRAM區的最低1MB(0x2000 0000 --- 0x200F FFFF) 映射到(0x2200 0000 --- 0x23FF FFFF)。

2.片內外設區的最低1MB(0x4000 0000 --- 0x400F FFFF)映射到(0x4200 0000 --- 0x43FF FFFF)。

其實就是映射到偏移(距離自身)0x0200 0000外的32MB空間(位帶別名區),如下圖SRAM區映射關系:

wKgaomUD0COADc2HAAFhuboDUm8434.jpg

提示:看圖中的有顏色的8Bit,它是映射到偏移0x0200 0000外的32Bit(4Byte)空間上。我們讀寫0x2200 0000這個地址,其實就是操作0x2000 0000中的Bit0位。

這就是所謂的“比特的膨脹對應關系”,1Bit膨脹到32Bit(4字節)。4字節對應的就是那1Bit位的地址,而這個地址中的數據只有最低一位才有效(LSB)。

解釋上面多處出現的關鍵詞:位帶區:支持位帶操作的地址區;位帶別名:對別名地址的訪問最終作用到位帶區的訪問上;

3、位帶區->別名區計算公式

位帶操作的主要目的:通過Bit位地址(A)計算得到別名區地址(AliasAddr)。

1.SARM區計算公式

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

2.片上外設區計算公式

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

由于映射關系一樣,所以公式原理也一樣,只是地址不一樣。計算公式需要結合上圖比特的膨脹對應關系來理解。

*8:1個字4個字節;

*4:1個字節8Bit;

4、代碼實現

利用上面計算公式,代碼實現的過程就很簡單,我們的目的就是對“AliasAddr”這個地址進行讀寫操作。

1.RAM位帶操作宏定義

#defineBITBAND_RAM(RAM,BIT)(*((uint32_tvolatile*)(0x22000000u+(((uint32_t) (RAM)-(uint32_t)0x20000000u)<<5)?+?(((uint32_t)(BIT))<<2))))

2.外設寄存器位帶宏定義

#defineBITBAND_REG(REG,BIT)(*((uint32_tvolatile*)(0x42000000u+(((uint32_t) (REG)-(uint32_t)0x40000000u)<<5)?+?(((uint32_t)(BIT))<<2))))

方便大家對比,給一個截圖:

wKgZomUD0CSAPC5HAABTyofqEWI711.png

A.RAM地址0x20001000的Bit1位寫0

BITBAND_RAM(*(uint32_t*)0x20001000,1)=0;

B.讀取RAM地址0x20001000的Bit1位

uint8_tVal;Val=BITBAND_RAM(*(uint32_t*)0x20001000,1);

C.對PA1數據輸出寄存器輸出1

BITBAND_REG(GPIOA->ODR,1)=1;

D.讀取PA1數據輸出寄存器

uint8_tVal;Val=BITBAND_REG(GPIOA->ODR,1);

這里就是操作某一個地址,類似于操作指針一樣;

5、位帶操作優缺點

1.優點

相比直接操作寄存器代碼更簡潔,運行效率更高。避免在多任務,或中斷時出現紊亂等。

2.缺點

操作不當(傳入地址參數不對),容易出現總線Fault。

6、最后

關于Cortex-M3的位帶操作,更多詳情可以參看Cortex-M3技術參考手冊(權威指南)。
這后面的Cortex-M處理器已經不再支持位帶操作了,從兼容未來軟件的角度來說,不是很建議大家再繼續使用了。

只是位帶操作是一種經典,這里分享給大家了解一下,希望對你們有幫助。

來源:嵌入式專欄

免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理


審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17317

    瀏覽量

    352622
  • Cortex-M
    +關注

    關注

    2

    文章

    229

    瀏覽量

    29841
收藏 人收藏

    評論

    相關推薦

    如何選擇正確的Cortex-M處理器?

    Cortex-M4的SIMD操作可以并行處理兩個16數據和4個8數據。例如,圖4展示的QADD8 和 QADD16 操作:表 4: 指
    發表于 10-22 08:16

    帶操作的相關資料推薦

    注意:本文中關于STM32的帶操作原理只適用于Cortex-M3和Cortex-M4(F)內核處理器,Cortex-M系列的其他內核處理器
    發表于 02-07 09:24

    關于Cortex-M 調試應用的介紹

    Cortex-M 調試應用
    的頭像 發表于 07-10 00:56 ?2663次閱讀

    米爾科技Cortex-M Prototyping System +介紹

    ARM? Cortex?-M原型系統 MPS2+,為Cortex-M 系列微處理器設計的原型驗證評估系統,包含最新的Cortex-M7 及Corte
    的頭像 發表于 11-14 10:45 ?1982次閱讀
    米爾科技<b class='flag-5'>Cortex-M</b> Prototyping System +介紹

    快速理解STM32帶操作原理

    作者:strongerHuang 說到位帶操作,可能很多人比較陌生,但說到控制IO,你肯定不會陌生。有的項目為了最大效率控制IO,使用帶操作。下面就來簡單說說未帶操作的內容。 一、初
    的頭像 發表于 09-03 15:40 ?4795次閱讀
    快速理解STM32<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>原理

    Cortex-M跑Linux操作系統能行嗎

    單片機、Cortex-M、Linux它們和嵌入式有什么區別? 跑 Linux 操作系統需要什么處理器?ARM9、ARM11? Cortex-M比ARM9更新,為什么不能跑Linux? 相信很多小伙伴
    的頭像 發表于 07-19 09:35 ?1984次閱讀
    <b class='flag-5'>Cortex-M</b>跑Linux<b class='flag-5'>操作</b>系統能行嗎

    Cortex-M可以跑Linux操作系統嗎?

    Cortex-M可以跑Linux操作系統嗎?
    發表于 12-01 11:36 ?2次下載
    <b class='flag-5'>Cortex-M</b>可以跑Linux<b class='flag-5'>操作</b>系統嗎?

    CortexM3內核學習筆記(二):帶操作

    概念Cortex-M3的存儲器系統支持所謂的“帶”(bit‐band)操作。通過它,實現了對單一比特的原子操作
    發表于 12-01 12:51 ?6次下載
    <b class='flag-5'>Cortex</b>‐<b class='flag-5'>M</b>3內核學習筆記(二):<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>

    STM32學習筆記:帶操作(Bit_band Operations)

    注意:本文中關于STM32的帶操作原理只適用于Cortex-M3和Cortex-M4(F)內核處理器,Cortex-M系列的其他內核處理器
    發表于 12-04 12:36 ?0次下載
    STM32學習筆記:<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>(Bit_band Operations)

    初識“帶操作

    目錄初識“帶操作”什么是“帶操作”?STM32的“帶操作”為何會出現?STM32“
    發表于 01-12 17:18 ?0次下載
    初識“<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>”

    STM32帶操作-詳解-計算過程

    前言這篇文章主要用來講解STM32中的帶操作,學習過51單片機的應改了解,在控制51單片機IO引腳時,只需要向某一個IO口賦值就可以實現,對應IO口的輸出高或地。那么STM32可以不可以像51
    發表于 01-17 10:43 ?5次下載
    STM32<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>-詳解-計算過程

    STM32F407入門開發: 帶操作

    STM32F407的帶操作可以實現類似51單片機中寄存器的操作方法,操作GPIO口代碼簡潔方便。 關于段的
    的頭像 發表于 05-28 13:50 ?3728次閱讀
    STM32F407入門開發: <b class='flag-5'>位</b><b class='flag-5'>帶操作</b>

    基于32Arm Cortex-M內核N32系列MCU應用

    國民技術N32系列MCU產品基于32Arm Cortex-M內核,內置嵌入式高速閃存、低功耗電源管理,集成數模混合電路,并內置硬件密碼算法加速引擎以及安全單元。
    發表于 03-28 11:35 ?983次閱讀

    詳解Cortex-M帶操作

    的第一個IO口進行上下拉操作,然而對于STM32,是沒有這種操作的,那么為了像51單片機一樣能夠單獨的對某個端的某一個IO單獨操作,就引入了__
    的頭像 發表于 04-27 15:03 ?5155次閱讀
    詳解<b class='flag-5'>Cortex-M</b><b class='flag-5'>位</b><b class='flag-5'>帶操作</b>

    stm32帶操作有什么用

    STM32帶操作是一種在ARM Cortex-M微控制器中使用的特殊技術,它允許同時處理多個位,并且可以提高代碼效率和性能。在這篇文章中,我將詳細介紹STM32
    的頭像 發表于 12-22 16:02 ?1520次閱讀
    禄丰县| 百家乐技巧下载| 百家乐分路单析器| 百家乐技巧娱乐博彩| 百家乐庄闲几率| 百家乐赌法| 百家乐玄机| 大赢家百家乐娱乐| 大发888为什么卡| bet365备用器| 峨眉山市| 百家乐官网1个人| 时时博百家乐官网的玩法技巧和规则| 金赞百家乐官网的玩法技巧和规则| 劳力士百家乐官网的玩法技巧和规则 | 澳门百家乐赌| 大发888娱乐官方网站| 永利娱乐城提款| 百家乐官网机器二手| 视频百家乐官网赢钱| 天堂鸟百家乐官网的玩法技巧和规则| 百家乐官网平注法到65688| 澳门百家乐网上赌| 威尼斯人娱乐城优惠条件| 凯旋门娱乐城开户网址| 百家乐官网要怎么玩啊| 百家乐官网博娱乐网赌百家乐官网的玩法技巧和规则 | 无为县| 百家乐官网特殊技巧| 温州百家乐真人网| 百家乐怎样玩才会赢钱| 海立方百利宫娱乐城| 百家乐官网的弱点| 电投百家乐网站| 365棋牌游戏| 百家乐官网赌博是否违法| 百家乐官网送钱平台| 富二代百家乐的玩法技巧和规则| 喜来登娱乐城| 百家乐官网的出牌技巧| 百家乐baccarat|