找回密码
 立即注册
查看: 1790|回复: 10

8H系列双DPTR双数据指针,KEIL C51没原生支持,需要使用汇编来改写对应的函数

[复制链接]

11

主题

340

回帖

929

积分

荣誉版主

积分
929
发表于 2023-9-8 18:14:44 | 显示全部楼层 |阅读模式
真 1T 的8H系列双DPTR可以自动反转,自动++或者自动--
比Atmel/Philips 设计的双DPTR速度更快,更加合理。
可惜 keil C51 原生不支持,需要使用汇编改写对应的函数

AI8 系列MCU 数据手册 下载
深圳国芯人工智能有限公司-产品_STC8H系列 (stcai.com)


截图202409270819313329.jpg


截图202409270820074045.jpg


截图202409270821036090.jpg
截图202409270821413093.jpg

截图202409270822132997.jpg

1,仿真不能单步调试,
可以设置 断点 F5 全速,或者 F10 整个函数运行。
截图202309081931325018.jpg

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入栈必须在中断函数前面,如果有使用变量,加上花括号就可以。参考下面的例子:
  1. unsigned int  interruptcnt;
  2. unsigned char second;
  3. void timer0 (void) interrupt 1{
  4.     _push_(DPS);
  5.     _push_(DPL1);
  6.     _push_(DPH1);
  7.    
  8.     {
  9.         char xdata buf [] = "01";
  10.         if (++interruptcnt == 10)  {   
  11.             second++;                     
  12.             interruptcnt = 0;         
  13.         }
  14.    
  15.     }
  16.     _pop_(DPH1);
  17.     _pop_(DPL1);
  18.     _pop_(DPS);
  19. }
复制代码

5,改写string.h的函数,拷贝数据code到xdata或者xdata到xdata
速度加快了2到3倍。


6,若需要单独使能AU1 或者AU0,
则必须使用TA寄存器触发DPS 的保护机制。
不建议单独控制。不然中断对DPS出栈的时候需要单独处理,太麻烦了。通过修改string.h里面的函数测试,AU1 和AU0 同时使能方式,完全没有问题。

截图202309081807014041.jpg

7,keil不支持STC8系列的双数据指针,
不能在软件里面选Use multiple DPTR registers,
当然也不能使用#pragma modp2
截图202309081821031504.jpg

8, 真 1T 的8H系列双DPTR可以自动反转,自动++或者自动--,
比Atmel/Philips 设计的双DPTR速度更快,更加合理。
可惜 keil 原生不支持,需要使用汇编改写对应的函数。


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-04-15 09:09:55

12

主题

28

回帖

246

积分

中级会员

积分
246
发表于 2023-11-11 10:34:18 来自手机 | 显示全部楼层
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?

LED点亮世界🇨🇳
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-04-15 09:09:55

12

主题

28

回帖

246

积分

中级会员

积分
246
发表于 2023-11-11 10:43:31 来自手机 | 显示全部楼层
抱歉抱歉,属实没有仔细阅读。原来这就是您提出的问题…哈哈哈。
LED点亮世界🇨🇳
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 01:05:02

1

主题

114

回帖

1695

积分

金牌会员

积分
1695
发表于 2023-11-11 10:49:08 | 显示全部楼层
学习了感谢分享
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-9-26 19:28:31 | 显示全部楼层
本帖最后由 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?



点评

单独使能方式,上面的第6点有介绍呀,多阅读几遍。  详情 回复 发表于 2024-11-1 08:34
回复 支持 反对

使用道具 举报 送花

11

主题

340

回帖

929

积分

荣誉版主

积分
929
发表于 2024-11-1 08:34:16 | 显示全部楼层
139182*** 发表于 2024-9-26 19:28
STC8H  把DPS设置为 #00011000B 不成功, 即TSL不自动切换
但是AU1,AU0都设置为使能, 自动增加

单独使能方式,上面的第6点有介绍呀,多阅读几遍。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-11-1 10:04:32 | 显示全部楼层
80251已经可以不需要这东东了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:53
  • 最近打卡:2024-12-27 08:18:49

0

主题

132

回帖

136

积分

注册会员

积分
136
发表于 2024-11-11 12:40:15 | 显示全部楼层
学习了
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-04-29 07:45:37

3

主题

74

回帖

358

积分

中级会员

积分
358
发表于 2024-12-15 15:19:17 | 显示全部楼层

双指针有什么好处呢?

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-04-29 07:45:37

3

主题

74

回帖

358

积分

中级会员

积分
358
发表于 2025-1-7 08:31:09 | 显示全部楼层

学习学习

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:37 , Processed in 0.151644 second(s), 125 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表