打印
[国产单片机]

STC16F,不改善如下这2点,难以大范围推广。

[复制链接]
6566|81
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tzgok|  楼主 | 2021-1-30 21:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tzgok 于 2021-1-30 21:40 编辑

看了几天STC16F的资料,感觉如下这2个主要问题不解决,国内的技术员很难全面使用它。

1,开发环境问题,如果后续得不到KEIL全面的编译和调试支持,开发和使用会很麻烦,至于第三方提供的“图形化编程”,这玩意只适合学生玩玩,套用老姚的话就是,“不要和趋势作对,你要跟着行情走”,目前KEIL就是趋势,而且KEIL这20多年累积的经验,不是任何一个新出的小软件可以替代的,更何况全球无数的技术员在使用它。

2,芯片性能问题,STC16F本身定位为16位MCU,但最高工作频率只有33MHZ,这太**肋了,如果不能运行到100MHZ以上,那么16位MCU就毫无优势,,因为16位的目标应该是:价格和功耗接近8位机,功能和速度接近32位机。。现在连STC8H都跑到48MHZ了,更别说100MHZ的C8051F120,而STC16F居然只有33MHZ,这个太遗憾,说难听点,这个运行速度就是:**肋。

使用特权

评论回复
评论
autopccopy 2021-2-11 10:52 回复TA
21.02.11 又重新看了此贴,而且这个帖子还上了二姨的百家号什么的。感觉STC公司的对STC16(及以后的STC32M4)宣传、介绍还可以做得更好一点,多些提前介绍。用户也可以多些查看数据手册,善用搜索引擎查找资料。而不是想当然,人云亦云。知识科普任重道远。。。 

相关帖子

沙发
autopccopy| | 2021-1-30 23:00 | 只看该作者
本帖最后由 autopccopy 于 2021-2-7 22:34 编辑

STC16 就是增强INTEL C251内核,当然使用 KEIL 四驾马车之一 的C251 完善支持。

速度称以后会72M-140M!一步一步来。

既有高速度也有开发的便利性,STC16承上启下。打通8-16-32的产品线。。。

---------------------------
21.02.07补充:
(1247)
KEIL C51及 STC16使用的KEIL C251均有0XFD 汉字乱码的情况。KEIL官方帖子提供了解决方法。懒人则可打FD补丁,以后就可以自动正常显示汉字了。
以下补丁已实测支持目前最高的KEIL C251 V9.60版。欢迎试用,详见软件说明。

keilfdfix_cgm_c251.jpg (309.19 KB )

keilfdfix_cgm_c251.jpg

_官方附录D:STC16使用Keil C251开发注意事项_kw.pdf

1.42 MB

KeilFDfix(FD补丁冠铭班长版)b11(新支持C51-C251).zip

97.27 KB

使用特权

评论回复
板凳
autopccopy| | 2021-1-30 23:07 | 只看该作者
本帖最后由 autopccopy 于 2021-2-11 10:39 编辑

担心老铁找不到,贴出下载网址: https://www.keil.com/download/product/
---------------------------------
补充,直接上传附件(分卷3个,需全部下载后解压)。默认为官方体验版,需自行注册。

KEIL_C251.jpg (253.42 KB )

KEIL_C251.jpg

Keil_C251v560_(201804kw).part1.rar

15 MB

Keil_C251v560_(201804kw).part2.rar

15 MB

Keil_C251v560_(201804kw).part3.rar

13.75 MB

使用特权

评论回复
地板
tzgok|  楼主 | 2021-1-31 09:29 | 只看该作者
autopccopy 发表于 2021-1-30 23:00
STC16 就是增强INTEL C251内核,当然使用 KEIL 四驾马车之一 的C251 完善支持。

速度称以后会72M-140M!一 ...

1,目前无法在线仿真。
2,目前的有效FLASH是60K可用,另外60K无法使用。
3,要到后期版本才推出更高频率的版本。

使用特权

评论回复
5
autopccopy| | 2021-1-31 10:58 | 只看该作者
本帖最后由 autopccopy 于 2021-1-31 11:05 编辑
tzgok 发表于 2021-1-31 09:29
1,目前无法在线仿真。
2,目前的有效FLASH是60K可用,另外60K无法使用。
3,要到后期版本才推出更高频率 ...

另:目前的EEPROM/IAP也不能用;以后会增加DMA功能。这个只是送样的第一版。一步一步来,相信后面量产的都可以完善。

使用特权

评论回复
6
autopccopy| | 2021-1-31 11:12 | 只看该作者
STC16-KeilC251例程-DEMO-CODE-20210112(改PWM例程及头文件定义).zip

