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

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

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

STM32中的位帶(bit-band)操作

h1654155971.7688 ? 來(lái)源:未知 ? 作者:李倩 ? 2018-05-13 09:28 ? 次閱讀

支持了位帶操作后,可以使用普通的加載/存儲(chǔ)指令來(lái)對(duì)單一的比特進(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)你通過(guò)位帶別名區(qū)訪問(wèn)這些字時(shí),就可以達(dá)到訪問(wèn)原始比特的目的。

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

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

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

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

在位帶區(qū)中,每個(gè)比特都映射到別名地址區(qū)的一個(gè)字——這是只有 LSB 有效的字。當(dāng)一個(gè)別名地址被訪問(wèn)時(shí),會(huì)先把該地址變換成位帶地址。

對(duì)于讀操作,讀取位帶地址中的一個(gè)字,再把需要的位右移到 LSB,并把 LSB 返回。對(duì)于寫操作,把需要寫的位左移至對(duì)應(yīng)的位序號(hào)處,然后執(zhí)行一個(gè)原子的“讀-改-寫”過(guò)程。

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

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

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

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

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

對(duì)于片上外設(shè)位帶區(qū)的某個(gè)比特,記它所在字節(jié)的地址為 A,位序號(hào)為 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è)比特。

這里再不嫌啰嗦地舉一個(gè)例子:

1. 在地址 0x20000000 處寫入 0x3355AACC

2. 讀取地址0x22000008。本次讀訪問(wèn)將讀取 0x20000000,并提取比特 2,值為 1。

3. 往地址 0x22000008 處寫 0。本次操作將被映射成對(duì)地址 0x20000000 的“讀-改-寫”操作(原子的),把比特2 清 0。

4. 現(xiàn)在再讀取 0x20000000,將返回 0x3355AAC8(bit[2]已清零)。

位帶別名區(qū)的字只有 LSB 有意義。另外,在訪問(wèn)位帶別名區(qū)時(shí),不管使用哪一種長(zhǎng)度的數(shù)據(jù)傳送指令(字/半字/字節(jié)),都把地址對(duì)齊到字的邊界上,否則會(huì)產(chǎn)生不可預(yù)料的結(jié)果。

[cpp] view plain copy///////////////////////////////////////////////////////////////

//位帶操作,實(shí)現(xiàn)51類似的GPIO控制功能

//具體實(shí)現(xiàn)思想,參考<>第五章(87頁(yè)~92頁(yè)).

//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口操作,只對(duì)單一的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) //輸入

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

    關(guān)注

    6037

    文章

    44558

    瀏覽量

    635400
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10900

    瀏覽量

    356090

原文標(biāo)題:高手經(jīng)驗(yàn)!STM32中的位帶(bit-band)操作

