色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

快速理解STM32位帶操作原理

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2020-09-03 15:40 ? 次閱讀
作者:strongerHuang

說到位帶操作,可能很多人比較陌生,但說到控制IO,你肯定不會陌生。有的項目為了最大效率控制IO,使用位帶操作。下面就來簡單說說未帶操作的內容。

一、初識位帶操作

Bit-banding簡稱位帶,有人也叫位段。支持位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進行讀寫。很多朋友是從學習51單片機過來的,都知道P1.1這個引腳可以單獨控制,我們操作的這個引腳就是一個Bit位。我們都知道在STM32中不能直接操作寄存器的某一個Bit位,比如單獨控制PA端口輸出數據寄存器中的ODR1,如下圖:

STM32F1內核Cortex-M3早就考慮到了這個問題,為了能達到直接操作ODR1這類Bit位,就在內核中開辟了一塊地址區域(位帶別名):可以將ODR1這類Bit位(位帶區)映射到位帶別名區域對應的地址,只需要操作映射后的地址,就可以實現操作這個ODR1位了。簡單來說就是映射操作,只是這個映射操作有許多約定要遵循。二、位帶操作中的映射關系在Cortex-M3中有兩個區實現了位帶操作,其中一個是SRAM區的最低 1MB 范圍,第二個則是片內外設區的最低 1MB 范圍。這兩個區域如下圖紅色標注的區域:

這兩個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區映射關系:

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

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

解釋上面多處出現的關鍵詞

位帶區:支持位帶操作的地址區;

位帶別名:對別名地址的訪問最終作用到位帶區的訪問上;

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

位帶操作的主要目的:通過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;

四、代碼實現

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

1.RAM位帶操作宏定義

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

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

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

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

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

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

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

uint8_t Val;

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

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

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

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

uint8_t Val;

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

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

五、位帶操作優缺點

1.優點

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

2.缺點

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

六、說明

關于Cortex-M3的位帶操作,詳情可以參看Cortex-M3技術參考手冊(權威指南)。 我了解Cortex-M處理器中,Cortex-M3、Cortex-M4都具有位帶操作,Cortex-M0,Cortex-M+好像不支持。具體可以下載相關的技術參考手冊查看。 原文標題:快速理解STM32位帶操作原理和用途

文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。


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

    關注

    2270

    文章

    10895

    瀏覽量

    355743

