MC9S12单片机的内存映射机制

地址空间

这是个16位的单片机。CPU的寻址空间最大为2^16=64K。

这个64K是包括外设、RAM、EEPROM、和FLASH的。现在程序越来越大,64K的空间肯定是不够用的。因此,需要扩展。

扩展方法就是:分页。

把原来的64K空间,划分一块出来,当作“窗口”。再配置一个“页寄存器”,指示哪一段存储器被映射上这个窗口上,供CPU访问。

地址映射图

解读:

1,0x0000~0x0800为2K的寄存器空间;

2,0x0800~0x0C00为1K大小的EEPROM“窗口”空间;

3,0x0C00~0x1000为1K大小的EEPROM固定空间;

4,0x1000~0x2000为4K的RAM“窗口”空间;

5,0x2000~0x4000为8K的RAM固定空间;这样分配的好处是,有8K的固定RAM空间,可以满足大多数应用场景,不需要对RAM进行分布管理;

6,FLASH空间分为3个部分(页),每个都是16K,共48K,对应地址为0x4000~0xFFFF。其中,第1个和第3个是固定空间,中间那个页是“窗口”空间。

7,以FLASH为例。存储器映射控制器(Memory Mapping Control)将扩展后的逻辑地址0x400000~0x7FFFFF映射到0x8000~0xC000。

特殊FLASH地址

具体的要查芯片手册。但这个系列的用法都差不多。

FLASH配置域

0xFF00~0xFF0F 这16个字节是FLASH配置字。

中断向量表

FF10~FFFF是中断向量表(含复位向量):

页表地址

prm文件中定义的:

/* paged FLASH:                                        0x8000 TO   0xBFFF; addressed through PPAGE */
      PAGE_E0       = READ_ONLY   DATA_FAR IBCC_FAR  0xE08000 TO 0xE0BFFF; 
      PAGE_E1       = READ_ONLY   DATA_FAR IBCC_FAR  0xE18000 TO 0xE1BFFF; 
      PAGE_E2       = READ_ONLY   DATA_FAR IBCC_FAR  0xE28000 TO 0xE2BFFF; 
      PAGE_E3       = READ_ONLY   DATA_FAR IBCC_FAR  0xE38000 TO 0xE3BFFF; 
      PAGE_E4       = READ_ONLY   DATA_FAR IBCC_FAR  0xE48000 TO 0xE4BFFF; 
      PAGE_E5       = READ_ONLY   DATA_FAR IBCC_FAR  0xE58000 TO 0xE5BFFF; 
      PAGE_E6       = READ_ONLY   DATA_FAR IBCC_FAR  0xE68000 TO 0xE6BFFF; 
      PAGE_E7       = READ_ONLY   DATA_FAR IBCC_FAR  0xE78000 TO 0xE7BFFF; 

      PAGE_F8       = READ_ONLY   DATA_FAR IBCC_FAR  0xF88000 TO 0xF8BFFF; 
      PAGE_F9       = READ_ONLY   DATA_FAR IBCC_FAR  0xF98000 TO 0xF9BFFF; 
      PAGE_FA       = READ_ONLY   DATA_FAR IBCC_FAR  0xFA8000 TO 0xFABFFF; 
      PAGE_FB       = READ_ONLY   DATA_FAR IBCC_FAR  0xFB8000 TO 0xFBBFFF; 
      PAGE_FC       = READ_ONLY   DATA_FAR IBCC_FAR  0xFC8000 TO 0xFCBFFF; 
/*    PAGE_FD       = READ_ONLY                      0xFD8000 TO 0xFDBFFF; intentionally not defined: equivalent to ROM_4000 */
      PAGE_FE       = READ_ONLY   DATA_FAR IBCC_FAR  0xFE8000 TO 0xFEBFFF; 
/*    PAGE_FF       = READ_ONLY                      0xFF8000 TO 0xFFBFFF; intentionally not defined: equivalent to ROM_C000 */

这里是根据页号来配置的逻辑地址。用于编译器生成bin文件时寻址。

这里面的地址是非连续的。每一段大小都是16K。低14位地址都是0x8000~0xBFFF。便于MMC将该地址映射到页号+CPU地址。

全局地址

全局地址与PPAGE寄存器之间的关系:

全局地址最高位为1时,将分页后的FLASH空间映射给CPU。

低14位是CPU本地地址(共16K),刚好一个页的大小。前面的8个位(bit14~bit21)对应的是PPAGE,最多可映射256页。

全局地址与RPAGE寄存器之间的关系:

全局地址最高位为000时,将分页后的RAM空间映射给CPU。

低12位是CPU本地地址(共4K),刚好一个RAM页的大小。前面的8个位(bit12~bit19)对应的是RPAGE,最多可映射256页。

全局地址与EPAGE寄存器之间的关系:

全局地址最高位为00100时,将分页后的EEPROM空间映射给CPU。

低10位是CPU本地地址(共1K),刚好一个EEPROM页的大小。前面的8个位(bit10~bit17)对应的是EPAGE,最多可映射256页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983131.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ primier plus 函数探幽第二部分

系列文章目录 C primer plus 第一节 步入C-CSDN博客 C primer plus 第二节 hello world刨析-CSDN博客 C primer plus 第三节 数据处理-CSDN博客 C primer plus 第四节 复合类型-CSDN博客 C primer plus 第五节 循环-CSDN博客 C primier plus 第七节 函数探幽第一部分-CSDN博客 …

单细胞的一组基因或富集分数的高低表达分组差异分析作图教程

单细胞的一组基因或富集分数的高低表达分组计算差异分析和可视化教程 单细胞的一组基因或富集分数的高低表达分组计算 软件分析界面 运行结果 会得到一组基因或通路等富集分数的高低分组的seurat对象rds文件和meta.data文件 包含了指定的一组基因或富集分数的各自的高低表达分…

Qt之QGraphicsView图像操作

QGraphicsView图像操作:旋转、放大、缩小、移动、图层切换 1 摘要 GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景)、QGraphicsView(视图)、QGraphicsItem(图元)。QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显…

cSpell无法识别词语消除报错

VSCode extension: cSpell 使用VSCode时,cSpell可以帮助我们检查拼写错误。但是经常有一些单词会被误报,可以采取以下的方法解决。 1. 手动添加:将鼠标光标放在无法识别的词语上,左键点击Quick Fix,再次选择将未知词…

python的内置函数 - round()

知识点1 - round() 定义/功能 round() 是一个用于四舍五入的内置函数。它可以将一个浮点数或整数四舍五入到指定的小数位数。 知识点2 - round() 语法 round(number, ndigitsNone) number:需要四舍五入的数值(可以是整数或浮点数)。 nd…

SAP服务器进程预警通知

在财务月结,HR薪资核算等系统用户集中使用高峰时期。通过判断判断当前系统可用的并行对话框进程数,用户使用过多给出提示,服务器进程预警通知。 1. 根据配置的进程最大可使用率80%,根据进程数判断:当进程可用数少于20%…

无人机推流/RTMP视频推拉流:EasyDSS无法卸载软件的原因及解决方法

视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务,在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外,平台还支持用户自行上传视频文件,也可将上传的点播…

【工具】ProToDeviseR一个自动化的蛋白质拓扑方案生成器

文章目录 介绍代码案例参考 介绍 氨基酸序列表征是几乎任何蛋白质分析的基本组成部分,创建简洁清晰的蛋白质拓扑结构在蛋白质组学研究中具有重要意义。尽管存在许多数据库和预测服务器,但是将来自各种资源(有时是竞争资源)的数据…

数据结构基础(一)

文章目录 1 数据结构基础1.1 什么是程序?1.2 数据、数据元素、数据项、数据对象1.3 基本的逻辑结构 2 算法效率2.1 时间复杂度2.1.1 循环执行次数2.1.2 大O(n)表示法 2.2 空间复杂度 1 数据结构基础 1.1 什么是程序? ​ 程序 数据结构 + 算…

taosd 写入与查询场景下压缩解压及加密解密的 CPU 占用分析

在当今大数据时代,时序数据库的应用越来越广泛,尤其是在物联网、工业监控、金融分析等领域。TDengine 作为一款高性能的时序数据库,凭借独特的存储架构和高效的压缩算法,在存储和查询效率上表现出色。然而,随着数据规模…

RangeError: Maximum call stack size exceeded

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

《白帽子讲 Web 安全》之文件操作安全

目录 引言 (一)文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中,部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验,试图以此阻止非法文件上传…

[FE] React 初窥门径(五):React 组件的加载过程(commit 阶段)

1. 回顾 前一篇文章我们看到,ReactDOM.render 总共包含这些步骤, 然后介绍了 performSyncWorkOnRoot 做的事情,它主要做了两件事, renderRootSync 可称之为 render 阶段:创建了一颗 Fiber Tree(包含 html …

Elastic如何获取当前系统时间

文章目录 1. 使用 _ingest.timestamp 在 Ingest Pipeline 中获取当前时间2. 使用 Painless Script 获取当前时间3. 使用 now 关键字在查询中获取当前时间4. 使用 date 类型字段的默认值5. 使用 Kibana 的 Dev Tools 查看当前时间6. 使用 date 聚合获取当前时间7. 使用 Elastics…

Elasticsearch 2025/3/7

高性能分布式搜索引擎。 数据库模糊搜索比较慢,但用搜索引擎快多了。 下面是一些搜索引擎排名 Lucene是一个Java语言的搜索引擎类库(一个工具包),apache公司的顶级项目。 优势:易扩展、高性能(基于倒排索引…

计算机毕业设计Python+DeepSeek-R1大模型医疗问答系统 知识图谱健康膳食推荐系统 食谱推荐系统 医疗大数据(源码+LW文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

网络安全通信架构图

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 在安全通信里面我经常听到的2个东西就是SSL和TLS,这2个有什么区别呢?以及HTTPS是怎么通信的?包括对称加密、非对称加密、摘要、…

代码随想录算法训练营第22天 | 组合总和 分割回文串

39. 组合总和 39. 组合总和 - 力扣(LeetCode) 题目链接/文章讲解:代码随想录 视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_…

esp32 arduino开发常用函数(需要和乐鑫的arduino文档配合使用)

说明:1、由于写函数参数浪费时间并且没有说明只有参数意义不大,所以在此函数一般只以函数名出现。 2、esp32有两个核心,编号为0和1,如果启动了wifi和蓝牙,则会默认将wifi和蓝牙运行在编号为0的核心上。 3、esp32adc2…

《鸢尾花数学大系:从加减乘除到机器学习》开源资源

《鸢尾花数学大系:从加减乘除到机器学习》开源资源 Gitee:https://gitee.com/higkoo/ bilibili:https://space.bilibili.com/513194466 GitHub:https://github.com/Visualize-ML