STC32G12K128-35I-LQFP64/48/32, TSSOP20;
STC32G8K64-42I-LQFP48/32来取代 STC8H
STC32 的 MDU32 单元, 做的太差劲了, 功能简单且单调, 只能做单一的 long 乘除法, 功能扩展性太差了,
相比之下, STC8 的 MDU16单元就做的挺不错的, 仅少了一个算术左移(优化浮点数加减法对阶要用),
建议官方考虑一下, 是否按 MDU16单元的样子做, 这样, 还可进一步优化 双精度浮点数学运算库, 用途比 FPMU单元还要强. 学习了,很好 在ST8H的规格书中有关MDU的例程看不懂???
MD1U16= dat1;
MD5U16= dat2;
res=MD3U32;
而MD1U16,MD5U16,MD3U32;怎么寻址到MD0,MD1,MD2,MD3,MD4,MD5的,特别是res=MD3U32;看看不懂??MD1U16,MD5U16,MD3U32之前怎么定义的??? STC8H手册中的例程缺少了三条定义,应该如下定义就对了:
//这里的定义是按理解添加的,全部按照大端模式
#define MD1U16 (*(unsigned int volatile xdata *)0xfcf2)
#define MD5U16 (*(unsigned int volatile xdata *)0xfcf4)
#define MD3U32 (*(unsigned long volatile xdata *)0xfcf0) 附上我昨天写的小测试例程,和在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]