一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

如何将数据从程序内存移动到SRAM以及如何使用数据指针从SRAM访问数据

来源:analog 发布时间:2023-08-07

摘要: 基于maxq的微控制器使用数据指针对SRAM进行读写。本应用笔记描述了如何将数据从程序内存移动到SRAM,以及如何使用数据指针从SRAM访问数据。

介绍

本应用笔记描述了如何使用数据指针DP[0]和BP[OFFS]将两个字的数据写入SRAM。然后使用相同的数据指针将数据从SRAM读入MAXQ的累加器,并在两个寄存器上执行逻辑“与”操作。

开始

首先,您需要了解MAXQ架构、寄存器映射和指令集的基本知识,这些知识可以从MAXQ系列用户指南或任何基于MAXQ的微控制器数据表中获得。MAXQ2000数据表就是一个很好的例子。您还需要参考MAXQ系列用户指南中的“访问数据内存”。假定您基本熟悉汇编语言,特别是MAXQ汇编器。

数据指针概述

在基于maxq的微控制器上有三个可用的数据指针:DP[0], DP[1]和BP[off]。通过在数据点控制(DPC)寄存器中设置相应的位,这些数据指针中的每一个都可以配置为字或字节访问模式。

名字函数
DP [0]数据指针0
DP [1]数据指针1
英国石油公司(关闭状态)框架指针底座
走开帧指针底座的偏移量
DPC数据指针控制
SDPS0
SDPS1
00b选择DP[0]作为活动指针
01b选择DP[1]作为活动指针
10b选择BP作为活动指针
WBS0DP[0]字模式WBSO= 1,字节模式WBSO=0
WBS1DP[1]字模式WBS1=1,字节模式WBSO=0
WBS2BP字模式WBS2=1,字节模式WBSO=0
注册位的位置
DP [0]DP[0](16位)
DP [1]DP[1](16位)
英国石油公司BP = BP[off](16位)
走开----off(8位)
DPCDPC(16位)
---WBS2WBS1WBS0SDPS1SDPS0

这三个指针在数据内存上共享一个读/写端口,因此用户必须在访问内存之前有意识地激活所需的指针。这可以显式地使用数据选择位(SDPS2:0;DPC.1:0),或者隐式地写入DP[n]、BP或off寄存器,如下所示。使用数据指针的任何间接内存访问也将设置SDPS位,从而激活指针作为活动源指针。


(显式)选择BP作为活动点,移动DP[1], DP[1];(隐式)选择DP[1];set SDPS1: 0=01bmove off, src;(隐式)BP选择;set SDPS1=1move @DP[0],src;(隐式)选择DP[0];设置SDPS1:0 = 00 b

递增/递减数据指针

数据指针可以使用前置和后递增/递减操作符与寄存器或虚拟NUL目标进行更新。数据指针的增/减操作如下:


移动NUL, @DP[0]++;增量DP[0]移动NUL, @DP[1]-;递减DP[1]移动NUL, @ bp [OFFS++];增量帧指针基数+偏移+ 1move @++DP[0], A[1];增加地址并存储A[1]在新地址;注意:只有前递增/递减可以使用;当写入内存时移动A[1], @DP[1]-;从DP[1]中读取值并存储在A[1]中

代码示例

  1. 使用DP[0]移动2个单词到SRAM。5555h被移到SRAM的第一个字,由int_Var1引用;aaaaah被移动到SRAM的第二个字,由int_Var2引用。Var_1和Var_2从SRAM读回到累加器A[0]和A[1]。


  2. 将DP[0]设置为word模式,在使用move DP[0], #int_Var1之前必须设置为激活状态,将int_Var1的地址加载到DP[0]中,同时也激活了DP[0]move @DP[0], #5555h,将5555h写入到地址为int_Var1move DP[0], #int_Var2的SRAM中,将int_Var1的地址写入到地址为int_Var2move DP[0], #0AAAAh,将AAAAh写入到地址为int_Var2move DP[0], #0AAAAh,将AAAAh写入到地址为int_Var2move DP[0]的SRAM中,#int_Var1;将int_Var1的地址装入DP[0]move A[0], @DP[0];将int_Var2的地址装入DP[0], #int_Var2;将int_Var2的地址装入DP[0]move A[1], @DP[0]

  3. 使用DP[1]将2个字节移动到SRAM。55h被移动到SRAM的第一个字节,由int_Var1引用;AAh被移动到SRAM的第二个字节,由int_Var2引用。Var_1和Var_2从SRAM读回到累加器A[0]和A[1]。


  4. 将DP[1]设置为字节模式,在使用move DP[1], #int_Var1之前必须设置为激活状态,将int_Var1的地址加载到DP[1]中,同时也激活了DP[1]move @DP[1], #55h,将55h写入到地址为int_Var1move DP[1], #int_Var2的SRAM中,将地址为int_Var1的地址写入到地址为int_Var2move DP[1], #0AAh,将AAh写入地址为int_Var2move DP[1]的SRAM中,#int_Var1;将int_Var1的地址装入DP[1]move A[0], @DP[1];将int_Var2的地址装入DP[1], #int_Var2;将int_Var2的地址装入DP[1], move A[1], @DP[1]

  5. 使用BP[off]移动2个单词到SRAM。5555h被移到SRAM的第一个字,由int_Var1引用;aaaaah被移动到SRAM的第二个字,由int_Var2引用。Var_1和Var_2从SRAM读回到累加器A[0]和A[1]。


  6. 设置BP[off]为word modemove BP, #0h;设置BP为0并激活BP[off]move off, #int_Var1;将int_Var1的地址加载到OFFSmove @BP[off], #5555h;将5555h写入到地址为int_Var1move off, #int_Var2的SRAM中;将int_Var1的地址加载到地址为int_Var1move off的SRAM中;读取int_Var2的地址到offmove A[1], @BP[OFFS],读取int_Var2的地址到offmove A[1], @BP[OFFS],读取int_Var2move AP的地址,#0,选择累加器0和A[1],并将A[1]和A[0]存储在A[0]中

无效数据指针指令

以下是数据指针的错误用法:

汇编指令问题解决方案
DP [0], DP[0]移动[1],@DP[0]移动[2],@DP [1]
数据指针初始化为DP[0]。需要重新初始化为DP[1]。
DP [0], DP[0]移动[1],@DP [0] DP [1], DP[1][2],移动@DP [1]
移动BP[off], #0h
BP和off必须分别初始化。
移动BP, #0hmove off, #0h
移动@DP[0]++, A[0]
只能使用预增/预减。
移动@++DP[0], A[0]
移动A[0], @++DP[0]
只能使用后加/后减。
移动A[0], @DP[0]——
移动@++DP[0], @DP[0]++
无法增加数据指针并使用相同的数据指针存储它。
移动A[1], @DP[0]++移动@++DP[0], A[1]
移动@DP[0]++, A[1]
不能对目标使用自增/自减后值。
move @DP[0], A[1]move NUL, @DP[0]++
移动A[0], @—DP[0]
不能对源使用预自增/自减。
移动A[0], @DP[0]



声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: