精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Cortex-M位帶操作的原理

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

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

本文主要結(jié)合Cortex-M3內(nèi)核(STM32F1)來(lái)講述,相信許多朋友在初學(xué)的時(shí)候都被繞暈過。

1、關(guān)于位帶操作

Bit-banding簡(jiǎn)稱位帶,有人也叫位段。支持位帶操作后,可以使用普通的加載/存儲(chǔ)指令來(lái)對(duì)單一的比特進(jìn)行讀寫。

很多朋友是從學(xué)習(xí)51單片機(jī)過來(lái)的,都知道P1.1這個(gè)引腳可以單獨(dú)控制,我們操作的這個(gè)引腳就是一個(gè)Bit位。

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

wKgaomUD0CCAatdkAADVwIpeqmM981.jpg

STM32F1內(nèi)核Cortex-M3早就考慮到了這個(gè)問題,為了能達(dá)到直接操作ODR1這類Bit位,就在內(nèi)核中開辟了一塊地址區(qū)域(位帶別名):可以將ODR1這類Bit位(位帶區(qū))映射到位帶別名區(qū)域?qū)?yīng)的地址,只需要操作映射后的地址,就可以實(shí)現(xiàn)操作這個(gè)ODR1位了。

簡(jiǎn)單來(lái)說(shuō)就是映射操作,只是這個(gè)映射操作有許多約定要遵循。

2、位帶操作中的映射關(guān)系

在Cortex-M3中有兩個(gè)區(qū)實(shí)現(xiàn)了位帶操作,其中一個(gè)是SRAM區(qū)的最低 1MB 范圍,第二個(gè)則是片內(nèi)外設(shè)區(qū)的最低 1MB 范圍。

這兩個(gè)區(qū)域如下圖紅色標(biāo)注的區(qū)域:

wKgZomUD0CGAHZg2AANS7rEHUY8648.jpg

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

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

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

wKgaomUD0COADc2HAAFhuboDUm8434.jpg

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

這就是所謂的“比特的膨脹對(duì)應(yīng)關(guān)系”,1Bit膨脹到32Bit(4字節(jié))。4字節(jié)對(duì)應(yīng)的就是那1Bit位的地址,而這個(gè)地址中的數(shù)據(jù)只有最低一位才有效(LSB)。

解釋上面多處出現(xiàn)的關(guān)鍵詞:位帶區(qū):支持位帶操作的地址區(qū);位帶別名:對(duì)別名地址的訪問最終作用到位帶區(qū)的訪問上;

3、位帶區(qū)->別名區(qū)計(jì)算公式

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

1.SARM區(qū)計(jì)算公式

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

2.片上外設(shè)區(qū)計(jì)算公式

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

由于映射關(guān)系一樣,所以公式原理也一樣,只是地址不一樣。計(jì)算公式需要結(jié)合上圖比特的膨脹對(duì)應(yīng)關(guān)系來(lái)理解。

*8:1個(gè)字4個(gè)字節(jié);

*4:1個(gè)字節(jié)8Bit;

4、代碼實(shí)現(xiàn)

利用上面計(jì)算公式,代碼實(shí)現(xiàn)的過程就很簡(jiǎn)單,我們的目的就是對(duì)“AliasAddr”這個(gè)地址進(jìn)行讀寫操作。

1.RAM位帶操作宏定義

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

2.外設(shè)寄存器位帶宏定義

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

方便大家對(duì)比,給一個(gè)截圖:

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.對(duì)PA1數(shù)據(jù)輸出寄存器輸出1

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

D.讀取PA1數(shù)據(jù)輸出寄存器

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

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

5、位帶操作優(yōu)缺點(diǎn)

1.優(yōu)點(diǎn)

相比直接操作寄存器代碼更簡(jiǎn)潔,運(yùn)行效率更高。避免在多任務(wù),或中斷時(shí)出現(xiàn)紊亂等。

2.缺點(diǎn)

