找回密码
 立即注册
楼主: LAOXU

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

[复制链接]

1

主题

8

回帖

74

积分

注册会员

积分
74
发表于 2023-2-1 14:59:23 | 显示全部楼层
完全可以把不那么频繁使用的IO配置放XFR,使用频繁的MDU放SFR,可以大大提高效率。
  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16635
发表于 2023-2-1 22:45:40 | 显示全部楼层
直接用
STC32G12K128-35I-LQFP64/48/32, TSSOP20;
STC32G8K64-42I-LQFP48/32来取代 STC8H
1.png
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5499

积分

荣誉版主

积分
5499
发表于 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

回帖

8

积分

新手上路

积分
8
发表于 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

回帖

8

积分

新手上路

积分
8
发表于 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, 2025-6-16 12:59 , Processed in 0.146515 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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