STC15 - ExternalRAM_enable()/InternalRAM_enable()

news2024/9/22 13:35:56

文章目录

    • STC15 - ExternalRAM_enable()/InternalRAM_enable()
    • 概述
    • 实验环境
    • MCU的规格区别
    • IAP15F2K61S2的使用限制
    • 实验的组合
    • 公用测试代码
    • 1. 没有焊接外部RAM + ExternalRAM_enable()
    • 2. 没有焊接外部RAM + InternalRAM_enable()
    • 3. 焊接外部RAM + ExternalRAM_enable()
    • 4. 焊接外部RAM + InternalRAM_enable()
    • 总结
    • END

STC15 - ExternalRAM_enable()/InternalRAM_enable()

概述

发现使用STC15的外部扩展内存和内部扩展内存时, 有一些问题(访问xdata不是100%好使, 这不是STC的问题, 而是使用问题). 实验总结一下.

实验环境

MDK5
STC15F2K60S2(直接跑程序)
IAP15F2K61S2(仿真单步调试)
STC15函数库
STC15实验箱4

MCU的规格区别

看看STC15F2K60S2和IAP15F2K61S2的规格区别
在这里插入图片描述
可以看出, IAP15比STC15程序空间大1K, 其他基本一致.

IAP15F2K61S2的使用限制

在这里插入图片描述
可以看出如果没有外接片外RAM, 只能使用0x400(1KB)大小的RAM(xdata)区域.
实验也能看出, 执行InternalRAM_enable(), 如果操作0x400之后的RAM, MDK工程就挂了(仿真器失去连接).
这个不看官方说明真不知道, 因为IAP15F2K61S2内部扩展RAM总共有0x700(1792)字节.

实验的组合

板子上是/否焊接了外部RAM + ExternalRAM_enable()/InternalRAM_enable()
一共4种组合, 看看访问0~32KB都是啥情况(是否读写正确, 是否会挂掉)
因为要单步调试, 都使用IAP15F2K61S2来实验

公用测试代码

根据组合的不同, 调用ExternalRAM_enable()/InternalRAM_enable()后, 再执行下面的公用测试代码(访问32KB的xdata)

	u16 data i = 0; // !
	
	// ExternalRAM_enable(); 
	// InternalRAM_enable();
	
	EA = 1;
	
	// 最大可以访问的xram范围 32KB(如果焊接了32KB的外部RAM)
	// 分为3个xram区域 低1KB(0 ~ 0x3ff), 中间的792B(0x400 ~ 0x6ff), 高区域到32KB(0x700 ~ 0x7fff)
	
	// 访问xram区域-低1KB - 0x0 ~ 0x3ff
	for (i = 0x0; i <= 0x3ff;)
	{
		pbuf = (u8 xdata*)i;
		memset(pbuf, (u8)i, 0x100);
		i += 0x100;
	}
	
	// 访问xram区域-中间792B - 0x400 ~ 0x6ff
	for (i = 0x400; i <= 0x6ff;)
	{
		pbuf = (u8 xdata*)i;
		memset(pbuf, (u8)i, 0x100);
		i += 0x100;
	}
	
	// 访问xram区域-高至32KB - 0x700 ~ 0x7fff
	for (i = 0x700; i <= 0x7fff;)
	{
		pbuf = (u8 xdata*)i;
		memset(pbuf, (u8)i, 0x100);
		i += 0x100;
	}

1. 没有焊接外部RAM + ExternalRAM_enable()

在这里插入图片描述
调用ExternalRAM_enable()后, 再执行公用测试代码(访问32KB的xdata)
代码可以跑(没有挂掉), 但是没效果(没有将xdata区域memset成预期的值), 因为这时就没有实际的外部xram.
可以看出, 即使是0x0~0x400, 也使用的是外部扩展RAM.

2. 没有焊接外部RAM + InternalRAM_enable()

在这里插入图片描述
调用InternalRAM_enable()后, 再执行公用测试代码(访问32KB的xdata)

0x0 ~ 0x3ff 访问是正确的, 说明使用的是内部扩展RAM.
0x400 ~ 0x6ff访问异常, 当执行memset时, 单步调试失去响应. 因为从0x400~0x6ff是IAP15F2K61S2自己要用.
0x700 ~ 0x7fff, 代码可以跑(没有挂掉), 但是没效果(没有将xdata区域memset成预期的值), 因为这时就没有实际的外部xram.
综合以上实验效果, 可以看出, InternalRAM_enable()时, 0x0~ 0x6ff使用的就是内部扩展RAM.