文章出處:【微信號(hào):weixin21ic,微信公眾號(hào):21ic電子網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32(cortex_m3) 的 Bit-Banding 該怎樣理解?

    ) 是如何確定的?這個(gè)文檔 是 STM32 的 Firware library的 PDF文件。 Bit-Banding的意思是:對(duì)Bit-Band區(qū)一個(gè)字的操作對(duì)應(yīng)實(shí)際存儲(chǔ)器
    發(fā)表于 01-19 10:28

    STM32BIT_BAND段/)和別名區(qū)使用入門

    的影響。 三、應(yīng)用說(shuō)明 支持了操作bit_band),有兩個(gè)區(qū)實(shí)現(xiàn)了。其中一個(gè)是SR
    發(fā)表于 07-04 09:34

    STM32BIT_BAND段/)和別名區(qū)使用入門

    的影響。 三、應(yīng)用說(shuō)明 支持了操作bit_band),有兩個(gè)區(qū)實(shí)現(xiàn)了。其中一個(gè)是SR
    發(fā)表于 07-09 00:22

    別名區(qū)的關(guān)系

    別名區(qū)的關(guān)系:是指在存儲(chǔ)區(qū)可以按
    發(fā)表于 08-10 06:05

    操作原理

    (四)操作1.操作原理STM32將每個(gè)比特膨脹成為32字,訪問(wèn)這些字就實(shí)現(xiàn)了訪問(wèn)
    發(fā)表于 11-30 08:20

    操作原理詳解+LED實(shí)驗(yàn)的相關(guān)資料分享

    具有重要意義。CM3提供了2個(gè)區(qū)(Bit Band Region)以及對(duì)應(yīng)的別名區(qū)(
    發(fā)表于 12-16 07:06

    在KE04/KE06產(chǎn)品上使用Bit-band and BME的教程

    如何在KE04 and KE06產(chǎn)品上使用Bit-band and BME
    發(fā)表于 12-09 07:36

    【國(guó)民技術(shù)N32項(xiàng)目移植】N32的bit-band操作

    與輸入寄存器,使用別名區(qū)可以將單個(gè)管腳1bit的控制擴(kuò)展到32,實(shí)現(xiàn)類似PA0 = 1;代碼操作
    發(fā)表于 03-05 18:07

    關(guān)于STM32(bit-band)操作說(shuō)明

    支持了操作后,可以使用普通的加載/存儲(chǔ)指令來(lái)對(duì)單一的比特進(jìn)行讀寫。在 CM3 ,有兩個(gè)區(qū)實(shí)現(xiàn)了
    發(fā)表于 11-30 01:33 ?682次閱讀
     關(guān)于<b class='flag-5'>STM32</b><b class='flag-5'>中</b>的<b class='flag-5'>位</b><b class='flag-5'>帶</b>(<b class='flag-5'>bit-band</b>)<b class='flag-5'>操作</b>說(shuō)明

    STM32開(kāi)發(fā)操作機(jī)制

    為了像51單片機(jī)一樣能夠?qū)δ硞€(gè)管腳單獨(dú)操作,引入了操作這樣的操作機(jī)制。 如下圖,
    的頭像 發(fā)表于 04-09 14:07 ?1673次閱讀
    <b class='flag-5'>STM32</b>開(kāi)發(fā)<b class='flag-5'>中</b>的<b class='flag-5'>位</b>帶<b class='flag-5'>操作</b>機(jī)制

    STM32入門基礎(chǔ)篇(四)

    (四)操作1.操作原理STM32將每個(gè)比特膨脹成為32字,訪問(wèn)這些字就實(shí)現(xiàn)了訪問(wèn)
    發(fā)表于 11-21 18:06 ?0次下載
    <b class='flag-5'>STM32</b>入門基礎(chǔ)篇(四)

    MCU_STM32操作 -- bit banding

    操作STM32芯片除了通用的寄存器訪問(wèn),還有一個(gè)比較有意思的操作。這個(gè)位的意思,就是每
    發(fā)表于 11-26 15:21 ?6次下載
    MCU_<b class='flag-5'>STM32</b>的<b class='flag-5'>位</b>帶<b class='flag-5'>操作</b> -- <b class='flag-5'>bit</b> banding

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

    支持操作),詳情請(qǐng)參考相關(guān)內(nèi)核處理器的指南或技術(shù)參考手冊(cè)(TRM)。1、操作CPU不能直接對(duì)位區(qū)
    發(fā)表于 12-04 12:36 ?0次下載
    <b class='flag-5'>STM32</b>學(xué)習(xí)筆記:<b class='flag-5'>位</b>帶<b class='flag-5'>操作</b>(<b class='flag-5'>Bit_band</b> Operations)

    stm32--基本操作

    stm32--基本操作支持了操作后,可以使用普通的加載/存儲(chǔ)指令來(lái)對(duì)單一的比特進(jìn)行讀寫。
    發(fā)表于 01-13 14:15 ?1次下載
    <b class='flag-5'>stm32</b>--<b class='flag-5'>位</b><b class='flag-5'>帶</b>基本<b class='flag-5'>操作</b>

    stm32操作有什么用

    。 一、STM32操作的原理 別名區(qū) 在STM32微控制器
    的頭像 發(fā)表于 12-22 16:02 ?1406次閱讀