找回密码
 立即注册
楼主: 杨***

STC32G/F系列单片机是32位单片机吗?

[复制链接]
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3998

    积分

    荣誉版主

    积分
    3998
    发表于 2023-2-12 18:00:15 | 显示全部楼层
    STC32 如仅想跟 M0  PK, 就这样混混也行.

    我提议增加指令集, 主想是想跟 M3  PK, 对于我来说, 也有点事(扩充基本应用库)好做.

    要想让 STC32 , 达到 M3的高度, 需扩充的指令集较多.

    所以, 神农鼎 如有兴趣, 可先扩展 STC8系列的 指令, 没几条, 很容易实现的.

    一. 现在网上反应最大的, 是双指针功能,怎么用? STC官方为何不搞个 应用LIB出来?

        我上 STC官网, 时间不长, 已看到好几个同学问了, 我对 STC8的现在 DPTR体系, 考虑了很久,

        结论是, 无从下手, 硬件设计拍脑袋, 根本没考虑软件(指C)的编写, 以及与 Keil C编译器的无缝嵌入,

        假如单纯执行 双指针程序没问题, 但一有中断就有影响, 如中断中使用 DPTR, 需手工插入保护代码(非老司机极易出错)

        STC8H最新推出的, 号称最强的双DPTR, 没有一点用处, 用了反而更要出问题. 当然 STC8H有带 DMA的,可用 DMA传输.

        对不带 DMA的, 比如我想用双DPTR, 并且只需要 1个DPTR有自动增1 功能, 传输的数据量有点大, 不能全程关中断,

        这个时候问题来了, 主程序正常调用 编写的 双DPTR传输程序, 如此时进入中断, 需保护主程序使用到的 相关 DPTR寄存器,

        中断返回时恢复现场, 问题来了, 由于主程序 设置了单个DPTR自动增1 功能, 用到了 TA寄存器, 而TA寄存器又被 设计者

        拍脑袋搞了一个写保护模式, 有写入时间和写入时序要求, 让中断程序如何保护和恢复???

        所有我说, STC8H最新推出的, 号称最强的双DPTR, 没有一点用处, 把TA寄存器的写保护模式去掉, 还可以用用.

  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3998

    积分

    荣誉版主

    积分
    3998
    发表于 2023-2-12 18:00:43 | 显示全部楼层
        建议利用8051指令集中, 不存在的0xA5, 作为指令前缀, 扩充 8051指令集.


    方案1. 将 DPH, DPL 寄存器, 恢复为原单 DPTR指针.

        将 DPH1, DPL1 寄存器, 设置为新增加的双指针寄存器 DPH2, DPL2, 可乒乓依次输入 DPTR2, DPTR3指针.

        保留 DPS寄存器, 专供 DPTR2, DPTR3指针使用. 去除 TA寄存器(不去除也行), 没什么用处

        仅增加 3条 到 4条 新指令即可.

        具体为:  MOVX    A,@DPTR2 (指令加前缀 0xA5)
                 MOVX    @DPTR2,A (指令加前缀 0xA5)
                 INC     DPTR2    (指令加前缀 0xA5)
                 DEC     DPTR2    (指令加前缀 0xA5, 可选)

    方案2. 将 DPH, DPL 寄存器, 恢复为原单 DPTR指针.

        将 DPH1, DPL1 寄存器, 设置为新增加的双指针寄存器 DPH2, DPL2.

        将 DPS, TA 寄存器, 设置为新增加的双指针寄存器 DPH3, DPL3.

        仅独立增加 8条 到 12条 新指令即可, 使用更方便.

        具体为:  MOVX    A,@DPTR2 (指令加前缀 0xA5)   // 基本读写指令
                 MOVX    @DPTR2,A (指令加前缀 0xA5)
                 MOVX    A,@DPTR3 (指令加前缀 0xA5)
                 MOVX    @DPTR3,A (指令加前缀 0xA5)
                 MOVX    A,@DPTR2++ (指令加前缀 0xA5) // 读写后, DPTR++指令
                 MOVX    @DPTR2++,A (指令加前缀 0xA5)
                 MOVX    A,@DPTR3++ (指令加前缀 0xA5)
                 MOVX    @DPTR3++,A (指令加前缀 0xA5)
                 MOVX    A,@--DPTR2 (指令加前缀 0xA5) // --DPTR后, 再读写 指令(可选)
                 MOVX    @--DPTR2,A (指令加前缀 0xA5)
                 MOVX    A,@--DPTR3 (指令加前缀 0xA5)
                 MOVX    @--DPTR3,A (指令加前缀 0xA5)


  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3998

    积分

    荣誉版主

    积分
    3998
    发表于 2023-2-12 18:02:06 | 显示全部楼层
    STRING.H 文件包含下面字符串和缓冲区操作程序的原型

    下面程序使用到双数据指针
    memccpy  ; C            从一个缓冲区拷贝数据字节到另一个缓冲区直到一个指定的字符或字符数
    memcmp   ; asm 可重入   比较两个不同缓冲区给定数目的字符
    memcpy   ; asm 可重入   从一个缓冲区拷贝指定数目的数据到另一个缓冲区
    memmove  ; asm 可重入   从一个缓冲区拷贝指定数目的数据到另一个缓冲区
    strcmp   ; asm 可重入   比较两个字符串
    strcpy   ; asm 可重入   拷贝一个字符串到另一个
    strcspn  ; C            返回一个字符串中和第二个字符串的任何字符匹配的第一个字符的索引
    strncat  ; C            从一个字符串连接指定数目的字符到另一个字符串
    strncmp  ; C            比较两个字符串中指定数目的字符
    strncpy  ; C            从一个字符串拷贝指定数目的字符到另一个字符串
    strpbrk  ; C            返回一个字符串中和第二个字符串的任何字符匹配的第一个字符的指针
    strrpbrk ; C            返回一个字符串中和第二个字符串的任何字符匹配的最后一个字符的指针
    strspn   ; C            返回一个字符串中和第二个字符串中的任何字符不匹配的第一个字符索引
    strstr   ; C            返回一个字符串中和另一个子字符串一样的指针

  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3998

    积分

    荣誉版主

    积分
    3998
    发表于 2023-2-12 18:11:50 | 显示全部楼层
    如 STC 增加了新指令集, 我只要把这些用到双指针的库, 加后缀 '2', 用 STC 的新增 DPTR指令重新编写一遍, 即 OK.

    使用到双数据指针, 新的库文件
    memccpy2  ; C            从一个缓冲区拷贝数据字节到另一个缓冲区直到一个指定的字符或字符数
    memcmp2   ; asm 可重入   比较两个不同缓冲区给定数目的字符
    memcpy2   ; asm 可重入   从一个缓冲区拷贝指定数目的数据到另一个缓冲区
    memmove2  ; asm 可重入   从一个缓冲区拷贝指定数目的数据到另一个缓冲区
    strcmp2   ; asm 可重入   比较两个字符串
    strcpy2   ; asm 可重入   拷贝一个字符串到另一个
    strcspn2  ; C            返回一个字符串中和第二个字符串的任何字符匹配的第一个字符的索引
    strncat2  ; C            从一个字符串连接指定数目的字符到另一个字符串
    strncmp2  ; C            比较两个字符串中指定数目的字符
    strncpy2  ; C            从一个字符串拷贝指定数目的字符到另一个字符串
    strpbrk2  ; C            返回一个字符串中和第二个字符串的任何字符匹配的第一个字符的指针
    strrpbrk2 ; C            返回一个字符串中和第二个字符串的任何字符匹配的最后一个字符的指针
    strspn2   ; C            返回一个字符串中和第二个字符串中的任何字符不匹配的第一个字符索引
    strstr2   ; C            返回一个字符串中和另一个子字符串一样的指针

    用户可任意调用老库(单DPTR, 传输速度慢), 或STC专用新库(双DPTR, 传输速度快), 并且程序执行过程中, 对中断没任何影响

  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3998

    积分

    荣誉版主

    积分
    3998
    发表于 2023-2-12 19:00:06 | 显示全部楼层
    神农鼎 发表于 2023-2-12 16:58
    帮直接将 KEIL C251 先源码化后再扩充,这样兼容性,正确性,权威性都有保障
    ...

    将 KEIL C251反编译源码化, 那可是侵权的, 根本没有可操作性.

    SDCC 的 C51源码我看了, 基本库 欠缺好多, 而且代码优化级别不高, 可以想像, 同等的 51程序, 在 SDCC下编译, 比在 KEIL 下编译, 代码长度要长些.

    增加基本库 , 好办, 只是花苦力干点活, 而 代码优化, 这个工作量比较大, 单靠我个人完不成, 因为人的思路有限, 我不可能写全 C代码的 所有书写格式!!!

    而代码优化, 就是通过人工找出 , 不同书写方式下的C代码, 经编译器编译后, 存在可省略的汇编源码, 加以优化去除,  所以没有团队提供子弹(提供各种书写方式下的C代码短小经典源码), 无法做到很高的优化级别.
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3998

    积分

    荣誉版主

    积分
    3998
    发表于 2023-2-12 19:25:23 | 显示全部楼层
    神农鼎 发表于 2023-2-12 16:52
    老许,帮移植下 SDCC 到 STC32G12K128, 这样我们来多增加些实用的指令就方便了
    还有 SDCC for 8051 增加下 ...

    我不是 8051的爱好者, 我是 6800(6502)的爱好者, 尽管我 51玩的比较多些. :lol

    很早以前, 就和一个台湾人(凌阳公司的)讨论过, 51指令集, 除了位操作, 没啥优点, 至于全世界, 51产量在单片机中占大头, 主要还是其 指令集, 不用花钱或者只需花很少的版权费而已, 再加上 KEIL, IAR 等正规C编译器的支持

    8086 和 68000, 从技术(指令集)上看, 我看好 68000, 结果 8086 和 WINDOWS 强强联合, 打的 68000 只能在服务器等 很专业的领域, 才有一席之地.

    有人说,  8086 的指令集到顶了, 结果 英特尔通过不断的升级 指令集, 使得 8086已成为世界上指令数最多的指令集, 有约 1700条指令, 排名老二的是 ARM, 大约有 1300条指令.

    排名老三的, 是在咱们中国, 以前收购 日本(好像是NEC) , 后来再扩充指令集, 生态环境跟不上, 应用量不是很大, 大约有700多条指令.
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3998

    积分

    荣誉版主

    积分
    3998
    发表于 2023-2-12 19:58:24 | 显示全部楼层
    神农鼎 发表于 2023-2-12 16:05
    STC32G12K128, STC32G8K64, STC32F12K64  内部总线都是32位的,对外设计的也是32位数据总线
    ===现在外部扩 ...

    单片机单片机, 顾名思义, 就是单片成机, 过份考虑扩容, 就成了通用 CPU :lol
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3998

    积分

    荣誉版主

    积分
    3998
    发表于 2023-2-12 20:04:50 | 显示全部楼层
    神农鼎 发表于 2023-2-12 16:08
    那天编译器变了,新增指令就出来了
    指令很容易增加,编译器的稳定很考验人的韧性

    内部指令能提供一份给我吗? 可签保密协议(其实真用上这些指令, 老司机看一下反汇编代码, 就知道用途了)

    希望这些指令能提升 STC32性能
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3998

    积分

    荣誉版主

    积分
    3998
    发表于 2023-2-12 20:41:05 | 显示全部楼层
    二. 关于 MDU16模块, MDU16模块设计的不错, 功能挺全的(除了少一个算术左移, 用可用于浮点数加减法对阶).

        比 MDU32模块强壮多了.

        存在的问题就是, STC8H将数据功能寄存器,全部映像在XRAM中,在对长整型及浮点数数学运算时,需多次调用MDU16的情况下,

        大大增加了程序长度, 并且影响了程序的执行速度

        建议改进一下.

    方案1. 可考虑 STC32方案, 通过 DMA, 自动将数据 读入/写入 R0-R7寄存器, 或者片内特定RAM中.

    方案2. 可考虑 采用位功能切换, 将 STC8H数据功能寄存器,映像到片内指定 SFR中(不影响原SFR功能).

        比如, 将 P_SW2的 Bit.6, 定义为 MDU16模块 数据功能寄存器 使能, 当 P_SW2.6 置1 时, 片内连续的的某块 SFR,

        作为 MDU16模块 的数据功能寄存器 使用, 当 P_SW2.6 清0 时, 这一块 SFR, 依旧执行原功能, 不冲突, 程序兼容性也好.


    该用户从未签到

    550

    主题

    9365

    回帖

    1万

    积分

    管理员

    积分
    13912
    发表于 2023-2-12 22:38:56 | 显示全部楼层
    有了 STC32F12K64-72MHz-LQFP48/32/TSSOP20,PDIP40, 就不会再去折腾修改 STC8H了
    1.png
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-10 16:01 , Processed in 0.073462 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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