飞思卡尔MC9S12系列单片机地址影射以及分页问题

对于用MCU的人来说,不一定要明白HCS12(x) memory map的机制和联系。因为如果没有系统地学习操作系统和编译原理之类的课程,确实有些难度。并且,对于DG128 XS128这样的MCU,默认的emory分配方式已经够用了。从这个意义上讲,搞清楚memory map似乎不必要。

但是,你有没有RAM不够用的情况?有没有想定义变量到FLASH
ROM的情况?有没有因为欲提高寻址效率而定义变量到非分页区的情况?有没有写EEPROM但没写成功的情况?

飞思的memory非常灵活,通过地址映射来提高效率是芯片制造商的一惯作风(当然,首先这个CPU要有这种寻址和内存映射转换机制),但是,纵观HCS12(x) memory map的东西,真是做到极限了。用我以前的话讲是,用有限的资源获得无限的好处了。看看DG128,64K的逻辑空间,映射之后RAM
EEPROM FALSH ROM,都可以充分发挥作用,而且扩展FLASH也方便。而XS128更高级一筹,有专门的MMC管理HCS12(x)
memory map。

我大体上了解这两个片子的HCS12(x) memory map,因此就此谈谈理解和看法,如有错误,请大家不吝指出

首先,说说6个概念。

1

memory map 地址映射,不要理解成内存映射,内存是RAM。

2 为什么要映射?因为CPU的寻址是对物理地址操作,但是单片机的RESET之后只有相对地址。相对地址,我理

解为是一块一块的,不是连断的。相对地址,顾名思义,是个相对的,没有映射之前,CPU是找不到他的,也

用不了相对地址的数据。 粘一句百度上的解释:为了保证CPU执行指令时可正确访问存储单元,需将用户程序

中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。

3 RAM,这个不多说,是存变量和栈的东西,高速,掉电即失。

4 EEPROM,这个是一种特别的FLASH。一般用来保存少量数据,掉电不会丢失。FLASH也是非易失的,SD卡就是

一种FLASH。EEPROM和普通FLASH的区别,在于读写时的字节操作上。这个我基本上没有体会,因为是相当底层

的东西。

5 FLASH和ROM,在HCS12(X)里,建议把FLASH和ROM等同起来理解。大家的程序就是放在这里面的。还有一个

CONST变量和中断向量也是存在这里面的。ROM可能有个误区,只能读不能写,一次性的,不错。但是,有加个

前提,应该是可控的ROM。

6 还有一个重要的register 空间,这个是存放I/0地址和单片机可编程寄存器的空间,是厂家定义的。在头文件里可以看到。如extern volatile PORTABSTR _PORTAB @(REG_BASE + 0x00000000)就是典型的register 空间映射。

我把memory map理解成为3个内容:一个是映射管理,一个是分页机制,一个是寻址的问题。映射管理,就

是单片机RESET之后,逻辑地址和物理地址之间的关系。分页机制的产生主要由于16位寻址能力有限,需要分

页解决,另外在虚拟内存管理上可以获得更多的优势。至于,CPU寻址的问题,这个就不深纠了。

这次以DG128的为例,XS128的稍复杂一些。理解了DG128的,XS128的问题就不大。

先说一说映射管理:DG128里通过设置INITRG、INITRM、INITEE来实现映射。具体的设置看DS吧。默认情况

下:register 空间映射到0X0000到0x03FF,这个优先级最高。RAM空间映射到0x0400-0X1FFF,看到没有,实际

上只有7K,也就是说能用的RAM只有7K。但是,DG128的RAM有8K的逻辑空间啊。所以,可以改INITRG、INITRM

、INITEE重映射以提高RAM的实际可用空间。怎么改,看需要了。WJ在这里逻嗦一句,可以看看PE是怎么改的

。而FLASH映射了3个,有两个非分页地址0x4000-0x7FFF和0xC000-0xFEFF。还有一个分页地址,这一个分页地

址有6个页面。6个页面占用一个分页窗,用一个逻辑空间,如何让这6个页面协作工作并让CPU能找到他们呢?

这就是分页管理机制的内容。这6个页面分别是:

PAGE_38       =
READ_ONLY   0x388000 TO 0x38BFFF;

PAGE_39       = READ_ONLY 
 0x398000 TO 0x39BFFF;

PAGE_3A       = READ_ONLY   0x3A8000
TO 0x3ABFFF;

PAGE_3B       = READ_ONLY 
 0x3B8000 TO 0x3BBFFF;

PAGE_3C       = READ_ONLY 
 0x3C8000 TO 0x3CBFFF;