原文標題:快速理解STM32位帶操作原理和用途

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    STM32 OLED多菜單操作

    stm32 ?oled多菜單操作
    發表于 10-09 11:01 ?2次下載

    STM32G4系列到底支不支持帶操作

    印象中不止一次有人詢問STM32G4系列到底支不支持帶操作
    的頭像 發表于 07-29 09:45 ?1502次閱讀
    <b class='flag-5'>STM32</b>G4系列到底支不支持<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>

    STM32H743系列支持帶操作嗎?

    //IO口操作宏定義 define BITBAND(addr, bitnum) ((addr0xF0000000)+0x2000000+((addr0xFFFFF)<<5
    發表于 07-23 08:13

    大語言模型(LLM)快速理解

    自2022年,ChatGPT發布之后,大語言模型(LargeLanguageModel),簡稱LLM掀起了一波狂潮。作為學習理解LLM的開始,先來整體理解一下大語言模型。一、發展歷史大語言模型的發展
    的頭像 發表于 06-04 08:27 ?961次閱讀
    大語言模型(LLM)<b class='flag-5'>快速</b><b class='flag-5'>理解</b>

    關于帶操作的疑問求解

    大家都知道,帶有對應的帶別名區,操作帶別名區就可以寫帶區的BIT,讀取帶BIT值到內部
    發表于 05-17 07:33

    請問stm8s IO操作如何實現?

    請教各位了,stm8s IO操作如何實現像stm32類似的帶操作啊? #define LEDPAout(0), LED = 1; LED
    發表于 05-09 07:10

    stm32 HAL訪問一個PCIE_SW芯片,偏移地址寬怎么快速適配?

    現在想用stm32 HAL訪問一個PCIE_SW芯片,但是該芯片的偏移地址寬為32,HAL的i2c協議棧的偏移地址寬為8或者16
    發表于 04-22 06:41

    STM32F103RGT6帶操作不成功的原因?

    各位大神,我是一個入門級的超級菜鳥,遇到一個問題: 為啥子我同樣的帶操作STM32F103C8T6上操作成功,但是在STM32F103R
    發表于 04-19 06:32

    stm32F4 64變量操作異常怎么解決?

    stm32F4 64變量使用報錯解決
    發表于 04-02 07:16

    STM32關于FLASH的編程對齊錯誤標志(PGAERR)的疑問求解

    描述:不允許針對 Flash 執行跨越 128 行界限的數據編程操作。如果出現這種情況,寫操作將不會執行,并且 FLASH_SR 寄存器中的編程對齊錯誤標志 (PGAERR) 將置
    發表于 03-22 07:59

    對于STM32G4系列的MCU,其GPIO的操作是否還支持帶操作

    STM32G4的memory map。GPIO是掛在AHB2總線上的。 但是手冊里面沒有明確找到,其別名區的起始地址。
    發表于 03-21 07:34

    STM32G4XX不能夠像STM32F1XX STM32F4XX那樣對GPIO進行帶操作呢?

    請教下,在STM32G4XX系列里面,GPIO掛載在AHB2總線上面,地址在0x4800 0000. 是不是也就意味著,STM32G4XX不能夠在像STM32F1XX STM32F4X
    發表于 03-21 07:16

    如何快速解決轉爐軸承磨損問題

    電子發燒友網站提供《如何快速解決轉爐軸承磨損問題.docx》資料免費下載
    發表于 03-11 16:01 ?0次下載

    STM32開發中的運算以及帶操作

    STM32開發中的運算以及帶操作? 運算是計算機中常用的一種操作方式,特別適用于對數據的單
    的頭像 發表于 02-02 14:38 ?1615次閱讀

    plc中的置和復位怎么理解

    和復位通常用于控制PLC的狀態,例如控制電機的啟停、開關的開關狀態、指示燈的亮滅等。通過適當地使用置和復位操作,可以實現復雜的控制邏輯,確保設備運行或系統操作的正確性。
    的頭像 發表于 01-16 17:20 ?1.3w次閱讀
    主站蜘蛛池模板: 国产精品日本不卡一区二区| 亚洲欧美视频在线| 蜜桃成熟时2在线观看完整版hd| 精品国产精品人妻久久无码五月天 | 色噜噜狠狠一区二区三区| 香港日本三级亚洲三级| 无限资源在线完整高清观看1| 色欲色香天天天综合| 无限资源在线观看高清| 中文无码第3页不卡av| 中文字幕无线观看不卡网站 | 99久久久久国产精品免费| 99国内精品久久久久久久清纯| 最新2017年韩国伦理片在线| 52色擼99热99| 国产精品嫩草久久久久| 恋夜影视列表免费安卓手机版| 摸老师丝袜小内内摸出水| 无码专区久久综合久综合字幕| 欲香欲色天天影视大全| 99久久免费热在线精品| 国产揄拍国产精品| 久久久久毛片免费观看| 男人插曲女人的视频| 性夜影院午夜看片| xxx日本hd| 国产精品久久久久婷婷五月色婷婷 | 久久亚洲黄色| 偷上邻居熟睡少妇| 91精品国产高清久久久久久| VIDEOSGGRATIS欧美另类| 精品高清国产a毛片| 色大姐综合网| 99RE6国产精品视频播放| 果冻传媒在线观看视频| 露露的性战k8经典| 亚洲AV成人无码网天堂| 白丝美女被狂躁免费漫画| 久久亚洲国产精品亚洲| 亚洲欧美日韩人成| 国产成人精品综合在线|