更新记录
2021.01.12
1. 修改PWM相关的范例程序及头文件定义(XFR地址不能用int进行定义)

2021.01.06
1. 添加"54-LIN总线主机收发测试"例程
2. 添加"55-LIN总线从机收发测试"例程
3. 修改"52-浮点数运算单元"例程,使程序简单直观

2020.12.30
1. 添加"49-CAN总线扩展帧收发测试"例程,以及CAN总线帧格式说明

2020.12.08
1. 添加"52-浮点数运算单元"例程,以及库函数使用说明
2. 添加"53-UART转LIN总线报文测试程序"例程

2020.11.27
1. 修正部分错误
2. "50-CAN总线收发测试"例程添加CAN总线参考电路图
3. 添加"51-MDU32–乘法和除法单元"例程

2020.11.24
1.  初版发布
=========================
STC16从代码风格与C51兼容,非常相近,有8051基础的人非常容易上手迁移。但是STC16的资源、速度比51丰富及快很多。。。

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.**.com --------------------------------------------*/
/* --- Web: www.***.com  ---------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/

/*************  功能说明    **************

本例程基于STC16为主控芯片的实验箱8进行编写测试.
CAN总线扩展帧收发测试用例.
DCAN是一个支持CAN2.0B协议的功能单元。
收到一个扩展帧后, CAN ID加1, 数据原样发送出去.
按一下P32口按键, 发送一帧固定数据.
默认波特率500KHz, 用户可自行修改.
下载时, 默认时钟 24MHz (用户可自行修改频率).
******************************************/

#include "..\comm\STC16f.h"
#include "intrins.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

#define MAIN_Fosc        24000000UL

/****************************** 用户定义宏 ***********************************/
//CAN总线波特率=Fclk/((1+(TSG1+1)+(TSG2+1))*(BRP+1)*2)
#define TSG1    2                //0~15
#define TSG2    1                //0~7
#define BRP     3                //0~63
//24000000/((1+3+2)*4*2)=500KHz

#define SJW     1                //重新同步跳跃宽度

/*****************************************************************************/


/*************  本地常量声明    **************/


/*************  本地变量声明    **************/
u32 CAN_ID;
u8 RX_BUF[8];
u8 TX_BUF[8];
/*************  本地函数声明    **************/
void CANInit();
void CanSendMsg(u32 canid, u8 *pdat);

/********************* 主函数 *************************/
void main(void)
{
        WTST = 0;
        P0M1 = 0;   P0M0 = 0;   //设置为准双向口
        P1M1 = 0;   P1M0 = 0;   //设置为准双向口
        P2M1 = 0;   P2M0 = 0;   //设置为准双向口
        P3M1 = 0;   P3M0 = 0;   //设置为准双向口
        P4M1 = 0;   P4M0 = 0;   //设置为准双向口
        P5M1 = 0;   P5M0 = 0;   //设置为准双向口
        P6M1 = 0;   P6M0 = 0;   //设置为准双向口
        P7M1 = 0;   P7M0 = 0;   //设置为准双向口

//        P_SW2 |= 0x80;
//        CLKDIV = 0;
//        P_SW2 &= ~0x80;

        CANInit();
        EA = 1;                 //打开总中断
        CAN_ID = 0x01234567;
        TX_BUF[0] = 0x11;
        TX_BUF[1] = 0x22;
        TX_BUF[2] = 0x33;
        TX_BUF[3] = 0x44;
        TX_BUF[4] = 0x55;
        TX_BUF[5] = 0x66;
        TX_BUF[6] = 0x77;
        TX_BUF[7] = 0x88;
       
        while(1)
        {
                if(!P32)
                {
                        CanSendMsg(CAN_ID,TX_BUF);
                        while(!P32);
                }
        }
}


//========================================================================
// 函数: u8 ReadReg(u8 addr)
// 描述: CAN功能寄存器读取函数。
// 参数: CAN功能寄存器地址.
// 返回: CAN功能寄存器数据.
// 版本: VER1.0
// 日期: 2020-11-16
// 备注:
//========================================================================
u8 CanReadReg(u8 addr)
{
        u8 dat;
        CANAR = addr;
        dat = CANDR;
        return dat;
}

//========================================================================
// 函数: void WriteReg(u8 addr, u8 dat)
// 描述: CAN功能寄存器配置函数。
// 参数: CAN功能寄存器地址, CAN功能寄存器数据.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-16
// 备注:
//========================================================================
void CanWriteReg(u8 addr, u8 dat)
{
        CANAR = addr;
        CANDR = dat;
}

