摘要: 基于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作为活动指针 |
WBS0 | DP[0]字模式WBSO= 1,字节模式WBSO=0 |
WBS1 | DP[1]字模式WBS1=1,字节模式WBSO=0 |
WBS2 | BP字模式WBS2=1,字节模式WBSO=0 |
注册 | 位的位置 | |||||||
DP [0] | DP[0](16位) | |||||||
DP [1] | DP[1](16位) | |||||||
英国石油公司 | BP = BP[off](16位) | |||||||
走开 | - | - | - | - | off(8位) | |||
DPC | DPC(16位) | |||||||
- | - | - | WBS2 | WBS1 | WBS0 | SDPS1 | SDPS0 |
这三个指针在数据内存上共享一个读/写端口,因此用户必须在访问内存之前有意识地激活所需的指针。这可以显式地使用数据选择位(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]中
使用DP[0]移动2个单词到SRAM。5555h被移到SRAM的第一个字,由int_Var1引用;aaaaah被移动到SRAM的第二个字,由int_Var2引用。Var_1和Var_2从SRAM读回到累加器A[0]和A[1]。
将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]
使用DP[1]将2个字节移动到SRAM。55h被移动到SRAM的第一个字节,由int_Var1引用;AAh被移动到SRAM的第二个字节,由int_Var2引用。Var_1和Var_2从SRAM读回到累加器A[0]和A[1]。
将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]
使用BP[off]移动2个单词到SRAM。5555h被移到SRAM的第一个字,由int_Var1引用;aaaaah被移动到SRAM的第二个字,由int_Var2引用。Var_1和Var_2从SRAM读回到累加器A[0]和A[1]。
设置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] |
社群二维码
关注“华强商城“微信公众号
Copyright 2010-2023 hqbuy.com,Inc.All right reserved. 服务热线:400-830-6691 粤ICP备05106676号 经营许可证:粤B2-20210308