操作不當(dāng)(傳入地址參數(shù)不對(duì)),容易出現(xiàn)總線Fault。

6、最后

關(guān)于Cortex-M3的位帶操作,更多詳情可以參看Cortex-M3技術(shù)參考手冊(cè)(權(quán)威指南)。
這后面的Cortex-M處理器已經(jīng)不再支持位帶操作了,從兼容未來(lái)軟件的角度來(lái)說(shuō),不是很建議大家再繼續(xù)使用了。

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

來(lái)源:嵌入式專欄

免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請(qǐng)聯(lián)系小編進(jìn)行處理


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16988

    瀏覽量

    350302
  • Cortex-M
    +關(guān)注

    關(guān)注

    2

    文章

    227

    瀏覽量

    29727
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    帶操作的相關(guān)資料推薦

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

    關(guān)于Cortex-M 調(diào)試應(yīng)用的介紹

    Cortex-M 調(diào)試應(yīng)用
    的頭像 發(fā)表于 07-10 00:56 ?2593次閱讀

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

    ARM? Cortex?-M原型系統(tǒng) MPS2+,為Cortex-M 系列微處理器設(shè)計(jì)的原型驗(yàn)證評(píng)估系統(tǒng),包含最新的Cortex-M7 及Corte
    的頭像 發(fā)表于 11-14 10:45 ?1859次閱讀
    米爾科技<b class='flag-5'>Cortex-M</b> Prototyping System +介紹

    快速理解STM32帶操作原理

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

    Cortex-M跑Linux操作系統(tǒng)能行嗎

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

    Cortex-M可以跑Linux操作系統(tǒng)嗎?

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

    CortexM3內(nèi)核學(xué)習(xí)筆記(二):帶操作

    概念Cortex-M3的存儲(chǔ)器系統(tǒng)支持所謂的“帶”(bit‐band)操作。通過它,實(shí)現(xiàn)了對(duì)單一比特的原子操作
    發(fā)表于 12-01 12:51 ?6次下載
    <b class='flag-5'>Cortex</b>‐<b class='flag-5'>M</b>3內(nèi)核學(xué)習(xí)筆記(二):<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>

    STM32學(xué)習(xí)筆記:帶操作(Bit_band Operations)

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

    初識(shí)“帶操作

    目錄初識(shí)“帶操作”什么是“帶操作”?STM32的“帶操作”為何會(huì)出現(xiàn)?STM32“
    發(fā)表于 01-12 17:18 ?0次下載
    初識(shí)“<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>”

    STM32帶操作-詳解-計(jì)算過程

    前言這篇文章主要用來(lái)講解STM32中的帶操作,學(xué)習(xí)過51單片機(jī)的應(yīng)改了解,在控制51單片機(jī)IO引腳時(shí),只需要向某一個(gè)IO口賦值就可以實(shí)現(xiàn),對(duì)應(yīng)IO口的輸出高或地。那么STM32可以不可以像51
    發(fā)表于 01-17 10:43 ?5次下載
    STM32<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>-詳解-計(jì)算過程

    STM32F407入門開發(fā): 帶操作

    STM32F407的帶操作可以實(shí)現(xiàn)類似51單片機(jī)中寄存器的操作方法,操作GPIO口代碼簡(jiǎn)潔方便。 關(guān)于段的
    的頭像 發(fā)表于 05-28 13:50 ?3603次閱讀
    STM32F407入門開發(fā): <b class='flag-5'>位</b><b class='flag-5'>帶操作</b>

    基于32Arm Cortex-M內(nèi)核N32系列MCU應(yīng)用

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

    詳解Cortex-M帶操作

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

    stm32帶操作有什么用

    STM32帶操作是一種在ARM Cortex-M微控制器中使用的特殊技術(shù),它允許同時(shí)處理多個(gè)位,并且可以提高代碼效率和性能。在這篇文章中,我將詳細(xì)介紹STM32
    的頭像 發(fā)表于 12-22 16:02 ?1288次閱讀