//========================================================================
// 函数: void CanReadFifo(u8 *pdat)
// 描述: 读取CAN缓冲区数据函数。
// 参数: *pdat: 存放CAN缓冲区数据.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-16
// 备注:
//========================================================================
void CanReadFifo(u8 *pdat)
{
        pdat[0]  = CanReadReg(RX_BUF0);
        pdat[1]  = CanReadReg(RX_BUF1);
        pdat[2]  = CanReadReg(RX_BUF2);
        pdat[3]  = CanReadReg(RX_BUF3);

        pdat[4]  = CanReadReg(RX_BUF0);
        pdat[5]  = CanReadReg(RX_BUF1);
        pdat[6]  = CanReadReg(RX_BUF2);
        pdat[7]  = CanReadReg(RX_BUF3);

        pdat[8]  = CanReadReg(RX_BUF0);
        pdat[9]  = CanReadReg(RX_BUF1);
        pdat[10] = CanReadReg(RX_BUF2);
        pdat[11] = CanReadReg(RX_BUF3);

        pdat[12]  = CanReadReg(RX_BUF0);
        pdat[13]  = CanReadReg(RX_BUF1);
        pdat[14]  = CanReadReg(RX_BUF2);
        pdat[15]  = CanReadReg(RX_BUF3);
}

//========================================================================
// 函数: u16 CanReadMsg(u8 *pdat)
// 描述: CAN发送数据函数。
// 参数: *pdat: 接收数据缓冲区.
// 返回: CAN ID.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
u32 CanReadMsg(u8 *pdat)
{
        u8 i;
        u32 CanID;
        u8 buffer[16];

        CanReadFifo(buffer);
        CanID = (((u32)buffer[1] << 24) + ((u32)buffer[2] << 16) + ((u32)buffer[3] << 8) + buffer[4]) >> 3;
        for(i=0;i<8;i++)
        {
                pdat[i] = buffer[i+5];
        }
        return CanID;
}

//========================================================================
// 函数: void CanSendMsg(u32 canid, u8 *pdat)
// 描述: CAN发送数据函数。
// 参数: canid: CAN ID; *pdat: 发送数据缓冲区.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CanSendMsg(u32 canid, u8 *pdat)
{
        u32 CanID;

        CanID = canid << 3;
        CanWriteReg(TX_BUF0,0x88);        //bit7: 标准帧(0)/扩展帧(1), bit6: 数据帧(0)/远程帧(1), bit3~bit0: 数据长度(DLC)
        CanWriteReg(TX_BUF1,(u8)(CanID>>24));
        CanWriteReg(TX_BUF2,(u8)(CanID>>16));
        CanWriteReg(TX_BUF3,(u8)(CanID>>8));

        CanWriteReg(TX_BUF0,(u8)CanID);
        CanWriteReg(TX_BUF1,pdat[0]);
        CanWriteReg(TX_BUF2,pdat[1]);
        CanWriteReg(TX_BUF3,pdat[2]);

        CanWriteReg(TX_BUF0,pdat[3]);
        CanWriteReg(TX_BUF1,pdat[4]);
        CanWriteReg(TX_BUF2,pdat[5]);
        CanWriteReg(TX_BUF3,pdat[6]);

        CanWriteReg(TX_BUF0,pdat[7]);
        CanWriteReg(TX_BUF1,0x00);
        CanWriteReg(TX_BUF2,0x00);
        CanWriteReg(TX_BUF3,0x00);

        CanWriteReg(CMR ,0x04);                //发起一次帧传输
}

//========================================================================
// 函数: void CANSetBaudrate()
// 描述: CAN总线波特率设置函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CANSetBaudrate()
{
        CanWriteReg(BTR0,(SJW << 6) + BRP);
        CanWriteReg(BTR1,(TSG2 << 4) + TSG1);
}

//========================================================================
// 函数: void CANInit()
// 描述: CAN初始化函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CANInit()
{
        CANSetBaudrate();        //设置波特率
       
        CanWriteReg(ACR0,0x00);                //总线验收代码寄存器
        CanWriteReg(ACR1,0x00);
        CanWriteReg(ACR2,0x00);
        CanWriteReg(ACR3,0x00);
        CanWriteReg(AMR0,0xFF);                //总线验收屏蔽寄存器
        CanWriteReg(AMR1,0xFF);
        CanWriteReg(AMR2,0xFF);
        CanWriteReg(AMR3,0xFF);

        CanWriteReg(IMR ,0xff);                //中断寄存器
        CanWriteReg(MR  ,0x00);

        //CanWriteReg(CMR ,0x04);        //发起一次帧传输

        P_SW1 = 0;
        CANICR = 0x02;                //CAN中断使能
        AUXR2 |= 0x02;                //CAN模块被使能
}

