yycl 发表于 2023-2-1 14:59:23

完全可以把不那么频繁使用的IO配置放XFR,使用频繁的MDU放SFR,可以大大提高效率。

神农鼎 发表于 2023-2-1 22:45:40

直接用
STC32G12K128-35I-LQFP64/48/32, TSSOP20;
STC32G8K64-42I-LQFP48/32来取代 STC8H

LAOXU 发表于 2023-2-3 11:03:07

STC32 的 MDU32 单元, 做的太差劲了, 功能简单且单调, 只能做单一的 long 乘除法, 功能扩展性太差了,

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

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

杨寻欢 发表于 2023-4-22 11:23:42

学习了,很好

杨寻欢 发表于 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之前怎么定义的???

zhangbo 发表于 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)

zhangbo 发表于 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)
    {

    }
}



页: 1 [2]
查看完整版本: 对STC8H硬件MDU16所用寄存器的建议