1、MCU寻址方式及Bank概念学习*学习内容:1:Xdata / MCU寻址范围2:Bank的概念,Common Bank / Bank0 / Bank1 / Bank2 / Bank33:Bank X Data OverFlow / 移Bank4:Flash存放DATA的方式 20111008*一: Xdata / MCU 寻址范围1:在Keil C软体中,点Help - U Vision Help,搜索Xdata,可得到以下内容:Xdata表示的是外部数据(MCU外部),它可以寻址的空间最大为64K byte.我们的MCU为51内核的8 bit的MCU,地址总线一般为8bit ,最大可寻址的
2、空间为256 bytes,很小,可是,51的MCU,有两路地址总线是可以搭配来当作16 bit的地址总线来使用,它可以寻址的空间大小为64K byte。我们用到的xdata即是用的16bit的地址总线来寻址的。在大学里学的89S51是P0.0P0.7与P2.0P2.7地址总线共用,如下所示: 二:Bank的概念,Common Bank / Bank0 / Bank1 / Bank2 / Bank3 MCU支持的最大寻址空间为64K byte,如果CODE过大,超过64K byte,MCU怎么寻址呢? 标准的8051内核的MCU,支持 Bank功能,最大支持32个Bank ,最大2M bytes
3、的寻址空间。注意:我们常用的2M Flash ,的单位是bit。64K bytes的单位是 byte。即 : 2M Bit = 4 x 64K bytes,所以,2M的FLSAH,只需要用4个BANK就OK。在Keil C软体中,点Help - U Vision Help,搜索Bank,找到左侧中的code banking可得到以下内容:放大右侧的BANK描述图:由上图可得:一个Bank又被拆分为Common Bank和 Bank X两个部份。其中,每个Bank都会有Common Bank ,并且,每个Bank中的Common Bank的Data都是一模一样的。由上图可知,一个Bank的存储范
4、围为 0x00000xFFFF,为64 K Byte其中,0x00000x7FFF为Common Bank的范围,0x80000xFFFF为各个BankX的数据存储范围。在CODE调用时,Common区的Data与Bank X区中的Data可以任意调用,可是,各个Bank X区的Data之间的多次调用,经常会有很奇怪的现象出现,比如OSD乱码,画异等等。所以,不建议各个Bank X之间进行数据的直接多次调用。怎样看软体中设定的Common Bank的大小及文件是属于哪个Bank?1:查看Common Bank 的大小 以Lenovo_Li2361D的机种CODE为例,在keil C中,点击Op
5、tions for Target选项,在出现的对话框中,打开target选项,可以看到,Bank X Area 是从0x30000xFFFF,可知,Common Bank是从0x00000x2FFF(注意,Common Bank的大小在改动时,需要考虑到后面的Bank X的数据长度,在64K byte空间固定的前提下,增大了Common Bank的长度,等于间接减少了Bank X的长度)。二:查看文件是属于哪个Bank 软体中的每一个.C / .H文件都会定义好它是属于哪个Bank,以此来规划各个文件之前的参数及函数的调用。 以Lenovo_Li2361D的机种CODE为例,在keil C中,
6、点击Project文件夹,右键Options for Group Project: ,在出现的对话框中,我们可以看到:表示Project这个文件夹中的文件在默认下,都是存放在Bank 中的Common Bank区。 当我们展开Project这个文件夹,右键到RTD2743PD_TPV_LENOVO_LI2361D_LG_LM230WF8.h文件,打开对话框。可以看到,RTD2743PD_TPV_LENOVO_LI2361D_LG_LM230WF8.h这个文件的Code Bank = ,表示它的存放位置是与它的上一层文件夹的存放位置相同,即,也存放在Common Bank .也会有另外一种情况:
7、子文件与上层文件夹的数据存放位置不相同 ,如下所示:右键Scaler,属性,可以知道,Scaler文件夹中的文件存放位置为Bank 0,表示在默认情况下,子文件夹中的文件存放位置也是在Bank 0。 可是,我们在图的左侧可以看到,Scaler文件夹下,有些文件名前面会有三个竖排的红点,有些文件名前面没有三个竖排的红点。 当我们右键任意一个带竖排红点的文件,属性时,可以发现,它的存放位置,与上层文件夹是不同Bank的。 右键Scaler文件夹下的Adjust.c文件,属性,可以看到,它的存放位置为Bank 3 ,与Scaler文件的Bank 0并不相同。 当我们右键任意一个不带竖排红点的文件,属
8、性时,可以发现,它的存放位置为,表示它的存放位置与Scaler文件夹相同,也为Bank 0 Realtek的Keil C的各个文件及文件夹的Bank属性规划,是按功能相近原则来存放 ,与Mstar的Bank相同的存放原则不同。3:Bank X Data OverFlow / 移Bank在Keil C中,点击Options for Target LENOVO_LI2361D_LG_LM230WF8,打开对话框,在Bl51 Locate中,可以看到,在编译完成后,会output LENOVO_LI2361D_RTD2743PD_LG_LM230WF8.m51 这个文件,使用它可以查看我们Commo
9、n的大小使用了多少,及各个Bank X使用的情况生成的文件如右所示: 打开后,可以看到,CODE MEMORY的最大范围为0x2BC4+8=0x2BCC,在前面的查看Common Bank 的大小,我们可以知道,设定的Common bank的大小为0x00000x2FFF,所以,Common Bank未溢出。Bank0的最大范围为0xE0ED+1=0xE0EE。Bank1的最大范围为0xBBF5+0x0133=0xBD28。Bank2的最大范围为0xF946+1=0xF947。Bank3的最大范围为0xAEDE+1=0xAEDF。Bank0Bank3的最大范围,都未超过0xFFFF,均未溢出,
10、并且Bank2的Data值最多;Bank3的Data值最少。当改CODE的时候,有可能未考虑到Bank X 区间,造成数据超过了 0xFFFF,就产生了溢出,此时,需要查看XXXX.m51文件,看是哪个Bank X溢出了,溢出了多少个BYTE,并且看哪个Bank X还有足够空间存放这些溢出的BYTE。 从上面的.m51文件,我们可知,此时的Bank 2的范围已经是0xF947,离0xFFFF,只有0x6B8个BYTE,我们手动把adjust.c从Bank 3 设定到Bank 2,造成Bank 2的Data 溢出。编译后,可以看到Bank 2溢出了0x67个BYTE,此时就出现了需要移BANK的
11、情况 。4: Flash存放DATA的方式 此机种使用的是一颗2M bit的FLASH,可以分为4个64K byte的Bank 。回顾前面看到个Common Bank及Bank0 Bank 3各个范围如下:Common Bank最大范围为0x2BC4+8=0x2BCC,Bank0的最大范围为0xE0ED+1=0xE0EE。Bank1的最大范围为0xBBF5+0x0133=0xBD28。Bank2的最大范围为0xF946+1=0xF947。Bank3的最大范围为0xAEDE+1=0xAEDF。经过 Keil C的编译后,生成的二进制的Bin文件,是我们要烧录到2M Flash的资料。以下为生成的
12、bin文件打开此文件,我们可以看到:=Bank0 中:Common Bank 的data如下,长度0x2BCCBank 0的data如下,长度为0xE0EE=Bank1 中:Common Bank 的data如下,长度0x2BCCBank 1的data如下,长度为0xBD28=Bank2 中:Common Bank 的data如下,长度0x2BCCBank 2的data如下,长度为0xF947=Bank3 中:Common Bank 的data如下,长度0x2BCCBank 3的data如下,长度为0xAEDF=由上可得,Bank0Bank3中的Common Bank的内容都是一模一样的,且各个Bank的数据长度与.m51中秀出来的长度也一样。烧录到2M的flash的内容为Keil C转换成的二进制代码。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1