//========================================================================
// 函数: void CANBUS_Interrupt(void) interrupt CAN_VECTOR
// 描述: CAN总线中断函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CANBUS_Interrupt(void) interrupt CAN_VECTOR
{
        u8 isr;
       
        isr = CanReadReg(ISR);
        if((isr & 0x04) == 0x04)
        {
                CANAR = 0x03;
                CANDR = 0x04;    //CLR FLAG
               
  }       
        if((isr & 0x08) == 0x08)
        {
                CANAR = 0x03;
                CANDR = 0x08;    //CLR FLAG
       
                CAN_ID = CanReadMsg(RX_BUF);        //接收CAN总线数据
               
                CanSendMsg(CAN_ID+1,RX_BUF);        //发送CAN总线数据
        }
}



STC16-KEIL-C251-DEMO1.jpg (430.7 KB )

STC16-KEIL-C251-DEMO1.jpg

stc16-can-test1-demo.jpg (165.7 KB )

stc16-can-test1-demo.jpg

STC16-KeilC251例程-DEMO-CODE-20210112(改PWM例程及头文件定义).zip

12.32 MB

使用特权

评论回复
7
musich| | 2021-1-31 13:20 | 只看该作者
说的很有道理,  高不成,  低不就.  狗皮膏药一样还到处乱贴小广告.  成不了气候.

不过, 还是要支持一下, 毕竟做实事的.

使用特权

评论回复
8
taobaofarmer| | 2021-1-31 19:48 | 只看该作者
STC的51就是搅局儿的,虽然我用了10年STC,但最后还是放弃了,因为曾经给予很多希望,但最后发现这家伙就是个混世魔王,从头到尾不能仿真,我就不了解为啥还有些人在使用,现在我转向了深圳赛元的,能仿真,手册例程非常正规,用的很爽

使用特权

评论回复
评论
autopccopy 2021-2-1 12:56 回复TA
祝您好运! 
9
coody| | 2021-1-31 20:35 | 只看该作者
这几天测试了STC16F的样片,使用KEIL C251的编译器,主要是测试其扩展的硬件整数运算单元、硬件单精度浮点单元,单精度浮点运算速度比不带硬件浮点的M0、M3快得多。整数运算速度速度也很快。
测试了DFT、FFT、Goertzel滤波算法软解DTMF,采样市电交流电压电流计算电压电流有效值、有功功率、功率因素。

其中FFT运算最耗时间,跑30MHz,ADC使用32K采样,256点FFT(8ms),频点分频率125Hz,int整数运算,蝶形计算时间为4.24ms,128频点幅度计算为0.7ms,计算过程中,ADC会持续32K采样。这个速度非常满意,FFT分析是实时连续的。

数字滤波也比较耗时间,我常用8阶IIR数字滤波器,32位有符号整数运算耗时20us,这个非常好,满足40KHz以内的采样速度要求。单精度运算耗时53us,已经满足低速的要求(采样16KHz以下)。

使用特权

评论回复
评论
fcccc 2021-2-1 21:28 回复TA
要和AT32F421掰扯掰扯吗? 
10
musich| | 2021-2-1 13:26 | 只看该作者
感觉 STC错过了很好的机会, 没有跟上ARM, 也没有弄RISC-V, 而是搞什么非主流STC16,

国内51的老大, 太可惜了.  

使用特权

评论回复
评论
xyz549040622 2021-2-3 18:06 回复TA
在51的道路上越来越远. 
11
菜鸟同学| | 2021-2-1 16:28 | 只看该作者
STC16注定是一个短命的东西,他就是搅屎棍,还在简直51,C251的我估计成本比做cortex m0还高。
首先这个价格实在没啥优势,只是现在很多老工程师和学生在用,实际很多ARM秒杀裤衩都不剩,国产也有很多优秀的51厂商。
调试都做的不错,赛元,中颖,中微,性价比高的arm  华大的M0 GD的130,你想原地圈地,那是不可能的,别人已经远远超过你了。

使用特权

评论回复
12
taobaofarmer| | 2021-2-1 16:56 | 只看该作者
我在用国产赛元8051,性能很高,文档例程写的很好,有自己的仿真器,仿真很完善,整个产业链都挺完善的,不像STC,官网乱的跟一窝蚂蚁似的,永远不能仿真,市场就是这样,总是用先进的价格低廉的东西淘汰老旧落后的东西,STC估计也蹦哒不了多久了,但因为还是有一批学习能力差的不能升级的用户,等到这批用户再被淘汰了,那STC倒闭也就差不多到时候了

