国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Cortex-M3位帶地址映射技術(shù)的位帶操作研究與實(shí)現(xiàn)

2020-11-13 08:20李國強(qiáng)
關(guān)鍵詞:外設(shè)存儲器字節(jié)

李國強(qiáng)

(安徽華東中投科技有限公司,安徽 合肥 230000)

在當(dāng)今的計算機(jī)控制領(lǐng)域中,許多智能控制產(chǎn)品都使用了基于Cortex-M3內(nèi)核的Arm處理器。在這里,主要針對Arm處理器內(nèi)核Cortex-M3存儲器支持的“bit-band”位帶,對位帶地址映射技術(shù)進(jìn)行研究以及如何實(shí)現(xiàn)位帶操作。

一、 Cortex-m3的位帶區(qū)與位帶別名區(qū)

Cortex-M3是Arm處理器內(nèi)核,可支持4GB存儲空間,Cortex-M3內(nèi)核是通過ICode、DCode、System總線與STM32內(nèi)部的Flash、SROM相連接的,Cortex-M3存儲器支持“bit-band”位帶。在Cortex-M3存儲器中有二個 1MB的位帶區(qū),以及對應(yīng)的32MB的“位帶別名(alias)區(qū)” 。位帶別名區(qū)可以把每個位(bit)擴(kuò)展成一個32位的字。當(dāng)通過位帶別名區(qū)訪問這些字時,就可以達(dá)到訪問原來位的目的,如圖1所示。

在SRAM區(qū)的底部,有一個 1MB的位帶區(qū),這個位帶區(qū)還有一個對應(yīng)的32MB的“位帶別名(alias)區(qū)”,容納了8M個“位變量”,每個位變量是32位(既1個字4個字節(jié))。位帶區(qū)對應(yīng)的是最低的1MB地址范圍,而位帶別名區(qū)里面的每個字對應(yīng)位帶區(qū)的一個bit位。位帶操作只適用于數(shù)據(jù)訪問,不適用于取指。

圖1 位帶區(qū)與位帶別名區(qū)示意圖

在片上外設(shè)區(qū)的底部,也有一個1MB的位帶區(qū),并有一個與其對應(yīng)的32MB的位帶別名區(qū),用于快捷訪問外設(shè)寄存器。這樣,就使得我們訪問各種控制位和狀態(tài)位,就像訪問普通內(nèi)存一樣方便。

二、Cortex-m3的位帶地址映射

存儲器映射是指把芯片中或芯片外的FLASH、RAM以及外設(shè)等進(jìn)行了統(tǒng)一編址,即用地址來表示對象。Cortex-M3存儲器的4G地址空間被劃分為大小相等的8塊區(qū)域,每塊區(qū)域大小為512M。

這里劃分的8塊區(qū)域是粗線條的,主要包括代碼、SRAM、外設(shè)、外部RAM、外部設(shè)備、專用外設(shè)總線-內(nèi)部、專用外設(shè)總線-外部、特定廠商等。只要芯片制造商能按照Cortex-M3存儲器的結(jié)構(gòu)進(jìn)行各自芯片的存儲器結(jié)構(gòu)設(shè)計,就允許芯片制造商靈活的分配存儲器空間,以制造出各具特色的基于Cortex-M3的芯片。Cortex-M3存儲器映射有2個32MB的位帶別名區(qū),這2個區(qū)被映射為2個1MB的位帶區(qū)。

(一) SRAM區(qū)的位帶地址映射關(guān)系分析

SRAM區(qū)的位帶地址從地址0x20000000開始的1MB位帶區(qū),其對應(yīng)的位帶別名區(qū)的地址是從0x22000000開始的32MB。對32MB SRAM位帶別名區(qū)的訪問,映射為對1MB SRAM位帶區(qū)的訪問。

假設(shè)SRAM位帶區(qū)的某個位(bit),此位的所在字節(jié)地址記為A,位序號為n(n的值為0—7),則該位在位帶別名區(qū)的地址為:

上式中的“*4”表示一個字為4個字節(jié),“*8”表示一個字節(jié)有8個bit(位)。對于SRAM區(qū)中,位帶地址映射關(guān)系,如表1所示。

表1 SRAM區(qū)中的位帶地址映射關(guān)系表

例如:已在地址0x20000000中寫入了0x12345678,現(xiàn)要求對bit2位置1。過程如下:

首先讀取位帶別名地址0x22000008。這次讀訪問將會讀取位帶地址0x20000000,并提取bit2位,其值為0;

然后往地址0x22000008處寫1。這次操作將會被映射成對地址0x20000000的“讀-改-寫”操作,把bit2位置1。