3. 焊接外部RAM + ExternalRAM_enable()

在这里插入图片描述
0x0 ~ 0x3ff 访问正确
0x400 ~ 0x6ff访问正确, 这说明外接SRAM + ExternalRAM_enable()时, 完全使用的是外部RAM
而不是0~1792使用内部扩展RAM, 1792之外使用外部RAM

0x700 ~ 0x7fff, 访问正确
综合以上实验效果, 可以看出, ExternalRAM_enable()时, 0x0~ 0x7fff使用的都是外部扩展RAM.

4. 焊接外部RAM + InternalRAM_enable()

在这里插入图片描述
0x0 ~ 0x3ff 访问正确
0x400 ~ 0x6ff访问异常, 这说明InternalRAM_enable()时, 0x400 ~ 0x6ff使用的是内部扩展RAM
0x700 ~ 0x7fff, 访问正确, 说明即使时执行的InternalRAM_enable(), 超过内部扩展RAM边界(0x6ff)时, 如果接了物理上的外部RAM, 也会自动切到外部RAM上.

总结

  • 如果执行了ExternalRAM_enable(), 访问的都是外部扩展RAM, 内部扩展RAM(0x0~ 0x6ff)就浪费掉了, 我们无法去使用.
  • 如果执行了InternalRAM_enable(), 0x400 ~ 0x6ff就是IAP15F2K61S2自己用的, 我们不能用.
  • 如果执行了InternalRAM_enable(), 如果此时有物理上的外部扩展RAM, 超过0x700后, 会自动切到外部扩展RAM.
  • 如果接了外部扩展RAM, 还是执行ExternalRAM_enable()好一些, 可以使用外部扩展RAM的0x400~0x6ff.