使用特权

评论回复
评论
xyz549040622 2021-2-3 18:07 回复TA
因为还是有一批学习能力差的不能升级的用户,特别经典。 
13
ayb_ice| | 2021-2-1 17:15 | 只看该作者
stc16只要能取代自己的8位机就已经成功了,
我淘宝买了好多小电子产品,用的都是stc的mcu
没有实时仿真确实不好,有时找个bug搞死人

使用特权

评论回复
评论
ayb_ice 2021-2-2 09:45 回复TA
@autopccopy :那个仿真太弱智了,关键还不稳定,还不如我打印输出调试 
autopccopy 2021-2-1 22:27 回复TA
IAP15/STC8/STC8A/STC8H/STC8G 都可以串口仿真。(虽然我几乎不用仿真,直接烧写调试的。) 
14
叶春勇| | 2021-2-1 19:17 | 只看该作者
以前看stc网站,说要搞arm核心。一直没搞。
现在错过了,搞251核心,是不是不收版税

使用特权

评论回复
15
guysxpf| | 2021-2-1 20:31 | 只看该作者
我觉得 STC 最大的绊脚石,是没有完善的库函数。51芯片寄存器少,做大一点的项目已经有些复杂了,更不用说 STC16、ARM 和 RISC-V 了。如果官方一直不给库函数,那将是开发者的噩梦,将会限制芯片的推广。

使用特权

评论回复
评论
guysxpf 2021-2-9 08:36 回复TA
@autopccopy :那我去找找,多谢 
guysxpf 2021-2-2 09:57 回复TA
@autopccopy :官方就给了STC8C、8G 和 15系列的库,其他都没有。而且官方库是仿STM32的“结构体”风格,个人不太喜欢。在目前自己正在写Arduino风格的库函数。 
autopccopy 2021-2-1 22:26 回复TA
51比较简单,STC8有库。还有第三方的图形编程生成KEIL C51代码的。STC32 ARM-M4芯片的确需要用库。 
16
guysxpf| | 2021-2-1 20:42 | 只看该作者
coody 发表于 2021-1-31 20:35
这几天测试了STC16F的样片,使用KEIL C251的编译器,主要是测试其扩展的硬件整数运算单元、硬件单精度浮点 ...

试过解码二维码么?我试过 STC8 解码一维条码(优化过的算法)。24MHz主频、512像素的从读取、中值滤波、二值化、解码,一共花了13ms左右,不敢拿去解码二维码了。(仅供参考)

使用特权

评论回复
17
coody| | 2021-2-1 21:00 | 只看该作者
guysxpf 发表于 2021-2-1 20:42
试过解码二维码么?我试过 STC8 解码一维条码(优化过的算法)。24MHz主频、512像素的从读取、中值滤波、 ...

没解过条码,你要是用STC16F,解你这个一维码,应该不到2ms。

使用特权

评论回复
18
fcccc| | 2021-2-1 21:09 | 只看该作者
本帖最后由 fcccc 于 2021-2-1 21:17 编辑

感觉STC比较像土**友,不像个正规厂商.鼓吹芯片可靠性多好,也搞了这么多年了手册上你倒是把ESD,EFT测出来啊.
相比之下,国内某新开的小厂,ESD HMB 8KV,EFT5.5KV,LatchUP>200mA这不就一清二楚了
很多之前很火的大厂16位机都不行了,现在还搞16位?还是个老掉牙的251,能拼得过M0吗?M0+,M23, RISC-V又来了

使用特权

评论回复
评论
autopccopy 2021-2-1 22:25 回复TA
哎,自己测试一下性能(MIPS),看看对比M0/MO+如何。而且以后的STC32是M4内核的。 
19
taobaofarmer| | 2021-2-1 21:15 | 只看该作者
说的STC的马甲都不敢出来了,说白了STC就是为了混口饭吃而已,没有想过要做成一个怎样怎样正规、有前景的事业,路子走的也不是正规路子,一些小商小贩确实有不少在用,但是正规公司的产品应该是没人敢用

使用特权

评论回复
评论
coody 2021-2-2 21:50 回复TA
看来你并不了解市场啊 
20
kmzhangp| | 2021-2-1 21:59 | 只看该作者
上海华虹搞过SHC16L超低功耗MCU系列80251的,现在官网都没有资料了,是不是停产了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

225

帖子

2

粉丝