首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

我理解的内存映射

我理解的内存映射


我理解的内存映射:


内存映射也算是相应寄存初始化吧,因为系统刚起动后,各相关寄存器没有初始化,好多都是从0X0000开始的,所以发生了重叠,重新映射就是给相应的寄存器赋
相应模块的实际地址,也就是指出它所在的地址,

不知道这样理解对不对,还请各位指点
是的,给寄存器赋值设置就是一个初始化的过程
谢谢版主.也就是说,其实它们是固定的,只是有关它们的寄存器没有被初始化好,所以才会造成重叠!
初始化有关它们的寄存器就是告诉CPU它们的实际位置,

如果那样,向量区的映射又是怎么回事?

各个模块的地址确实是可以重新映射,也就是改变其位置的。

至于向量区的重新映射,那是另一回事情,请参考此贴:

http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=102026&ID=102026 

[此贴子已经被strongchen于2006-8-3 13:48:30编辑过]

海纳百川  有容乃大
有些不太清楚这些寄存器如何用:initrm,initrg,initee,misc,mtst0,mtst1,memsiz0,memsiz1.能否给个初始化的例子看看,谢谢了

qutao713@163.com
mtst0,mtst1,memsiz0,memsiz1都是芯片内部的寄存器,用户不能使用;MISC主要用于扩展模式时。一般情况下,用户只须设置initrm,initrg,initee三个寄存器即可。
海纳百川  有容乃大
initrm,initrg,initee这三个值怎么设,给个例子,好验证一下自已的理解是不是对的,还有就时钟,如果外部晶体是9.8304MHZ,不用PLL那busclock是不是9.8304/2=4.9152MHZ.如果用了PLL,(SYNR=0x03,REFDV=0x01)busclock=19.6608MHZ,
然后,P,E,T的频率也是这个值,只是相位不同,

是不是这样的?
还请版主指教
这里有一段PE生产的初始化函数,大家也可以自己用PE来做:

/*
** ===================================================================
** Method : _EntryPoint (bean MC9S12DP256_112)
**
** Description :
** This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
extern void _Startup(void); /* Forward declaration of external startup function declared in file Start12.c */
#pragma CODE_SEG __NEAR_SEG NON_BANKED

#define INITRG_ADR 0x0011 /* Register map position register */

#pragma NO_FRAME
#pragma NO_EXIT
void _EntryPoint(void)
{
/*** ### MC9S12DP256BCPV "Cpu" init code ... ***/
/*** PE initialization code after reset ***/
/* Initialization of the registers INITRG, INITRM, INITEE is done to protect them to be written accidentally later by the application */
*(byte*)INITRG_ADR = 0; /* Set the register map position */
asm("nop"); /* nop instruction */
/* INITRM: RAM15=0,RAM14=0,RAM13=0,RAM12=0,RAM11=0,??=0,??=0,RAMHAL=1 */
setReg8(INITRM, 1); /* Set the RAM map position */
/* INITEE: EE15=0,EE14=0,EE13=0,EE12=0,??=0,??=0,??=0,EEON=1 */
setReg8(INITEE, 1); /* Set the EEPROM map position */
/* MISC: ??=0,??=0,??=0,??=0,EXSTR1=1,EXSTR0=1,ROMHM=0,ROMON=1 */
setReg8(MISC, 13);
/* EBICTL: ??=0,??=0,??=0,??=0,??=0,??=0,??=0,ESTR=0 */
setReg8(EBICTL, 0);
/* PEAR: NOACCE=0,??=0,PIPOE=0,NECLK=0,LSTRE=0,RDWE=0,??=0,??=0 */
setReg8(PEAR, 0);
/* CLKSEL: PLLSEL=0,PSTP=0,SYSWAI=0,ROAWAI=0,PLLWAI=0,CWAI=0,RTIWAI=0,COPWAI=0 */
setReg8(CLKSEL, 0); /* Select clock source from XTAL and set bits in CLKSEL reg. */
/*** End of PE initialization code after reset ***/
__asm("jmp _Startup"); /* Jump to C startup code */
}

#pragma CODE_SEG DEFAULT
海纳百川  有容乃大
这里,将寄存器放在0x0000~0x03FF,EEPROM放在0x0400~0x0FEF,把RAM放在0x1000~0x3FFF。注意MICS的上电复位初始值就是13(0x0D)。这里将初始值再写一遍,是为了保护这个寄存器,这样它的值就不会被意外改写了。
海纳百川  有容乃大
谢谢!
我用的MC9S12DG128
初始化了INITRG=$00,INITRM=$39,INITEE=$09
怎么感觉映射的不对呢?
RAM写不进去数据
EEPROM也不能写进数据
不知道什么原因???

生命就是奇迹,永远都不要放弃希望,哪怕光亮渺小如豆,我们都要坚持举着它,即使烛火灼伤了皮肤,我们也不能失手,否则我们将永远在黑暗之中。
你是要把它们分别映射到哪些地址上去呢?
海纳百川  有容乃大
如果要把RAM映射到$0000-1FFF,EEPROM映射到$2000-2800,应该怎么设置呢?
谢谢
生命就是奇迹,永远都不要放弃希望,哪怕光亮渺小如豆,我们都要坚持举着它,即使烛火灼伤了皮肤,我们也不能失手,否则我们将永远在黑暗之中。
INITRM = 0x00;
INITEE = 0x21;
海纳百川  有容乃大
返回列表