STC16F,不改善如下这2点,难以大范围推广。
本帖最后由 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-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版。欢迎试用,详见软件说明。
本帖最后由 autopccopy 于 2021-2-11 10:39 编辑
担心老铁找不到,贴出下载网址: https://www.keil.com/download/product/
---------------------------------
补充,直接上传附件(分卷3个,需全部下载后解压)。默认为官方体验版,需自行注册。
autopccopy 发表于 2021-1-30 23:00
STC16 就是增强INTEL C251内核,当然使用 KEIL 四驾马车之一 的C251 完善支持。
速度称以后会72M-140M!一 ...
1,目前无法在线仿真。
2,目前的有效FLASH是60K可用,另外60K无法使用。
3,要到后期版本才推出更高频率的版本。 本帖最后由 autopccopy 于 2021-1-31 11:05 编辑
tzgok 发表于 2021-1-31 09:29
1,目前无法在线仿真。
2,目前的有效FLASH是60K可用,另外60K无法使用。
3,要到后期版本才推出更高频率 ...
另:目前的EEPROM/IAP也不能用;以后会增加DMA功能。这个只是送样的第一版。一步一步来,相信后面量产的都可以完善。{:victory:} 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;
u8 TX_BUF;
/*************本地函数声明 **************/
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 = 0x11;
TX_BUF = 0x22;
TX_BUF = 0x33;
TX_BUF = 0x44;
TX_BUF = 0x55;
TX_BUF = 0x66;
TX_BUF = 0x77;
TX_BUF = 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= CanReadReg(RX_BUF0);
pdat= CanReadReg(RX_BUF1);
pdat= CanReadReg(RX_BUF2);
pdat= CanReadReg(RX_BUF3);
pdat= CanReadReg(RX_BUF0);
pdat= CanReadReg(RX_BUF1);
pdat= CanReadReg(RX_BUF2);
pdat= CanReadReg(RX_BUF3);
pdat= CanReadReg(RX_BUF0);
pdat= CanReadReg(RX_BUF1);
pdat = CanReadReg(RX_BUF2);
pdat = CanReadReg(RX_BUF3);
pdat= CanReadReg(RX_BUF0);
pdat= CanReadReg(RX_BUF1);
pdat= CanReadReg(RX_BUF2);
pdat= 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;
CanReadFifo(buffer);
CanID = (((u32)buffer << 24) + ((u32)buffer << 16) + ((u32)buffer << 8) + buffer) >> 3;
for(i=0;i<8;i++)
{
pdat = buffer;
}
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);
CanWriteReg(TX_BUF2,pdat);
CanWriteReg(TX_BUF3,pdat);
CanWriteReg(TX_BUF0,pdat);
CanWriteReg(TX_BUF1,pdat);
CanWriteReg(TX_BUF2,pdat);
CanWriteReg(TX_BUF3,pdat);
CanWriteReg(TX_BUF0,pdat);
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总线数据
}
}
说的很有道理,高不成,低不就.狗皮膏药一样还到处乱贴小广告.成不了气候.
不过, 还是要支持一下, 毕竟做实事的. STC的51就是搅局儿的,虽然我用了10年STC,但最后还是放弃了,因为曾经给予很多希望,但最后发现这家伙就是个混世魔王,从头到尾不能仿真,我就不了解为啥还有些人在使用,现在我转向了深圳赛元的,能仿真,手册例程非常正规,用的很爽 这几天测试了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以下)。 感觉 STC错过了很好的机会, 没有跟上ARM, 也没有弄RISC-V, 而是搞什么非主流STC16,
国内51的老大, 太可惜了. STC16注定是一个短命的东西,他就是搅屎棍,还在简直51,C251的我估计成本比做cortex m0还高。
首先这个价格实在没啥优势,只是现在很多老工程师和学生在用,实际很多ARM秒杀裤衩都不剩,国产也有很多优秀的51厂商。
调试都做的不错,赛元,中颖,中微,性价比高的arm华大的M0 GD的130,你想原地圈地,那是不可能的,别人已经远远超过你了。 我在用国产赛元8051,性能很高,文档例程写的很好,有自己的仿真器,仿真很完善,整个产业链都挺完善的,不像STC,官网乱的跟一窝蚂蚁似的,永远不能仿真,市场就是这样,总是用先进的价格低廉的东西淘汰老旧落后的东西,STC估计也蹦哒不了多久了,但因为还是有一批学习能力差的不能升级的用户,等到这批用户再被淘汰了,那STC倒闭也就差不多到时候了 stc16只要能取代自己的8位机就已经成功了,
我淘宝买了好多小电子产品,用的都是stc的mcu
没有实时仿真确实不好,有时找个bug搞死人 以前看stc网站,说要搞arm核心。一直没搞。
现在错过了,搞251核心,是不是不收版税 我觉得 STC 最大的绊脚石,是没有完善的库函数。51芯片寄存器少,做大一点的项目已经有些复杂了,更不用说 STC16、ARM 和 RISC-V 了。如果官方一直不给库函数,那将是开发者的噩梦,将会限制芯片的推广。 coody 发表于 2021-1-31 20:35
这几天测试了STC16F的样片,使用KEIL C251的编译器,主要是测试其扩展的硬件整数运算单元、硬件单精度浮点 ...
试过解码二维码么?我试过 STC8 解码一维条码(优化过的算法)。24MHz主频、512像素的从读取、中值滤波、二值化、解码,一共花了13ms左右,不敢拿去解码二维码了。(仅供参考){:sweat:} guysxpf 发表于 2021-2-1 20:42
试过解码二维码么?我试过 STC8 解码一维条码(优化过的算法)。24MHz主频、512像素的从读取、中值滤波、 ...
没解过条码,你要是用STC16F,解你这个一维码,应该不到2ms。 本帖最后由 fcccc 于 2021-2-1 21:17 编辑
感觉STC比较像土**友,不像个正规厂商.鼓吹芯片可靠性多好,也搞了这么多年了手册上你倒是把ESD,EFT测出来啊.
相比之下,国内某新开的小厂,ESD HMB 8KV,EFT5.5KV,LatchUP>200mA这不就一清二楚了
很多之前很火的大厂16位机都不行了,现在还搞16位?还是个老掉牙的251,能拼得过M0吗?M0+,M23, RISC-V又来了 说的STC的马甲都不敢出来了,说白了STC就是为了混口饭吃而已,没有想过要做成一个怎样怎样正规、有前景的事业,路子走的也不是正规路子,一些小商小贩确实有不少在用,但是正规公司的产品应该是没人敢用 上海华虹搞过SHC16L超低功耗MCU系列80251的,现在官网都没有资料了,是不是停产了?