8H系列双DPTR双数据指针,KEIL C51没原生支持,需要使用汇编来改写对应的函数
真 1T 的8H系列双DPTR可以自动反转,自动++或者自动--,比Atmel/Philips 设计的双DPTR速度更快,更加合理。
可惜 keil C51 原生不支持,需要使用汇编改写对应的函数。
AI8 系列MCU 数据手册 下载
深圳国芯人工智能有限公司-产品_STC8H系列 (stcai.com)
1,仿真不能单步调试,
可以设置 断点 F5 全速,或者 F10 整个函数运行。
2,DPTR1是可以读取code区的内容的。
官方例子方案烧录进板子去运行,结果对的。
只是不能仿真,调试发现,
执行MOV DPTR,#1000H 后,不会自动切换到DPTR1
; MOV DPS,#00100000B ;使能TSL,并选择DPTR0
; MOV DPTR,#1000H ;将1000H写入DPTR0中,执行完成后选择DPTR1为DPTR
; MOV DPTR,#0103H ;将0103H写入DPTR1中
2种解决方法
方案1:
MOV DPS,#00000000B ;选择DPTR0,默认就是DPTR0,可以屏蔽
MOV DPTR,#1000H ;将1000H写入DPTR0中
MOV DPS,#00000001B ;选择DPTR1
MOV DPTR,#0103H ;将0103H写入DPTR1中
方案2:
MOV DPTR,#1000H ;将1000H写入DPTR0中
MOV DPL1,#03H
MOV DPH1,#01H ;将0103H写入DPTR1中
3,如果对DPTR1传数据最好使用DPL1和DPH1,
这样可以不用理会DPS的设置,仿真调试也可以成功。
MOV DPL1,#03H
MOV DPH1,#01H ;将0103H写入DPTR1中
4,使用双DPTR 后,对于中断函数使用有注意事项。
需要对DPS,DPL1。DPH1进行现场保护。
对DPS,DPL1。DPH1入栈必须在中断函数前面,如果有使用变量,加上花括号就可以。参考下面的例子:
unsigned intinterruptcnt;
unsigned char second;
void timer0 (void) interrupt 1{
_push_(DPS);
_push_(DPL1);
_push_(DPH1);
{
char xdata buf [] = "01";
if (++interruptcnt == 10){
second++;
interruptcnt = 0;
}
}
_pop_(DPH1);
_pop_(DPL1);
_pop_(DPS);
}
5,改写string.h的函数,拷贝数据code到xdata或者xdata到xdata
速度加快了2到3倍。
6,若需要单独使能AU1 或者AU0,
则必须使用TA寄存器触发DPS 的保护机制。
不建议单独控制。不然中断对DPS出栈的时候需要单独处理,太麻烦了。通过修改string.h里面的函数测试,AU1 和AU0 同时使能方式,完全没有问题。
7,keil不支持STC8系列的双数据指针,
不能在软件里面选Use multiple DPTR registers,
当然也不能使用#pragma modp2
8, 真 1T 的8H系列双DPTR可以自动反转,自动++或者自动--,
比Atmel/Philips 设计的双DPTR速度更快,更加合理。
可惜 keil 原生不支持,需要使用汇编改写对应的函数。
2,DPTR1是可以读取code区的内容的。
官方例子方案烧录进板子去运行。结果对的。只是不能仿真,调试发现,执行MOV DPTR,#1000H 后,不会自动切换到DPTR1
; MOV DPS,#00100000B ;使能TSL,并选择DPTR0
; MOV DPTR,#1000H ;将1000H写入DPTR0中,执行完成后选择DPTR1为DPTR
; MOV DPTR,#0103H ;将0103H写入DPTR1
熊哥 不是很理解您写的这一段。在选中DPTR0,赋值1000H完成后。是硬件自动又重新将DPTR选择为DPTR1了吗?
不然为何 0103H的数值传送给了DPTR1?而不是DPTR0?
抱歉抱歉,属实没有仔细阅读。原来这就是您提出的问题…哈哈哈。 学习了感谢分享 本帖最后由 13918210822 于 2024-9-27 14:07 编辑
STC8H把DPS设置为 #00011000B 不成功, 即TSL不自动切换
但是AU1,AU0都设置为使能, 自动增加
目前成功的只有#00111000B 和 #0
想设置成DPTR0/1不自动切换,但是都分别自动增加
请问有没有成功的窍门?
是不是, 不激活TSL, 只自动++, 一直不成功, 是不是硬件的bug?
MOV DPS, #00000000B
MOV DPTR, #FCBX
MOVX A, @DPTR
MOV B, ACC ;B 1st byte in FCBX, high byte of entry
INC DPTR
MOVX A, @DPTR ;A 2nd byte in FCBX, low byte of entry
;call entry
PUSH ACC
PUSH B
RET
这个可以支持,说明数据没有问题
我想省略INC DPTR 但是不要自动切换DPTR0/1
把DPS设置为 #00011000B 就一直不成功
哪位熟悉指令的兄弟帮忙指点一下,或者帮忙报个bug?
13918210822 发表于 2024-9-26 19:28
STC8H把DPS设置为 #00011000B 不成功, 即TSL不自动切换
但是AU1,AU0都设置为使能, 自动增加
单独使能方式,上面的第6点有介绍呀,多阅读几遍。 80251已经可以不需要这东东了 学习了 <p>双指针有什么好处呢?</p>
<p>学习学习</p>
页:
[1]
2