如果外接了外部扩展RAM, 会占用P0(全部IO), P2口(部分IO), 此时, 就不建议在P0和用到的P2IO(被XRAM用到的部分IO)上外接设备(e.g. 12864), 会引起访问xram失败(读的不是真正的XRAM地址的值, 设置的XRAM地址的值, 读回来也不正确, 使用C库函数(e.g. strlen, sprint, memset效果都不正确). 像51单片机, 外接RAM, 是挺不划算的. 如果真是RAM不够, 就要考虑使用ARM, RISC-V类型的单片机.

END

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

世界杯狂欢季,家居品牌仅靠4位UP增长2000wB站声量

时隔四年&#xff0c;2022年卡塔尔世界杯于11月21日正式开始&#xff0c;直至目前比赛进度已过半程&#xff0c;这场世界赛事备受各国瞩目&#xff0c;全网有关于“足球”的运动信息接踵而至。 飞瓜数据&#xff08;B站版&#xff09;显示&#xff0c;B站平台带有“世界杯”标…

React源码之概念篇

React主要的三部分 这是从ReactDom.render后触发的步骤 调度协调渲染 设计理念 首先在React中需要在浏览器刷新一次就需要执行如下的步骤&#xff1a; JS脚本执行->样式布局->样式绘制&#xff0c;如果js执行时间超过了16.6ms&#xff0c;那么就没有时间留给样式布局…

[附源码]计算机毕业设计良辰之境影视评鉴系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【viper】go 配置管理神器viper使用详解

目录一、viper简介二、基本使用1.viper基本配置2.读取配置3.自定义配置源4.注册别名4.获取环境变量5.获取命令行参数6.多实例使用7.监听配置变化三、读取远程配置四、保存配置一、viper简介 viper是一个应用程序解决方案&#xff0c;它支持在应用程序内使用&#xff0c;特性如…

基于元胞自动机的人员疏散模拟器研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

[前端面试题]:数组去重的几种方法

总结一些日常需要用到的一些api&#xff0c;也是在一些面试中会经常出现的题目&#xff0c;今天分享的是数组去重的几个不同的方法&#xff0c; 同时文章也被收录到我的《JS基础》专栏中&#xff0c;欢迎大家点击收藏加关注。 给大家推荐一个实用面试题库 1、前端面试题库 &am…

魔兽世界开服架设教程—魔兽国服停服时间已确定!玩家该何去何从

《魔兽世界》国服停止运营时间定在&#xff0c;2023年1月24日0点起 近期随着暴雪和网易公司先后发出的公告&#xff0c;《魔兽世界》国服关服时间已经十分确定了&#xff0c;国服停运时间定在明年的1月24号0点起正式关服。随着国服将关闭&#xff0c;魔兽私服即将崛起。毕竟在游…

【Java面试】并发

文章目录线程有那些状态&#xff1f;一个程序来显示状态切换过程正常执行流程阻塞执行流程等待执行流程说说线程池的核心参数wait和sleep的区别Lock和synchronized的区别Lock中Condition的使用说说Java中的悲观锁与乐观锁乐观锁悲观锁Hashtable和ConcurrentHashMap的区别&#…

【玩转算法】(初始)动态规划

本期主题&#xff1a;动态规划&#xff0c;及其相关oj题。博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限&#xff0c;出现错误希望大家不吝赐 &#x1f341;1&#xff09;DP定义 动态规划是分治思想的延伸&#xff0c;通俗一点来说…

核酸检测预约系统毕业设计,核酸检测系统设计与实现,毕业设计怎么写论文毕设源码开题报告需求分析怎么做

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的疫情核酸检查预约系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于java的springboot框架下开发&#xff1b;&#xff1b;通过后台设置医院信息、录入医院科室信息、录入医生信息、设…

CVE-2015-4852 Weblogic T3 反序列化分析

0x01 前言 看到很多师傅的面经里面都有提到 Weblogic 这一个漏洞&#xff0c;最近正好有一些闲暇时间&#xff0c;可以看一看。 因为环境上总是有一些小问题&#xff0c;所以会在本地和云服务器切换着调试 0x02 环境搭建 太坑了&#xff0c;我的建议是用本地搭建的方法&…

DeadObjectException解题

DeadObjectException解题 RemoteException occurs on reporting focusChanged, wWindow{2470935 u0 bundle_id/bundle_id.MainActivity}android.os.DeadObjectExceptionat android.os.BinderProxy.transactNative(Native Method)at android.os.BinderProxy.transact(Binder.ja…

十大开源测试工具和框架

免费的开源框架和工具由于其开源特性&#xff0c;现在逐渐成为自动化测试的首选解决方案。区别在于&#xff0c;你是喜欢使用类库编写一个全新的自动化测试框架&#xff0c;或者喜欢使用一个现成的工具。 本文帮忙你快速了解 10 大免费和开源测试工具、框架。 Katalon Studio…

【python】昔去雪如花,今来花似雪,今日份雪花快递到啦

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~ 大雪已至&#xff0c;冬天无恙&#xff0c;愿这个冬天的你&#xff0c;不缺暖阳&#xff0c;好日常在 小时候&#xff0c;冬天最盼望的就是下雪了~雪一下 在地上铺上一层雪白的毛毯的时候甚是好看~ 还能堆堆雪人、打打雪仗…

如何使用 django-import-export + pandas 在 Django 视图中导入 excel 数据

我想每个人都熟悉所有强大的库 django-import-export,它允许我们在 Django 的管理面板中导入和导出数据,但是如果你想让用户在网络上上传 excel 文件或通过 REST 上传它怎么办应用程序接口。最近,我遇到了类似的问题。经过大量研究,我找到了一种使用 Django 方式将数千个数…

基于jsp+mysql+ssm生鲜超市进销存管理系统-计算机毕业设计

项目介绍 目前超市越来越多&#xff0c;越来越普及&#xff0c;如何高效的管理经营超市才是成功的关键,其中对于中小型超市来说&#xff0c;在降低成本的前提下使用最有效的管理方式是非常重要的&#xff0c;所以开发中小型超市管理系统既考虑了成本相对较低又非常实用的特点。…

博客系统(前后端分离)

文章目录前言一、需求分析1.功能2.环境二、前端实现1.博客注册页2.博客登录页3.博客列表页4.博客详情页5.博客编辑页三、后端实现1.设计数据库表2.封装连接数据库的公共操作3.封装对博客表和用户表的操作4.实现博客列表页、博客详情页、博客编辑页的后端服务5.实现博客登录页面…

linux关于ssh免密登录、known_hosts文件

1. 关于ssh SSH 是 Secure Shell 的缩写&#xff0c;SSH 为建立在应用层基础上的安全协议。SSH 是目前广泛采用的安全登录协议&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议&#xff0c;替代以前不安全的Telnet协议。利用 SSH 协议可以有效防止远程管理过程中的…

springboot车辆管理系统的设计与实现毕业社会源码031034

车辆管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&…

java常量定义在interface和final class的区别?

问题现象&#xff1a; java常量定义在 interface 和 final class 的区别&#xff1f; 问题分析&#xff1a; 最近在项目开发规范中&#xff0c;发现有要求使用 interface类 来定义常量&#xff01; 这让我想起来以前一直是用 final class 来定义常量的&#xff1b;那么这两者是…