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

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-2-12 14:24:22 | 显示全部楼层
倒数 2: 间接寻址, ARM指令偏向于 间接寻址, 这在组成大系统时, 占极大的优势, 比如, 实时操作系统, 多任务的切换, 用到的堆栈保护, 程序工作量低. 代码量少.  

       在 ARM中, 除了一些必须的 寄存器, 其他变量都在 RAM中, 通过高效的间接寻址方式, 执行程序.

       而 251中, 寄存器过多, 如全部使用, 像在  实时操作系统 中, 多任务的切换, 用到的堆栈保护, 程序工作量太大. 程序效率低.  

       所以 Keil公司, 就聪明的 在程序中, 仅使用了 DR0-DR8(3个32位寄存器), 而后面的 DR12-DR28(5个32位寄存器), 都没有使用,

       这样, 在执行  实时操作系统 中, 多任务的切换, 用到的堆栈保护, 程序工作量不是太大. 程序效率可行.

        Keil公司,  仅在后来推出的 64位双精度浮点运算时, 使用了后面的 DR12-DR28(5个32位寄存器), 该特定用法没有普及性.

       251的间接寻址, 指令太单一, 功能弱 (和 ARM相比), 当然, 如和 51相比, 一个天一个地, 功能强的实在太多了.
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-2-12 14:32:46 | 显示全部楼层
不要换概念
讲 M0, 不要讲 ARM, STC有M33这个是打M3的,降维打击 !
STC32F12K64-72MHz-LQFP48/32/TSSOP20 这个是代表STC8051世界打M0的
不要将 M0 上升到 ARM 的高度 ! 英国在发展,中国也在发展 !
STC8051世界 对标 M0的是 STC32F12K64-72MHz-LQFP48/32/TSSOP20 ,STC32G
STC33是对标M3的
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-2-12 14:34:14 | 显示全部楼层
倒数 1: 这一项没法比, 就算 ARM 有 Bit-Band 功能, 但编译后代码长度长, 哪有 号称世界上, 也是 唯一的, 内含 1位机处理器 的 51强大?

       251 在对 I/O口操作, 或对位变量 赋值, 变更, 指令简单执行迅速,  无论是编译后的代码长度, 还是执行效率, 是目前世界上的所有单片机中, 最最优秀的,
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-2-12 14:36:58 | 显示全部楼层
神*** 发表于 2023-2-12 14:32
不要换概念
讲 M0, 不要讲 ARM, STC有M33这个是打M3的,降维打击 !
STC32F12K64-72MHz-LQFP48/32/TSSOP20  ...

我看了讨论稿, STC33是对标M4的吧
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-2-12 14:38:30 | 显示全部楼层
跟 M0 比,不要跟 ARM 比,STC有 M33, 跟ARM是合作伙伴,但 STC 看不上 M0,
用 STC32F12K64/STC32G12K128  敲打下 某些国人崇洋媚外的M0 而已
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-2-12 14:38:35 | 显示全部楼层
用 STC33(m4) 打击 M3, 肯定完胜 :lol
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-2-12 14:41:31 | 显示全部楼层
田忌赛马,谁让咱是学中文的

用STC ,以前大部分客户主要是用STC的高稳定性,不是比啥速度,比速度用 并行的FPGA 更合适,
现在用 STC, 除了情怀,还有就是用 STC8H/STC32G的 高精准12位ADC, 不是用啥 CPU
===用 STC 是情怀,是 STC 在默默的陪你长大,陪你一起慢慢变老后,又激情燃烧到32位8051



回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-2-12 14:46:03 | 显示全部楼层
===你比较下16位除,32位除,位操作,就知道 M0就是个大忽悠,STC32G12K128对的起STC8051世界

这些是 251 比 M0 强的地方.

反过来 你对比一下 带进位 加减法, 移位操作, 间接寻址, M0  比 251 要强.

总之, M0 和 251 性能相当, 各有千秋, 我个人偏爱 251.

251 和 M3 没法比, M3的 性能要强大多了.
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-2-12 14:52:24 | 显示全部楼层
STC的M33是买断,钱都给够了!
不用白不用,你要 M3, 我们没有,也看不上,我们给你 STC33-M33
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-2-12 15:05:24 | 显示全部楼层
本帖最后由 LAOXU 于 2023-2-12 15:07 编辑