PAGE_3D       = READ_ONLY 
 0x3D8000 TO 0x3DBFFF;

上面说的大家可以新建一个DG128工程,到PRM文件里看。

再看看分页管理机制:DG128里只有FLASH空间可以分页,而XS128里,分页的东西太多了。DG128里FLASH分

页是通过PPAGE寄存器搞定的。PPAGE是5位寄存器,CPU12内核规位每页只能有16KB。因此DG128的FLASH寻址空

间就是2^5*16KB=512KB了。

首先问一个问题:

中断函数为什么要加:#pragma CODE_SEG __NEAR_SEG NON_BANKED 这个声明?这个声明是干什么用的?

这要还是要从FLASH分页和非分页的区别说起。

下面详细说一说,FLASH里非分页和分页的使用。 要明白一点,分页是不可见的,要用的时候PPAGE参与寻

址。

 1 FLASH里非分页工作机制

FLASH一共为128K,一页是16K,那么应该有8页才是,但是实际只有6个分页。有2个非分页放在4000-7FFF

,和C000-FFFF两个逻辑地址窗里。那么,当程序的寻址在64K之内(2^16=64K,16位机的寻址能力是64K)时,

就不用分页了,直接使用那两个非分页的数据。实际上,3E页 3F页是可见的,其实他们就是那2个非分页的映

射。因此,使用非分页FLASH,就不须设置PPAGE寄存器,直接使用逻辑地址即可。见图1。

这点我们可以从以下看出:

/* non-paged FLASHs */

ROM_4000      = READ_ONLY 
   0x4000 TO   0x7FFF;

ROM_C000      = READ_ONLY 
   0xC000 TO   0xFEFF;

PLACEMENT

NON_BANKED,    INTO  ROM_C000/*,
ROM_4000*/;

很直观地看出,把这两个可以直接使用逻辑地址的页面设为NON_BANKED, 那么中断函数放在NON_BANKED里

,就可以把函数放在64K的寻址程序段中。这么一来,进中断就方便多了,效率也高很多。这就是对本文开篇

的解释。

 2  FLASH里分页工作机制

好了,上面是3E页 3F页是可见的分页区,还有3D
3C 3B 3A 39 38不可见的分页区。当你的程序要寻址

64K以外的空间,即不是是可见的3E页 3F页时,就要涉及分页了。

PPAGE是MMC模块的东西,我搞了个图片大家看看,如图2。每一页在DG128中的逻辑地址都是由PPAGE中的

页号和重叠窗口内地址组成的24位绝对地址。通过设置寄存器PPAGE,可以使用全部的FLASH空间。例如:程序

要将数据存入$3D页,设置PPAGE的值为$3D,那么逻辑地址范围说是$3D8000-$3DBFFF。有一点要注意:为了分页描述的完整性,可以如下理解:对于3E页 3F页有两个逻辑地址映射到物理地址。拿3E页来说,有$004000-$007FFF和$3E8000-$3EBFFF。

对于程序是如何寻址,这个是内核的东西,大家可以看看CPU这个文档。

通过分析,相信大家知道地址这个东西是非常有用的吧。下次说说XS128,XS128的RAM FLASH EEPROM都可

以分页。更高级,更主动,编程弹性更大。

原文地址:https://www.cnblogs.com/fengliu-/p/9256853.html

时间: 2024-10-22 13:34:47

飞思卡尔MC9S12系列单片机地址影射以及分页问题的相关文章

freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(一)之时钟设置

Flash擦写的内容,个人做HC9S12系列单片机时觉得应该是各模块内容中最难而且是最麻烦的一步了.只有能够对Flash进行擦写以后,所做的Bootloader才有真正手段将串口或者其他通讯手段接收到的数据或者程序写入Flash中进行程序或者数据的更新.当初做Flash的擦写也遇到了很多问题,网上搜罗下来也没有合适的帖子能够详细的将整个过程或者学习的思路以及最后实现的程序详细的加以解析,而本博文就是基于这个出发点来写的.技术本身应当是共享的才能真正让社会进步,不是么? 关于单片机Flash的基本

freescale飞思卡尔 HCS12 系列单片机bootloader详解(三)

在完成内存映射的内容后,接下来我们将进入一个简单Bootloader的实际设计中来.在第一节内容中,我们已经简单介绍了bootlaoder的作用,它实际上就是在单片机重启过程中的一个步骤:如果有bootloader的启动信号,则进入bootloader模式开始新程序的接收与flash的擦写,若没有bootloader的启动信号,则直接进入用户程序执行用户程序内容. bootloader的启动信号一般有如下两种: 1)外部引脚接地或者拉高电平:每次启动时先监测某一已经设定的引脚是否已经被操作到了b

NXP 飞思卡尔 S12Z 系列单片机 SCI 设置(解决SCI已经设置完成,但却无法通信的问题)

近日在使用了飞思卡尔S12Z设置SCI后总是不出数据,明明按照前代单片机S12Z的方法设置好了,为什么又不能用了呢? 下面是我简单对SCI1的设置,仅仅这样设置是出不来数据的: 1 SCI1BD = GLOBAL_BUS_CLOCK / SCI1_BAUD_RATE; 2 SCI1CR2 = SCI1CR2_RE_MASK + SCI1CR2_TE_MASK + SCI1CR2_RIE_MASK; 在上面的设置中我仅仅设置了SCI1的设置,假设了S12Z与S12一样,不存在同一口多个功能复用的情

freescale飞思卡尔 HCS12 系列单片机bootloader详解(二)

在上一篇文章中我们做了对HC9S12系列单片机存储空间的划分,但是相比于整个bootloader的工作而言,这只是非常基础的一步,有很多基础的概念在上一篇的操作中我们并没有涉及到.比如较复杂单片机中单片机的存储空间到底是什么样的,具体怎么用C语言对它进行寻址.因为我们单片机的存储空间一般由如下的构成,RAM,ROM以及EEPROM等等.比如在我在本篇中举例介绍的9S12G128单片机,它的RAM空间有8KB,EEPROM有4KB,FLASH有128KB.如何将这几个存储空间合理的组织起来想必单片

飞思卡尔单片机P&E开发工具硬件及软件

原文链接: http://blog.sina.com.cn/s/blog_8ebff8d7010121tm.html 1.HC(S)08系列 开发机硬件:USB-ML-12 CYCLONE PRO USB-ML-UNIVERSAL USB-ML-UNIVERSAL FX 支持发软件:烧录软件 PROGHCS08 调试软件 ICDHCS08 软件包   PKGHCS08 2.HC(S)12(X)系列 开发机硬件:USB-ML-12 CYCLONE PRO USB-ML-UNIVERSAL USB-

飞思卡尔单片机中逻辑地址和全局地址关系

在编写P-Flash时,我们首先需要搞明白飞思卡尔内部Flash memory的管理机制,这其中就涉及到我们访问Flash是采用逻辑地址还是全局地址,逻辑地址是由单片机内部的内存管理机制决定的,而全局地址对应的是物理地址.逻辑地址最终都会映射到物理地址上的某段区间. 关于逻辑地址和物理地址的关系,可以参考以下文章<programing flash memory in freescale s08/s12/codefire mcus family>  链接:http://www.docin.com

飞思卡尔单片机PIT汇编编程(一)

飞思卡尔单片机(XS128系列)单片机汇编编程(一) 本人就是一个菜鸟,从菜鸟学习汇编编程:汇编也没想象中的复杂和难懂,细细品味还是挺有意思的.就当刷着玩吧,就学起了汇编(这一直是我的一大心病),慢慢学吧,就当了却了我的一个愿望.作为我的第一个汇编程序,仔细缕缕编写的过程.好了,废话不说了,开始正题. 手头上的资料:飞思卡尔单片机,调试器以及手册(欧了,就这三样),对了,下一个飞思卡尔单片机的汇编指令集哦. 开始如下工作: 首先熟悉中断机制,确定我们要在哪部分编程,以及编程之后起到的效果,然后才

痞子衡嵌入式:飞思卡尔i.MX RT系列微控制器启动篇(2)- Boot配置(BOOT_CFG Pin/eFUSE)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Boot配置. 在上一篇文章 飞思卡尔i.MX RT系列微控制器启动篇(1)- Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRT Boot方式简介.今天痞子衡就来重点聊一聊i.MXRT Boot方式具体由哪些配置决定的. 无论是什么芯片里的BootROM,其最核心的功能无非两个:一.从存放Application的存储器中加载执行:二.通过支持的通信接口接收来自Host的Applic

痞子衡嵌入式:飞思卡尔i.MX RT系列微控制器介绍篇(3)- 命名规则

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的命名规则. 打开任何一款i.MX RT系列芯片的Data Sheet均可找到如下命名规则表,以i.MXRT105x芯片的Data Sheet为例: 一款芯片名字共有以上10部分组成,RT系列芯片家族目前成员不多,上表仅适用于i.MXRT105x.i.MXRT102x.从芯片名字上我们主要可以得到五种有效信息,分别是所属子系列.温度范围.封装.最大运行频率等级.Tapeout版本. 不过从芯片名字上能