最后我們再讀取地址0x20000000,讀到的數(shù)據(jù)是0x1234567C,bit2位已置1了。

(二) 片上外設(shè)區(qū)的位帶地址映射關(guān)系分析

片上外設(shè)區(qū)的位帶地址從地址0x40000000開始的1MB位帶區(qū),其對應(yīng)的位帶別名區(qū)的地址是從0x42000000開始的32MB。對32MB外設(shè)位帶別名區(qū)的訪問,映射為對1MB外設(shè)位帶區(qū)的訪問。

同樣假設(shè)片上外設(shè)位帶區(qū)的某個位(bit),此位的所在字節(jié)地址也記為A,位序號為 n(n的值為0—7),則該位在位帶別名區(qū)的地址為:

上式中的“*4”表示一個字為4個字節(jié),“*8”表示一個字節(jié)有8個bit(位)。對于片上外設(shè)區(qū)中,位帶地址映射關(guān)系,如表2所示。

表2 片上外設(shè)區(qū)中的位帶地址映射關(guān)系表

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

三、位帶操作實(shí)現(xiàn)

(一) 位帶地址轉(zhuǎn)換的宏

在C語言中使用位帶操作,最簡單的做法就是使用define宏定義一個位帶別名區(qū)的地址??梢韵冉⒁粋€把“位帶地址+位序號”轉(zhuǎn)換成別名地址的宏,然后再建立一個把別名地址轉(zhuǎn)換成指針類型的宏。

1.建立一個把“位帶地址+位序號”轉(zhuǎn)換成位帶別名地址的宏,宏定義代碼如下:

參考前面介紹的轉(zhuǎn)換公式,完成“位帶地址+位序號”轉(zhuǎn)換成位帶別名地址的計算,宏定義代碼說明如下:

2.建立一個把別名地址轉(zhuǎn)換成指針類型的宏,宏定義代碼如下:

由于C編譯器并不知道同一個bitn位可以有兩個地址,所以要使用這個volatile關(guān)鍵字。這樣,就能確保本條指令不會因編譯器的優(yōu)化而被省略,每次都能如實(shí)的把新數(shù)值寫入存儲器中。

(二)IO口位帶操作的宏定義

采用逐層地址映射方式,對IO口位帶操作進(jìn)行宏定義,可以實(shí)現(xiàn)IO口的輸入輸出讀取和控制。

1.對外設(shè)基地址和APB2外設(shè)基地址映射宏定義,宏定義代碼如下:

2.對片上外設(shè)區(qū)的外設(shè)基地址都進(jìn)行了宏定義,如ADCn、DAC、TIMn、USARn以及GPIOx等。在這里主要闡述GPIOx外設(shè)基地址宏定義,宏定義代碼如下:

3.對GPIOx口ODR和IDR寄存器地址映射進(jìn)行了宏定義,宏定義代碼如下:

(4)GPIOA口的輸入輸出宏定義,宏定義代碼如下:

其中n的取值范圍是0~15,GPIOA_ODR_Addr和GPIOA_IDR_Addr是GPIOA口的寄存器ODR和IDR在片上外設(shè)區(qū)的位帶地址。其他的GPIOB—GPIOG口的輸入輸出宏定義以此類推。

四、結(jié)語

在基于Cortex-M3位帶地址映射技術(shù)的位帶操作研究基礎(chǔ)上,對Arm處理器的IO引腳操作就更加方便了。比如,若在PA8引腳輸出一個“1”,代碼如下:

這樣的操作,就像51單片機(jī)操作一樣方便。又如,若讀PD15引腳上所接按鍵的狀態(tài),代碼如下:

由此可以看出,通過Cortex-M3位帶地址映射技術(shù)的研究,位帶操作非常容易的實(shí)現(xiàn)Arm處理器的IO引腳位操作,就不需要使用Cortex-m3的固件庫GPIO_SetBits ()和GPIO_ResetBits ()函數(shù),或者使用GPIO口相關(guān)寄存器去實(shí)現(xiàn)了。

猜你喜歡
外設(shè)存儲器字節(jié)
No.8 字節(jié)跳動將推出獨(dú)立出口電商APP
靜態(tài)隨機(jī)存儲器在軌自檢算法
No.10 “字節(jié)跳動手機(jī)”要來了?
存儲器——安格爾(墨西哥)▲
人類進(jìn)入“澤它時代”
外設(shè)天地行情
外設(shè)天地行情
外設(shè)天地行情
Buffalo推出四硬盤網(wǎng)絡(luò)存儲器 主打Soho一族
外設(shè)天地行情