找回密码
 立即注册
查看: 288|回复: 6

奇怪,stc8g1k08的程序到了stc8h1k08上面,EEP相关程序不动了

[复制链接]

该用户从未签到

4

主题

9

回帖

68

积分

注册会员

积分
68
发表于 2023-9-8 11:55:24 | 显示全部楼层 |阅读模式
8G和8H最大的差别是(至少就我的认识)
8G有PCA,没有高级PWM,
而8H有高级pwm而没有PCA,

除此之外,看pdf这2个芯片几乎是一样的,
差异部分经过修改,用PWM替代PCA部分动起来了,
但是之前在8G上正常运行的EEP读写却失效了,有点莫明其妙.


回复 送花

使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:53
  • 签到天数: 140 天

    [LV.7]常住居民III

    26

    主题

    1337

    回帖

    4159

    积分

    论坛元老

    积分
    4159
    发表于 2023-9-8 17:06:49 | 显示全部楼层
    烧录附件例程到芯片里测一下试试看

    STC8-EEPROM多字节读写操作-通过串口1输出.zip

    8.28 KB, 下载次数: 17

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    4

    主题

    9

    回帖

    68

    积分

    注册会员

    积分
    68
     楼主| 发表于 2023-9-11 17:02:01 | 显示全部楼层
    莫名其妙的解决了,虽然仍然运行不稳定,但是初步解决了,
    原因是IAP操作后要2个nop,1个nop不行,原因不明
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9436

    回帖

    1万

    积分

    管理员

    积分
    14021
    发表于 2023-9-11 21:42:18 | 显示全部楼层
    你程序贴出来大家看看,没这个要求啊
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    4

    主题

    9

    回帖

    68

    积分

    注册会员

    积分
    68
     楼主| 发表于 2023-9-12 10:27:09 | 显示全部楼层
    本帖最后由 zealot 于 2023-9-12 10:37 编辑

    读eep用的movc,这基本没有什么可以说,出问题的可能也不大,忽略.
    主要是写和擦的部分吧.

    擦:
    // void erase_page(u8 Addr);    // Addr是地址,要清除第一页,Addr为第一页内任意地址(原则上可以随意指定,实际上必须页头00位)
    void erase_page(void){
        IAP_CONTR = 0b10000000; // IAPEN x x CMD_FAIL x x x x
        IAP_TPS = 24;              // system on 24M.
        IAP_ADDRL = 0; IAP_ADDRH = 0;
        IAP_CMD = 3;            // 00 nop; 01 read(movc更好); 10Write; 11Erase;
        IAP_TRIG = 0x5A; IAP_TRIG = 0xA5;
        __asm
        nop
        nop                   // 2nop系统正常,删除第2nop,eep就崩了
        __endasm;
    }

    数据写入eep:
    void SaveData2EEP(void){
        // 此子程序耗时超长,甚至到xx ms(毫秒)的程度,
        // 保存所有数据从Xram(或者全局变量设置等)到EEP, 包括xxxx 总之就是保存数据到EEP的意义.
        EA=0;// TPOff(); //Disable_accessEXxram();
        erase_page();       // 清除所有数据
        __asm
    // 这里和eep无关,删除了.基本是数据处理
        // 数据都在Xram里面了,循环写到EEP里面.
        mov     r0, #0
        mov     r1, #16
    1$:
        movx    a, @r0
        mov     _IAP_CONTR, #0x80
        mov     _IAP_TPS, #24
        mov     _IAP_DATA, a
        mov     _IAP_ADDRL, r0
        mov     _IAP_ADDRH, #0
        mov     _IAP_CMD, #2
        mov     _IAP_TRIG, #0x5A
        mov     _IAP_TRIG, #0xA5
        nop
        nop                   // 2nop系统正常,删除第2nop,eep就崩了
        inc     r0
        djnz    r1, 1$
        __endasm;
        IAP_DATA=0; IAP_ADDRL=0; IAP_ADDRH=0x80; IAP_CMD=0; IAP_CONTR=0; IAP_TRIG=0;        // set IAP system to Idle.
        EA=1;
    }



    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    4

    主题

    9

    回帖

    68

    积分

    注册会员

    积分
    68
     楼主| 发表于 2023-9-12 10:36:14 | 显示全部楼层
    注意,这里的C和asm都是sdcc风格,不是kali风格,因为我这里编译是通过,并且连警告都没有的,基本上领会思想就好,格式问题忽略掉吧.
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    4

    主题

    9

    回帖

    68

    积分

    注册会员

    积分
    68
     楼主| 发表于 2023-9-13 16:00:32 | 显示全部楼层
    读eep的部分,不过应该没有用

    void ReadEEPdata(void){
            EA=0;// TPOff(); //Disable_accessEXxram();

            // 直接汇编写,省的概念混淆.
            // 从EEP到XRAM
            __asm

            // eep地址0,对应movc其实是0x2000
            mov                dptr, #0x2000
            mov                r0, dpl
            // Xram地址正常
            mov                r1, #0
            // 总共16个数据,其实没有那么多,但是先多预一点
            mov                r3, 16
    1$:
            mov                dpl, r0
            clr                a
            movc        a, @a+dptr
            movx        @r1, a
            inc                r0
            inc                r1
            djnz        r3, 1$

            // 读EEP完成,开始解析XRAM中的数据
            mov                r0, #a1
            movx        a, @r0
            mov                _a1, a
            inc                r0
            movx        a, @r0
            mov                _a1+1, a
            mov                r0, #a2
            movx        a, @r0
            mov                _a2, a
            inc                r0
            movx        a, @r0
            mov                _a2+1, a
            mov                r0, #addr_a3bit
            movx        a, @r0
            mov                c, acc.0
            mov                _a3bit, c
            mov                r0, #a4
            movx        a, @r0
            mov                _a4, a
            __endasm;
            EA=1;
    }
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-15 08:47 , Processed in 0.067170 second(s), 55 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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