至于 MDU32库, 除了64位定点整数运算及数制转换, 还顺带加了 int_to_bcd, long_to_bcd, bcd_to_int,  bcd_to_long.


请同学们帮忙看一下, 基本的库程序功能, 还有什么可以加入



/*--------------------------------------------------------------------------
DLONG.H

Prototypes for mathematic functions for C251 Version 4.
Copyright (c) 1995-2004 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#pragma SAVE
#pragma PARM251

// 双长字整数(64位),使用说明:
// 数据格式, 双长字HEX码: 分无符号整型数(原码)和有符号整型数(补码); 双长字BCD码: 无符号整型数(原码)
//                                          三长字BCD码: 分无符号整型数(原码)和有符号整型数(原码+最高位为符号位)
// 双长字整型数,分无符号整型数和有符号整型, 存储格式: 高位长字在先, 低位长字在后
// 双长字型BCD码无符号整型数, 存储格式: 高位长字在先, 低位长字在后
// 三长字BCD码整型数, 带有符号位(原码), 存储格式: 高位长字在先, 中位长字在后, 最后是扩展的最高位长字(符号位在最高Bit)
// 四长字商和余数(指针先指向商,后紧跟余数), 存储格式: 商:高位长字在先, 低位长字在后, 后面紧跟余数:高位长字在先, 低位长字在后
extern void  add64 (long aH, long aL, long bH, long bL, long far *cp);
extern void  sub64 (long aH, long aL, long bH, long bL, long far *cp);
extern void  mul64 (long aH, long aL, long bH, long bL, long far *cp);
  // c=1,返回商; c=2,返回余数; c=3,返回商 和 余数(指针先指向商,后紧跟余数);
extern void sdiv64 (long aH, long aL, long bH, long bL, char c, long far *cp);
  // c=1,返回商; c=2,返回余数; c=3,返回商 和 余数(指针先指向商,后紧跟余数); c=0,堆栈返回商 和 余数(汇编专用);
extern void udiv64 (unsigned long aH, unsigned long aL, unsigned long bH, unsigned long bL, char c, long far *cp);  
  // c=0,输出双长整型BCD; c=1,输出三长整型无符号BCD; c=2,输出三长整型有符号BCD;
        // c=3,输出三长整型有符号BCD(最高长字为补码,仅供调试时,显示监控变量);
extern void hex_bcd64 (unsigned long aH, unsigned long aL, char c, long far *cp);  
extern void bcd_hex64 (unsigned long aH, unsigned long aL, long far *cp);    // 双长字无符号整型数(BCD),转双长字整型数(HEX)
extern void AtoL64 (char far *s, long far *cp);  
  // c=0,输入HEX; c=1,输入双长整型BCD;  c=2,输入三长整型BCD;
extern void uLtoA64 (unsigned long aH, unsigned long aL, char c, long far *cp);  // 指针返回BCD的 ASCII码串
  // c=0,输入HEX; c=1,输入双长整型BCD;  c=2,输入三长整型BCD;
extern void sLtoA64 (unsigned long aH, unsigned long aL, char c, long far *cp);  // 指针返回BCD的 ASCII码串
  // c=1,返回补码; c=0,不返回(汇编专用);
extern void neg64 (unsigned long aH, unsigned long aL, char c, long far *cp);  

extern unsigned int  int_bcd16 (unsigned int a, unsigned char b);    // 溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
extern unsigned long long_bcd32 (unsigned long a, unsigned char b);  // 溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
extern unsigned int  bcd_int16 (unsigned int a);
extern unsigned long bcd_long32 (unsigned long a);  

#define  LADD64(a,b,c)        do{ add64 (a##.##h, a##.##l, b##.##h, b##.##l, (long far *)&##c##.##h); }while(0)                          // 返回和
#define  LSUB64(a,b,c)        do{ sub64 (a##.##h, a##.##l, b##.##h, b##.##l, (long far *)&##c##.##h); }while(0)                          // 返回差
#define  LMUL64(a,b,c)        do{ mul64 (a##.##h, a##.##l, b##.##h, b##.##l, (long far *)&##c##.##h); }while(0)                          // 返回积
#define ULDIV64(a,b,c)        do{ udiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 1, (long far *)&##c##.##h); }while(0)          // 返回商 和 余数(指针先指向商,后紧跟余数);
#define SLDIV64(a,b,c)        do{ sdiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 1, (long far *)&##c##.##h); }while(0)                // 返回商 和 余数(有符号数);
#define SLMOD64(a,b,c)        do{ sdiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 2, (long far *)&##c##.##h); }while(0)          // 返回商 和 余数(指针先指向商,后紧跟余数);
#define ULMOD64(a,b,c)        do{ udiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 2, (long far *)&##c##.##h); }while(0)          // 返回商 和 余数(指针先指向商,后紧跟余数);
#define SLDIVm64(a,b,c)       do{ sdiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 3, (long far *)&##c##.##h); }while(0)          // 返回商 和 余数(指针先指向商,后紧跟余数);
#define ULDIVm64(a,b,c)       do{ udiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 3, (long far *)&##c##.##h); }while(0)          // 返回商 和 余数(指针先指向商,后紧跟余数);
#define  HEXtoBCD64(a,c)      do{ hex_bcd64 (a##.##h, a##.##l, 0, (long far *)&##c##.##h); }while(0)                                        // 返回双长字无符号整型数(BCD)
#define UHEXtoBCD64H(a,c)     do{ hex_bcd64 (a##.##h, a##.##l, 1, (long far *)&##c##.##h); }while(0)                                        // 返回三长字无符号整型数(BCD);
#define SHEXtoBCD64H(a,c)     do{ hex_bcd64 (a##.##h, a##.##l, 2, (long far *)&##c##.##h); }while(0)                                        // 返回三长字有符号整型数(BCD);
#define WATCHtoUBCD64H(a,c)       UHEXtoBCD64H(a,c)                                                                                                    // 返回三长字无符号整型数(BCD,最高长字为原码,可供调试时,显示监控变量);
#define WATCHtoSBCD64H(a,c)   do{ hex_bcd64 (a##.##h, a##.##l, 3, (long far *)&##c##.##h); }while(0)                                        // 返回三长字有符号整型数(BCD,最高长字为补码,仅供调试时,显示监控变量);
#define  BCDtoHEX64(a,c)      do{ bcd_hex64 (a##.##h, a##.##l, 0, (long far *)&##c##.##h); }while(0)                                  // 双长字整型数(BCD),转双长字整型数(HEX)
#define  BCDHtoHEX64(a,c)     do{ bcd_hex64 (a##.##h, a##.##l, 1, (long far *)&##c##.##h); }while(0)                                  // 三长字整型数(BCD),转双长字整型数(HEX)
#define  ASCIItoL64(a,c)      do{ AtoL64 ((char far *)a, (long far *)&##c##.##h); }while(0)                                                                                // ASCII码(BCD),转双长字整型数(HEX)
#define UL64toASCII(a,c)      do{ AtoL64 ((char far *)a, 0, (long far *)&##c##.##h); }while(0)                                                                // 双长字无符号整型数(HEX),转ASCII码(BCD)
#define SL64toASCII(a,c)      do{ AtoL64 ((char far *)a, 1, (long far *)&##c##.##h); }while(0)                                                                // 双长字有符号整型数(HEX),转ASCII码(BCD)
#define LNEG64(a,c)           do{ neg64 (a##.##h, a##.##l, 1, (long far *)&##c##.##h); }while(0)                                                        // 双长字有符号整型数(HEX),求补码
#define UINTtoBCD16(a)        do{ int_bcd16 (a, 0); }while(0)                                                        // 无符号整型数(HEX),转BCD码,溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
#define SINTtoBCD16(a)        do{ int_bcd16 (a, 1); }while(0)                                                        // 有符号整型数(HEX),转BCD码,溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
#define ULONGtoBCD32(a)       do{ int_bcd32 (a, 0); }while(0)                                                        // 无符号长整型数(HEX),转BCD码,溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
#define SLONGtoBCD32(a)       do{ int_bcd32 (a, 1); }while(0)                                                        // 有符号长整型数(HEX),转BCD码,溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)


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

本版积分规则

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

GMT+8, 2025-5-2 02:22 , Processed in 0.138079 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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