标题: 我理解的内存映射 [打印本页]
作者: qutao88 时间: 2006-8-3 10:50 标题: 我理解的内存映射
我理解的内存映射:
内存映射也算是相应寄存初始化吧,因为系统刚起动后,各相关寄存器没有初始化,好多都是从0X0000开始的,所以发生了重叠,重新映射就是给相应的寄存器赋
相应模块的实际地址,也就是指出它所在的地址,
作者: qutao88 时间: 2006-8-3 11:30
不知道这样理解对不对,还请各位指点
作者: seuafu2005 时间: 2006-8-3 11:37
是的,给寄存器赋值设置就是一个初始化的过程
作者: qutao88 时间: 2006-8-3 12:00
谢谢版主.也就是说,其实它们是固定的,只是有关它们的寄存器没有被初始化好,所以才会造成重叠!
初始化有关它们的寄存器就是告诉CPU它们的实际位置,
如果那样,向量区的映射又是怎么回事?
作者: strongchen 时间: 2006-8-3 13:48
各个模块的地址确实是可以重新映射,也就是改变其位置的。
至于向量区的重新映射,那是另一回事情,请参考此贴:
http://bbs.chinaecnet.com/dispbbs.asp?boardID=3&RootID=102026&ID=102026
[此贴子已经被strongchen于2006-8-3 13:48:30编辑过]
作者: qutao88 时间: 2006-8-4 09:39
有些不太清楚这些寄存器如何用:initrm,initrg,initee,misc,mtst0,mtst1,memsiz0,memsiz1.能否给个初始化的例子看看,谢谢了
qutao713@163.com
作者: strongchen 时间: 2006-8-4 10:05
mtst0,mtst1,memsiz0,memsiz1都是芯片内部的寄存器,用户不能使用;MISC主要用于扩展模式时。一般情况下,用户只须设置initrm,initrg,initee三个寄存器即可。
作者: qutao88 时间: 2006-8-4 10:21
initrm,initrg,initee这三个值怎么设,给个例子,好验证一下自已的理解是不是对的,还有就时钟,如果外部晶体是9.8304MHZ,不用PLL那busclock是不是9.8304/2=4.9152MHZ.如果用了PLL,(SYNR=0x03,REFDV=0x01)busclock=19.6608MHZ,
然后,P,E,T的频率也是这个值,只是相位不同,
是不是这样的?
还请版主指教
作者: strongchen 时间: 2006-8-4 10:22
这里有一段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
作者: strongchen 时间: 2006-8-4 10:28
这里,将寄存器放在0x0000~0x03FF,EEPROM放在0x0400~0x0FEF,把RAM放在0x1000~0x3FFF。注意MICS的上电复位初始值就是13(0x0D)。这里将初始值再写一遍,是为了保护这个寄存器,这样它的值就不会被意外改写了。
作者: qutao88 时间: 2006-8-4 10:47
谢谢!
作者: dreamcatcher 时间: 2006-8-25 16:28
我用的MC9S12DG128
初始化了INITRG=$00,INITRM=$39,INITEE=$09
怎么感觉映射的不对呢?
RAM写不进去数据
EEPROM也不能写进数据
不知道什么原因???
作者: strongchen 时间: 2006-8-28 09:34
你是要把它们分别映射到哪些地址上去呢?
作者: dreamcatcher 时间: 2006-8-29 10:54
如果要把RAM映射到$0000-1FFF,EEPROM映射到$2000-2800,应该怎么设置呢?
谢谢
作者: strongchen 时间: 2006-8-29 12:25
INITRM = 0x00;
INITEE = 0x21;
作者: dreamcatcher 时间: 2006-8-30 09:21
谢谢!
找到了一个application notes-AN2881
里面说得很详细!
作者: shpdlizj 时间: 2006-9-8 16:40 标题: 各模块有效空间大小能改变吗?
如果用DO512,则缺省的空间是这样分配的:
寄存器区:0x0000-0x03ff共1K
EEPROM区:0x000-0x0fff共4K
RAM区 :0x0800-0x3fff共14K
FLASH区 :0x4000-0xffff
其中寄存器区和EEPROM区共享区间0x000-0x3ff,但寄存器区优先级高,所以这个共享区实际被寄存器区占用。
另外,EEPROM区和RAM区共享0x800-0xfff这2K空间,但RAM区优先级高,这样,实际能用的EEPROM只有0x400-0x7ff这1K空间了!
如果我需要较多的EEPROM但不需要那么多RAM空间,有没有办法使0x800-0xfff这2K空间给EEPROM使用而不被RAM占用呢?
作者: seuafu2005 时间: 2006-9-8 16:56
前面讨论了很多关于这个问题,就是映射
你说的只是默认的空间,可以通过映射使得你的EEPROM和RAM没有重叠
关于这个可以先看看置顶的帖子常见问题回答精华列表
作者: yuling0916 时间: 2009-11-25 10:51
受益了,呵呵
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |