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

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

  首先先要复习一下RAM, EEPROM, FLASH的简单概念。RAM是机器运行时的内存,单片机运行时可读可写,但是断电后所有数据都会丢失。EEPROM是电擦除的可编程存储,单片机运行时可以读可以写,断电后数据不丢失。由于存储空间小而且读取速度快,因此一般作为数据存储器。有很多程序运行时得到的参数希望下次重启后还能够再被使用,还有一些程序调试时的参数我们都可以将它们放在数据存储器,方便程序参数的修改与保存,因此一般也将EEPROM称作D-Flash。Flash也是电擦除的存储设备,单片机运行时可读可写,断电后数据不丢失,存储空间大,但读取速度相对较慢,一般作为程序存储器也称作P-Flash。但EEPROM与Flash比较还有就是一次擦写或者写入的数据量大小,一般EEPROM可以字节擦写与写入,但Flash是字段写入与块擦除。当然了,对于单片机存储程序的开发,我们没有必要涉及到Flash与EEPROM具体的写入擦除控制,在存储媒介上一般都做好了相关的接口,类似于HCS12VR系列的单片机,如图所示是该系列下的Flash存储器的接口架构。对Flash的控制只需要通过操作该Flash的控制器即可,在图中的架构下,操作Flash只是设置好Flash控制器的操作时钟,向单片机的相应寄存器按照命令的要求写入相关数据即可。EEPROM的操作也是同理。

除了基本的存储器的知识外,HCS12的存储空间的结构也是理解的关键。 要理解存储结构,首先需要分清S12系列的逻辑地址与全局地址。所谓逻辑地址,就是单片机在运行时只要不涉及到显式的对存储器进行读写的地址都是逻辑地址,比如程序运行时每条指令存放的位置,在内存中数据的位置,只要不涉及到对存储器内容的显式编写,通通都是逻辑地址。而逻辑地址的必要性也十分明显,那就是相对于几百KB甚至几MB的存储器,地址总线只有16bits,也就是CPU能直接寻址得到的地址只有64KB。为保证程序运行时地址的一致性,就将程序的各个存储器地址分别映射到这64KB中,每次我只需要通过这64KB就可以访问整个内存空间了(当然还有几个寄存器的帮助才行,但这也总好过直接对存储器进行操作了,这样的话也单片机的设计也太不友好了)。前面的逻辑地址实际上可能会将相同物理媒介的地址分块映射,但是全局地址基本上就可以理解为将各种存储空间都统一进行一个编排,比如说将RAM放在一块,EEPROM放在一块,Flash放在一块。可是,这些不同的物理存储器在全局地址的角度看来都有统一的存储格式,典型的S12系列内存映射图如下图所示:

  这张图乍一看还是有点懵逼的,我这就带你来理解理解。首先左边就是逻辑地址的排布,逻辑地址就是正常运行时的地址,要是不做到Flash擦写或者EEPROM的擦写,你基本上不会用到全局地址。我们一般程序空间中使用的都是逻辑地址。注意:这里还没有提到全局地址,所以说到的也都是逻辑地址。逻辑地址本身是其他存储器的地址为了方便地址总线直接进行寻址,映射成64KB的地址的。上图所示的逻辑地址起始于0x0000-0xFFFF共64KB。由于寄存器也映射到逻辑地址,而且访问速度最快,逻辑地址0x0000-0x03FFF(共1KB, 如果需要16进制计算器,windows自带计算器的程序员模式就好)如上图为寄存器空间。这里注意,图中的寄存器区结束不是0x0400,此地址已经是下一块的起始地址了。寄存器的逻辑地址表在manual reference中都有,可以很方便的查看。从上图中类似的,我们可以读到,给EEPROM的逻辑地址为0x0400-0x05FF (512 B), RAM的逻辑地址为0x3800-0x3FFF(512B),ROM的逻辑地址为:0x0600-0x37FF(12KB), 0x4000-0x7FFF(16KB),0xC000-0xFFFF,以及有点特殊的0x8000-0xBFFF,可见ROM的逻辑地址已经被分成了好几块。

而全局地址就是右边的了,它将所有存储的空间从0开始一直顺序编码。在右侧我们可以看到,由于统一编码,所以相比较而言就多了四个二进制位来表示。全局地址自0x0_0000-0x3_FFFF(256KB)(这样的编码只是为了将高位分开,实际上0x0_0000就是0x00000,0x3_FFFF就是0x3FFFF)。很显然,这个地址空间完全可以将此单片机的所有物理存储统一编址从而方便对于物理存储空间的定位。从图上,我们也可以看到,寄存器的全局地址为0x0_0000-0x0_03FF(1KB),EEPROM与RAM的全局地址共享0x0_0400-0x0_3FFF(15KB),0x3_0000-0x3-FFFF(64KB)为FLASH 的全局地址。至于中间的那部分全局地址用来做什么,目前可以理解为未分配,在此系列单片机中,没有该全局地址对应的物理存储,所以地址都是无效的。

  了解了逻辑地址与全局地址的基本概念后,就要说一下全局地址与逻辑地址是什么关系了。在此之前,就要说一下分页存储的概念了,由于一般而言地址总线不过16位或者8位。因此需要将存储空间较大的Flash像我们的书本一样分成一页一页的,通过页码来索引究竟是那一块存储空间。我们逻辑地址的0x8000到0xBFFF就是负责这样的一个映射作用,通过一个PPAGE寄存器来记录是存储器上的哪一页,再通过0x8000-0xBFFF间的逻辑地址来索引具体的存储内容。在上图右边,Flash的全局地址按16KB为一页分成0xC, 0xD, 0xE与0xF的四页, 这个页码就是PPAGE寄存器的内容。从图中我们可以理一下逻辑地址与全局地址的关联:

                                       逻辑地址范围                                                  全局地址范围

PPAGE: 0xC             0x8000 - 0xCFFF                                           0x3_0000 - 0x3_3FFF

PPAGE:    0xD             0x8000 - 0xCFFF                                           0x3_4000 - 0x3_7FFF

  其余的页面也都是如此,这里再次重申一下,只有专门读写存储器的时候才会使用全局地址,一般情况下指令跳转,内存中指针读取数据,通通都是逻辑地址。希望大家在操作的时候能够分清楚。Flash中的数据,通过逻辑地址寻址时只能读取,只有编写Flash的擦除写入程序才能读写。

这里也再总结一些本篇文档的内容:

  1. 理解逻辑地址与全局地址在HC9S12系列单片机中的具体操作

2. 理解逻辑地址与全局地址的对应关系,分页地址的应用

在有了这些基本的存储概念后,我们才能能正式的进入内存中程序的跳转,Flash的擦写等工作中来。

(未完待续)

注: 本系列文章均为原创,如有转载引用请标明来源                      

原文地址:https://www.cnblogs.com/15821216114sw/p/9255873.html

时间: 2024-10-29 03:08:18

freescale飞思卡尔 HCS12 系列单片机bootloader详解(二)的相关文章

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

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

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

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

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一样,不存在同一口多个功能复用的情

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

对于用MCU的人来说,不一定要明白HCS12(x) memory map的机制和联系.因为如果没有系统地学习操作系统和编译原理之类的课程,确实有些难度.并且,对于DG128 XS128这样的MCU,默认的emory分配方式已经够用了.从这个意义上讲,搞清楚memory map似乎不必要. 但是,你有没有RAM不够用的情况?有没有想定义变量到FLASH ROM的情况?有没有因为欲提高寻址效率而定义变量到非分页区的情况?有没有写EEPROM但没写成功的情况? 飞思的memory非常灵活,通过地址映射

Android组件系列----Activity组件详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3924567.html 联系方式:[email protected] [正文] 注:四大组件指的是应用组件:Activity.Service.BroadcastReceiver.ContentProvider:之前的控件指的是UI组件. 博文目录: 一.Activity简介 二.Activity的状

Android自定义控件系列八:详解onMeasure()(二)--利用onMeasure测量来实现图片拉伸永不变形,解决屏幕适配问题

上一篇文章详细讲解了一下onMeasure/measure方法在Android自定义控件时的原理和作用,参看博文:Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸(一),今天就来真正实践一下,让这两个方法大显神威来帮我们搞定图片的屏幕适配问题. 请尊重原创劳动成果,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/45038329,非允许请勿用于商业或盈利用途,违者必究. 使用ImageView会遇到

mongo 3.4分片集群系列之六:详解配置数据库

这个系列大致想跟大家分享以下篇章(我会持续更新的(^ω^)): 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4.mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域 5.mongo 3.4分片集群系列之五:详解平衡器 6.mongo 3.4分片集群系列之六:详解配置数据库 7.mongo 3.4分片集群系列之七:配置数

Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

[Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.Android 布局学习之——LinearLayout的layout_weight属性   4.Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline    Layout Parameters(布局参数): 在XML文件中,我们经常看到类似与lay

UINavigationController详解二(转)页面切换和SegmentedController

原文出自:http://blog.csdn.net/totogo2010/article/details/7682433,非常感谢. 1.RootView 跳到SecondView 首先我们需要新一个View.新建SecondView,按住Command键然后按N,弹出新建页面,我们新建SecondView 2.为Button 添加点击事件,实现跳转 在RootViewController.xib中和RootViewController.h文件建立连接 在RootViewController.m