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

对STC8H硬件MDU16所用寄存器的建议

[复制链接]

该用户从未签到

1

主题

8

回帖

74

积分

注册会员

积分
74
发表于 2023-2-1 14:59:23 | 显示全部楼层
完全可以把不那么频繁使用的IO配置放XFR,使用频繁的MDU放SFR,可以大大提高效率。

该用户从未签到

550

主题

9221

回帖

1万

积分

管理员

积分
13914
发表于 2023-2-1 22:45:40 | 显示全部楼层
直接用
STC32G12K128-35I-LQFP64/48/32, TSSOP20;
STC32G8K64-42I-LQFP48/32来取代 STC8H
1.png
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 131 天

    [LV.7]常住居民III

    37

    主题

    867

    回帖

    3934

    积分

    荣誉版主

    积分
    3934
     楼主| 发表于 2023-2-3 11:03:07 | 显示全部楼层
    STC32 的 MDU32 单元, 做的太差劲了, 功能简单且单调, 只能做单一的 long 乘除法, 功能扩展性太差了,

    相比之下, STC8 的 MDU16单元就做的挺不错的, 仅少了一个算术左移(优化浮点数加减法对阶要用),

    建议官方考虑一下, 是否按 MDU16单元的样子做, 这样, 还可进一步优化 双精度浮点数学运算库, 用途比 FPMU单元还要强.

    该用户从未签到

    0

    主题

    2

    回帖

    6

    积分

    新手上路

    积分
    6
    发表于 2023-4-22 11:23:42 | 显示全部楼层
    学习了,很好
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    回帖

    6

    积分

    新手上路

    积分
    6
    发表于 2023-4-22 11:36:06 | 显示全部楼层
    在ST8H的规格书中有关MDU的例程看不懂???
    MD1U16= dat1;
    MD5U16= dat2;
    res=MD3U32;
    而MD1U16,MD5U16,MD3U32;怎么寻址到MD0,MD1,MD2,MD3,MD4,MD5的,特别是res=MD3U32;看看不懂??MD1U16,MD5U16,MD3U32之前怎么定义的???
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    回帖

    6

    积分

    新手上路

    积分
    6
    发表于 2023-4-23 12:49:48 | 显示全部楼层
    STC8H手册中的例程缺少了三条定义,应该如下定义就对了:

    //这里的定义是按理解添加的,全部按照大端模式
    #define     MD1U16                                                                        (*(unsigned int volatile xdata *)0xfcf2)
    #define     MD5U16                                                                        (*(unsigned int volatile xdata *)0xfcf4)
    #define     MD3U32                                                                        (*(unsigned long volatile xdata *)0xfcf0)
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    回帖

    6

    积分

    新手上路

    积分
    6
    发表于 2023-4-23 12:58:17 | 显示全部楼层
    附上我昨天写的小测试例程,和在STC8H3K48S2芯片上的仿真结果,只是除0时的结果不太对。


    //FC00H-FCFFH  特殊功能寄存器定义    这里是从标准头文件中拷出的
    #define     MD3                     (*(unsigned char volatile xdata *)0xfcf0)
    #define     MD2                     (*(unsigned char volatile xdata *)0xfcf1)
    #define     MD1                     (*(unsigned char volatile xdata *)0xfcf2)
    #define     MD0                     (*(unsigned char volatile xdata *)0xfcf3)
    #define     MD5                     (*(unsigned char volatile xdata *)0xfcf4)
    #define     MD4                     (*(unsigned char volatile xdata *)0xfcf5)
    #define     ARCON                   (*(unsigned char volatile xdata *)0xfcf6)
    #define     OPCON                   (*(unsigned char volatile xdata *)0xfcf7)

    sfr         P_SW2       =           0xba;

    //这里的定义是按理解添加的,全部按照大端模式
    #define     MD1U16                                                                        (*(unsigned int volatile xdata *)0xfcf2)
    #define     MD5U16                                                                        (*(unsigned int volatile xdata *)0xfcf4)
    #define     MD3U32                                                                        (*(unsigned long volatile xdata *)0xfcf0)

    void main(void)
    {
        //变量定义
        unsigned long         res_1_u32 = 0;        //32位无符号整数,保存16*16结果
        unsigned long         res_2_u32 = 0;        //32位无符号整数,保存32/16结果
        unsigned int         rem_u16 = 0;                //16位无符号整数,保存32位/16位的余数
        unsigned char         opcon = 0;                        //保存OPCON寄存器的值

        //计算        0x8765*0x4321=0x2380E305                十进制为 34661*17185=595649285
        //计算  0x87654321/0x4321=0x20456 余数=0x320B                        十进制为 2271560481/17185=132182  余数=12811
        unsigned int                 dat1_u16 = 0x8765;                        //16位无符号整数,只参与16位*16位
        unsigned int          dat2_u16 = 0x4321;                                //16位无符号整数,参与两个运算
        unsigned long         dat1_u32 = 0x87654321;                //32位无符号整数,只参与32位/16位

        //16 位 乘 16 位
        P_SW2 |= 0x80;                        //访问扩展寄存器 xsfr
        MD1U16 = dat1_u16;        //dat1 用户给定
        MD5U16 = dat2_u16;        //dat2 用户给定
        ARCON = 4 << 5;                        //16 位*16 位,乘法模式
        OPCON = 1;                                        //启动计算

        while((OPCON & 1) != 0);        //等待计算完成

        res_1_u32 = MD3U32;                                        //32 位结果

        //32 位除以 16 位
        P_SW2 |= 0x80;                        //访问扩展寄存器 xsfr
        MD3U32 = dat1_u32;        //dat1 用户给定
        MD5U16 = dat2_u16;        //dat2 用户给定
        ARCON = 6 << 5;                        //32 位/16 位,除法模式
        OPCON = 1;                                        //启动计算

        while((OPCON & 1) != 0);        //等待计算完成

        res_2_u32 = MD3U32;        //32 位商,16 位余数在 MD5U16 中
        rem_u16 = MD5U16;                //16位余数
        opcon = OPCON;                        //读取OPCON寄存器的值

        //计算        0x1111*0x1111=0x1234321
        //计算  0x11111112/0x1111=0x10001 余数=1
        dat1_u16 = 0x1111;                                //16位无符号整数,只参与16位*16位
        dat2_u16 = 0x1111;                                //16位无符号整数,参与两个运算
        dat1_u32 = 0x11111112;                //32位无符号整数,只参与32位/16位

        //16 位 乘 16 位
        P_SW2 |= 0x80;                        //访问扩展寄存器 xsfr
        MD1U16 = dat1_u16;        //dat1 用户给定
        MD5U16 = dat2_u16;        //dat2 用户给定
        ARCON = 4 << 5;                        //16 位*16 位,乘法模式
        OPCON = 1;                                        //启动计算

        while((OPCON & 1) != 0);        //等待计算完成

        res_1_u32 = MD3U32;                        //32 位结果

        //32 位除以 16 位
        P_SW2 |= 0x80;                        //访问扩展寄存器 xsfr
        MD3U32 = dat1_u32;        //dat1 用户给定
        MD5U16 = dat2_u16;        //dat2 用户给定
        ARCON = 6 << 5;                        //32 位/16 位,除法模式
        OPCON = 1;                                        //启动计算

        while((OPCON & 1) != 0);        //等待计算完成

        res_2_u32 = MD3U32;        //32 位商,16 位余数在 MD5U16 中
        rem_u16 = MD5U16;                //16位余数
        opcon = OPCON;                        //读取OPCON寄存器的值

        //计算        0x1111*0=0
        //计算  0x11111112/0=0 余数=0
        dat1_u16 = 0x1111;                        //16位无符号整数,只参与16位*16位
        dat2_u16 = 0;                                                //16位无符号整数,参与两个运算
        dat1_u32 = 0x11111112;        //32位无符号整数,只参与32位/16位

        //16 位 乘 16 位
        P_SW2 |= 0x80;                        //访问扩展寄存器 xsfr
        MD1U16 = dat1_u16;        //dat1 用户给定
        MD5U16 = dat2_u16;        //dat2 用户给定
        ARCON = 4 << 5;                        //16 位*16 位,乘法模式
        OPCON = 1;                                        //启动计算

        while((OPCON & 1) != 0);        //等待计算完成

        res_1_u32 = MD3U32;                                //32 位结果

        //32 位除以 16 位
        P_SW2 |= 0x80;                        //访问扩展寄存器 xsfr
        MD3U32 = dat1_u32;        //dat1 用户给定
        MD5U16 = dat2_u16;        //dat2 用户给定
        ARCON = 6 << 5;                        //32 位/16 位,除法模式
        OPCON = 1;                                        //启动计算

        while((OPCON & 1) != 0);        //等待计算完成

        res_2_u32 = MD3U32;        //32 位商,16 位余数在 MD5U16 中
        rem_u16 = MD5U16;                //16位余数
        opcon = OPCON;                        //读取OPCON寄存器的值

        while(1)
        {

        }
    }

    微信图片_20230423125330.png 微信图片_20230423125354.png 微信图片_20230423125404.png

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-27 09:25 , Processed in 0.063414 second(s), 53 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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