1.逻辑地址和全局地址的映射关系
9S12XE系列的逻辑地址与全局地址映射关系如下图所示:
其中对应关系如下:
逻辑地址0x0000-0x07FF的2K MCU内部及其外设控制寄存器空间对应全局地址的0x0000-0x07FF;
逻辑地址0x0800-0x0BFF的1K EEPROM空间通过EPAGE映射非固定页EEPROM到全局地址0x10_0000-0x13_FBFF,逻辑地址0x0C00-0x0FFF的1K固定页EEPROM映射到全局地址0x13_FC00-0x13_FFFF(CPU直接访问逻辑地址0x0C00-0x0FFF相当于访问全局地址0x13_FC00-0x13_FFFF,不过逻辑地址在CPU的直接寻址范围内,直接访问0x0C00-0x0FFF速度更快,单片机访问全局地址0x13_FC00-0x13_FFFF也是范围逻辑地址为0x0C00-0x0FFF的固定页EEPROM,下面RAM和FLASH的寻址方式与EEPROM相同);
逻辑地址0x1000-0x1FFF 4K RAM空间通过RPAGE映射非固定页RAM到全局地址RAM_LOW-0x0F_DFFF,逻辑地址0x2000-0x3FFF的8K 固定页RAM映射到全局地址0x0F_DFFF-0x0F_FFFF(CPU 直接访问0x2000-0x3FFF相当于访问0x0F_DFFF-0x0F_FFFF,速度更快);
逻辑地址0x4000-0x7FFF 16K固定页FLASH映射到全局地址0x7F_4000-0x7F_7FFF,逻辑地址0xC000-0xFFFF 16K固定页FLASH映射到全局地址0x7F_C000-0x7F_FFFF(CPU直接访问0x4000-0x7FFF和0xC000-0xFFF相当于访问0x7F_4000-0x7F_7FFF和0x7F_C000-0x7F_FFFF,速度更快,反过来也是一样),逻辑地址0x8000-0xBFFF的16K FLASH空间通过PPAGE映射非固定页FLASH到全局地址FLASH_LOW-0x7F_3FFF和0x7F_8000-0x7F_BFFF。
2.内存的分页及页内逻辑地址与全局地址的关系
由于9S12内CPU 16位地址总线只能访问64K的内存空间,对于大于64K内存空间,单片机引入页地址将超出能直接访问的资源进行分页,然后通过页地址进行访问。其中RAM引入RPAGE,EEPROM引入EPAGE,FLASH引入PPAGE。下一节RAM、EEPROM和FLASH的页地址与页内逻辑地址并不从0开始,是因为要将页地址和页内逻辑地址进行组合形成全局地址,对应相应内存类型所在的全局地址范围,具体的对应的关系如下:
RPAGE
EPAGE
PPAGE
3.prm文件与内存映射的关系
XEP100的prm文件总共可分为6部分,我们主要用到4部分:
1)SEGMENTS…END
SEGMENTS…END中间是所使用的单片机内部资源的定义,包括了内部资源名和地址,其中内部资源明可由用户自己定义,也可以自行定义自己用的的内部资源的名字和地址范围。
EEPROM = READ_ONLY DATA_NEAR IBCC_NEAR 0x0C00 TO 0x0FFF;定义了固定页EEPROM的地址;
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;定义了固定页RAM的地址;
ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF; ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;定义了两块固定页ROM的地址,也就是两块16 K固定页Flash的地址,因为访问16K 固定页Flash的逻辑地址相当于访问Flash 的全局地址中的Flash FD,FF页,所以在prm文件中直接定义其的逻辑地址用,不再定义其的页地址和页内逻辑地址组合,下面的分页EEPRM和分页RAM定义情况与Flash相同;
EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;...定义了非固定页EEPROM的地址,其中地址的前2位表示页数,后4位表示该页内的逻辑地址,二者结合可以组合成全局地址。EEPROM的页数范围为0-FE,页内的逻辑地址范围为0x0800-0x0BFF,其他地址为非法;
RAM_F0 = READ_WRITE DATA_FAR 0xF01000 TO 0xF01FFF;定义了非固定页RAM地址组合,其中地址的前2位表示页数,后4位表示该页内的逻辑地址,二者结合可以组合成全局地址,EEPROM的页数范围为F0-FD,页内的逻辑地址范围为0x1000-0x1FFF,其他地址为非法。FE和FF页对应固定页RAM,前面已经定义,这里不再重复定义;
PAGE_C0 = READ_ONLY DATA_FAR IBCC_FAR 0xC08000 TO 0xC0BFFF;定义了非固定页FLASH地址组合,其中地址的前2位表示页数,后4位表示该页内的逻辑地址,二者结合可以组合成全局地址,FLASH的页数范围为C0-FC和FE,页内的逻辑地址范围为0x8000-0xBFFF,其他地址为非法。FD和FF页对应固定页FLASH,前面已经定义,这里不再重复定义;
上面6种资源类型可以不全部定义,只定义自己程序中需要的内存资源,例如程序中只需要固定页的RAM和ROM那么就可以自己定义如下的SEGMENTS…END部分:
SEGMENTS
MY_RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
MY_ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x4FFF;
END
2)PLACEMENT…END
PLACEMENT…END内主要功能是将对应类型的代码放到SEGMENT…END中定义的内存资源内,其中DISTRIBUTE_INTO和INTO功能相似,都是将对应类型的代码放置到指定资源,但使用优化器时,需要使用DISTRIBUTE_INTO,否则会导致优化失败,具体功能如下:
<1>将程序中的预启动和启动函数、常量、字符串、虚拟表、固定页代码、需要拷贝到RAM的数据放置到ROM_C000,也就是放置到地址为0xC000-0xFEFF的固定页FLASH内,代码如下:
_PRESTART, /* Used in HIWARE format: jump to _Startup at the code start */
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
//.ostext, /* eventually OSEK code */
NON_BANKED, /* runtime routines which must not be banked */
COPY /* copy down information: how to initialize variables */
/* in case you want to use ROM_4000 here as well, make sure
that all files (incl. library files) are compiled with the
option: -OnB=b */
INTO ROM_C000/*, ROM_4000*/;
<2>将放置到默认Flash内的代码和数据放置到分页FALSH内,代码如下:
DEFAULT_ROM INTO PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8,
PAGE_F7, PAGE_F6, PAGE_F5, PAGE_F4, PAGE_F3, PAGE_F2, PAGE_F1, PAGE_F0,
PAGE_EF, PAGE_EE, PAGE_ED, PAGE_EC, PAGE_EB, PAGE_EA, PAGE_E9, PAGE_E8,
PAGE_E7, PAGE_E6, PAGE_E5, PAGE_E4, PAGE_E3, PAGE_E2, PAGE_E1, PAGE_E0,
PAGE_DF, PAGE_DE, PAGE_DD, PAGE_DC, PAGE_DB, PAGE_DA, PAGE_D9, PAGE_D8,
PAGE_D7, PAGE_D6, PAGE_D5, PAGE_D4, PAGE_D3, PAGE_D2, PAGE_D1, PAGE_D0,
PAGE_CF, PAGE_CE, PAGE_CD, PAGE_CC, PAGE_CB, PAGE_CA, PAGE_C9, PAGE_C8,
PAGE_C7, PAGE_C6, PAGE_C5, PAGE_C4, PAGE_C3, PAGE_C2, PAGE_C1, PAGE_C0;
<3>将堆栈和放置到默认RAM的数据放置到固定页RAM,代码如下:
//.stackstart, /* eventually used for OSEK kernel awareness: Main-Stack Start */
SSTACK, /* allocate stack first to avoid overwriting variables on overflow */
//.stackend, /* eventually used for OSEK kernel awareness: Main-Stack End */
DEFAULT_RAM /* all variables, the default RAM location */
INTO RAM;
<4>将放置到非固定页RAM的数据放置到分页RAM,代码如下:
PAGED_RAM INTO /* when using banked addressing for variable data, make sure to specify
the option -D__FAR_DATA on the compiler command line */
RAM_F0, RAM_F1, RAM_F2, RAM_F3, RAM_F4, RAM_F5, RAM_F6, RAM_F7,
RAM_F8, RAM_F9, RAM_FA, RAM_FB, RAM_FC, RAM_FD;
若在SEGMENTS…END中自行定义了自己所使用的资源名称和地址范围,则可将对应类别的代码放入自己定义的内部资源内。若SEGMENTS内自行定义的ROM如MY_ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x4FFF;,自行定义的RAM如MY_RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;那么可将代码放入MY_ROM_4000,数据放入MY_RAM内,代码为:
PLACEMENT
_PRESTART,
STARTUP,
ROM_VAR,
STRINGS,
VIRTUAL_TABLE_SEGMENT,
DEFAULT_ROM,NON_BANKED,
COPY INTO MY_ROM_4000
SSTACK,DEFAULT_RAM INTO MY_RAM
END
3)设置堆栈大小
堆栈堆栈大小默认设置为0x100,可以根据最近单片机内存的大小自行定义大小。
STACKSIZE 0x100
4)设置上电复位中断函数
9S12固定引脚复位、上电复位、低电压复位和非法地址复位为中断向量0、固定时钟监控复位为中断向量1、固定看门狗复位为中断向量2,且地址分别固定为0xFFFE、0xFFFC、0xFFFA。如下图所示:
在prm文件需要设置上电复位中断,代码如下,单片机上电后进入复位中断,运行启动代码。
VECTOR 0 _Startup
上一篇:CodeWarrior v5.x/MC9S12(X)怎么使用printf
下一篇:MC9S12XE 启动过程
推荐阅读最新更新时间:2024-11-10 15:32
设计资源 培训 开发板 精华推荐
- LT3513 的典型应用 - 用于 TFT-LCD 面板的 2MHz 大电流 5 输出稳压器
- LTC1701,单节锂离子至 3.3V zeta 转换器
- TWR-K60D100M: Kinetis K60 100 MHz MCU塔式系统模块
- LT3990HMSE-3.3 1.8V 降压转换器的典型应用
- 高速逻辑兼容、半间距微型扁平光耦合器 MOSFET 级联接口
- LT6656BCDC-4.096、4.096V 电压基准作为微功率稳压器的典型应用
- #第四届立创大赛#即热式脉冲阀冲水智能马桶
- 使用 Aimtec 的 AM3G-2403SH30Z 的参考设计
- KIT33908AEEVB: 评估板 - MC33908,安全DC/DC,高达1.5 A
- 具有 LED 开路保护的 LT3477IFE 330mA LED 驱动器的典型应用电路
- 安世半导体&世平集团 高效能&小型化, Nexperia MOSFET的5G解决方案 观看、下载 闯关赢好礼!
- 赛灵思工业与医疗专题有奖问答
- 有奖问答|ADI MEMS 推动无处不在的倾角监测发展
- 有奖直播报名:赛灵思和安富利专注嵌入式视觉应用,助力人工智能和汽车辅助驾驶!
- 2018开“芯”学:Mentor两场知识有奖问答邀你新年充电
- 庆元宵答题抽奖,知识与礼物齐飞
- 有奖下载 |《设计无线通信系统时需考虑的天线因素》
- 悦读 TI 工业应用精选方案,闯关赢好礼喽!
- Littelfuse第3期:新型SSA系列双端超低分流电阻器
- 直播|基于英特尔® Agilex™ FPGA的PCIe Gen5和CXL解决方案