找回密码
 立即注册
查看: 1118|回复: 4

给STC的建议

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-09-22 02:32:15

3

主题

9

回帖

301

积分

中级会员

积分
301
发表于 2024-7-27 14:35:12 | 显示全部楼层 |阅读模式
最近一直在使用STC,对STC芯片有一个非常强烈且极为有益的建议:普遍而系统地加强STC芯片现有的各模块之间的联动能力。

其实,在加强模块联动能力方面,STC一直在做。

先说一说各模块联动的好处,以及STC在这些方面的努力和进步。

例如,以前,STC芯片的ADC模块与定时器模块是没有联动的,也就是没有PWM触发ADC转换的功能。这就导致一个问题:当希望ADC以一个固定且无抖动的周期等间隙采样时,STC芯片就无法做到。但现在,很多新出的STC型号,其ADC模块都已经实现了与定时时器的联动,也就是实现了PWM触发ADC转换的功能。这就使得STC芯片的ADC能轻松实现固定且无抖动的周期等间隙采样,这是一个非常重要的进步。

又如,以前,STC的某些芯片,其ADC是没有与DMA联动的,这就导致一个问题:当需要使用ADC连续高速采样时,ADC会频繁产生中断,占用大量的CPU时间,导致STC芯片对ADC采样数据的实时处理能力偏低。但现在,很多新出的STC型号,其ADC模块都已经实现了与DMA模块的联动。这就使得STC芯片在执行ADC的连续高速采样时,不再频繁产生中断,而可以等待多个ADC数据采集完毕之后再统一处理,这极大地提高了STC芯片对ADC采样数据的处理能力。

不仅如此,很多新出的STC型号,还将LCM、I2C、SPI、I2S、UART等多种功能模块都是DMA模块联动了起来,同时也将SRAM模块与DMA模块联动了起来,甚至通过DMA将SRAM与SRAM也联动起来,这些联动,一下子将STC的极限数据处理能力提高了好几倍。

但是我认为,STC做得还不够,远远不够,因为在“联动”这个方向上,STC芯片还有很大的发展空间。

我的观点是:既然各功能模块一旦实现联动,就能让STC芯片的性能提高好几个档次,那么为何不更加系统地审视和规划STC芯片的联动能力,从而进一步提高STC芯片的能力呢?


不应局限于仅将ADC与定时器联动起来,还应普遍地、系统地将STC内部的所有功能模块都相互联动起来,这将使STC获得前所未有的性能提升!

注意,我说的是硬件级的联动,无需CPU干预的硬件自运行式的联动。

具体地说,就是要按照以下思路去设计联动框架:

首先,将DMA模块与定时器模块联动起来,允许通过定时器或PWM模块,定时触发DMA执行特定动作(类似于通过PWM定时触发ADC转换,现在的STC芯片,DMA有了,但是DMA没有与定时器联动)。

其次,将DMA模块与其它的所有功能模块联动起来,除了前面已经实现的ADC、LCM、I2C、SPI、I2S、UART模块外,还应将每个IO端口也视为一个通信模块与DMA联动起来,甚至将FLASH也与DMA模块联动起来(呃,FLASH这个要慎重)。

其三,还应当允许各功能模块也相互联动起来,形成具有“组合”或“级联”效果的复合联动。例如,允许将任意两个IO端口组成成一个16位的IO端口,或者允许将两字节的SPI通信(或其它通信)组合成一次16位数据的通信,允许将一个IO端口的数据定时读取出来自动传送到SRAM缓存,再允许定时将SRAM数据定时读取出来自动传送到IO端口寄存器,以及允许读取某个寄存器的值并将该值作为地址偏移量自动读取对应SRAM地址的SRAM单元的数据,自动送到某个IO端口寄存器中。

这样做有什么好处呢?

答案是:可以极大地提高STC芯片在测量、控制和数据处理、以及软硬件协调方面的极限能力(至少提升十倍),甚至可以让STC芯片实现部分硬件级数字逻辑电路、CPLD电路、FPGA电路的功能!如果实现了这样的STC芯片,谁还敢说STC芯片不够强大呢,谁还敢小瞧51内核呢?

作者有一个判断:MCU的性能瓶颈不仅在于主频、位宽和内部功能模块,更关键的还在于有没有实现内部各功能模块的硬件级联动!将STC芯片的主频从305MHz提升到150MHz很难,但也不过只能提升4倍的性能而已;将STC芯片从8位宽度提升至32位宽度,性能也不过只能提升数倍;但如果将外设的硬件级联动搞好,则STC芯片的性能可以轻松提升10倍以上!如果三管齐下,则STC芯片的性能可以提高数十倍乃至上百倍。

(1)IO组合端口
①设计一个名为P16CFG的8位寄存器,其复位值为0x00,它的[2:0]位和[5:3]位分别表示组成16位IO端口的低八位和高八位端口的编号。当低八位和高八位的端口编号相同时,表示所组成的16位IO端口的低八位和高八位是同一个IO端口。P16CFG的[7:6]位,用于指示对于组合端口中被P16MSK排除掉的那些IO引脚(不妨称为冲突引脚)在被传统寄存器操作时的影响:00-传统寄存器可以操作该IO端口中的所有IO引脚;01-传统寄存器仅能操作该IO端口中的有冲突引脚;10-传统寄存器仅能操作该IO端口操作中的无冲突引脚;11-传统寄存器不能操作该IO端口中的任何IO引脚。
②再设计一组名为P16、P16M0、P16M1、P16PU、P16NCS、P16SR、P16DR、P16IE、P16PD的16位寄存器,用于管理组合后的16位IO端口,其复位值与STC芯片的同类寄存器的复位值相同。对以上各个16位寄存器写数据数时,先写低八位,再写高八位;写低八位时,数据被缓存;写高八位时,高八位数据与事先缓存的低八位数据自动组合成16位数据,然后并行地送入目标寄存器。从以上各个16位寄存器中读取数据时,先读取高八位或低八位都是可以的;每次读取高八位或低八位时,除了正常得到所读数据外,同时整个16位寄存器的值都会被缓存到16位的P16BUFF寄存器中。例如,写P16时,先写P16L,再写P16H,写完P16H后,16位数据并行生效;读P16时,先读P16H得到高八位,再读P16BUFF(保存着刚才读取P16H时P16的低八位值),或先读P16L,再读P16BUFF(保存着刚才读取P16L时P16的高八位值)。
③再设计一个名为P16MSK的16位寄存器,其复位值为0x0000,它的每一个位对应着16个IO引脚中的一个引脚;当某个位为0时,表示相应引脚映射被允许映射至组合端口(默认);当某个位为1时,表示相应引脚映射被允许映射至组合端口,此时对P16、P16M0、P16M1、P16PU、P16NCS、P16SR、P16DR、P16IE和P16PD等组合寄存器的任何操作,都不会影响到该IO引脚的工作状态。

如此设计,可以使8位MCU能够任意选择两个IO端口并组合成16位端口,并且从中任意排除掉(屏蔽掉)一个或多个有功能冲突的IO引脚,这实际上使STC芯片获得了构建具有1~16位任意位宽的组合端口的能力。假如没有这种能力,则当MCU希望从IO端口并行输出超过8位数据时,将不得不分两次实现,导致必然短暂地输出一个不希望看到的转场值;同样地,如果我们用R-2R电阻网络构建高于8位的DAC模块,并在大于256和小于256的数字量之间切换,那么DAC模块将一定会产生一个毛刺输出电压。但是当获得端口组合能力之后,以上问题便可迎刃而解。当将这种能力与下面所说的能力联动起来时,还能实现更实用和有趣的高级玩法。

(2)将组合端口与定时器模块、DMA模块,以及SRAM级联
①设计一个名为P16_CONTR的8位寄存器,它的[0]位为写触发位,[1]位为读触发位;它们的功能类似于PWM触发ADC转换,只不过这里是PWM触发(或定时器触发)P16寄存器的读写操作。每当有PWM或定时器信号触发了写触发位时,在下一个时钟的上升沿,硬件自动触发DMA从指定的SRAM单元中读出一个数据写入P16寄存器,并将SRAM地址按预置方式自动加1或减1,当SRAM地址自增或自减至DMA的预置值时,由P16_DMA产生一个写完成标志以触发写完成中断事件;而每当有PWM或定时器信号触发了读触发位时,在下一个时钟的上升沿,硬件自动触发DMA从P16寄存器中读取一次外部电平,将其写入指定的SRAM单元中,并将并将SRAM地址按预置方式自动加1或减1,当SRAM地址自增或自减至DMA的预置值1时,由P16_DMA产生一个读完成标志以触发读完成中断事件。
②P16_CONTR的[2]位为SRAM写地址控制位,当P16_DMA产生写完成标志时,如果该位为1则硬件自动将SRAM地址返回起始值,为0则硬件自动将SRAM地址计数方向反转(由之前的自增1变成自减1,或由之前的自减1变为自增1);
③P16_CONTR的[3]位为SRAM读地址控制位,当P16_DMA产生读完成标志时,如果该位为1则硬件自动将SRAM地址返回起始值,为0则硬件自动将SRAM地址计数方向反转(由之前的自增1变成自减1,或由之前的自减1变为自增1);

④P16_CONTR的[4]位为SRAM写地址控制使能位,该位为1时启用[2]位中设定的SRAM写地址控制功能,为0时禁用[2]位中设定的SRAM写地址控制功能;

⑤P16_CONTR的[5]位为SRAM读地址控制使能位,该位为1时启用[2]位中设定的SRAM读地址控制功能,为0时禁用[2]位中设定的SRAM读地址控制功能;



这种设计,使得STC芯片能够实现硬件自运行的IO端口定时读写操作,从而非常适合用于设计逻辑分析仪和数字信号发生器,以及可用于实现非常多的新奇应用。试想,当我们使用30MHz的STC芯片时,如果它居然能以5MHz乃至10MHz的频率无抖动地周期性读取P16端口的电平,并且整个过程是硬件自动行的,不太占用CPU资源,这可不就相当于将STC芯片的IO读入控制能力提升了至少10倍?同理,当我们使用R-2R电阻网络实现1~16之间的任意位宽的手工并行DAC模块时,使用30MHz的STC芯片居然能以5MHz乃至10MHz的频率无抖动地周期性将DAC数据写入P16端口,这可不就相当于将STC芯片的IO输出控制能力提升了至少10倍?如果用这样的STC芯片做逻辑分析仪和数字信号发生器,其速度指标起码比未实现这种功能的现有STC芯片高十倍!

如果我们允许SPI接口也如此的级联操作呢?这时,用户可以通过74HC595扩展IO口,并在扩展的IO口上实现上述逻辑分析仪和数字信号发生器,你看,STC芯片的可玩性是不是就高了很多了?

再举一例,当我们设计按键检测程序时,常常使用定时器和定时中断,每隔10ms扫描一次IO端口,以检测是否有按键按下并执行消抖算法;这就导致CPU每隔10ms就被按键识别程序占用一下。当STC芯片实现上述级联以后,我们完全可以将扫描工作交给硬件自动运行,即:每隔10ms自动触发DMA读取IO端口的电平数据并缓存到指定的SRAM中,并预置当DMA读取次数达到30次时产生DMA中断,以触发按键识别程序。这样一来,按键识别程序每隔300ms才会打扰一次CPU,并在这一次机会中,根据SRAM中存储的30次电平数据序列,集中完成按键动作的识别和消抖处理,从而避免了按键识别程序频繁占用CPU资源,并显著提高了CPU处理其它事务的能力。

再举一例,STC芯片目前已经实现了ADC模块与定时器的联动,ADC又实现了与DMA的联动、DMA又实现了与SRAM的联动。也就是说,目前的STC芯片,其ADC、定时器、DMA和SRAM,已经实现了上面所说的级联。于是我们可以让STC芯片轻松以800ksps的采样率,无抖动地周期性采样外部信号,而不过多地占用CPU资源;当我们不需要达到12位精度时,我们甚至可以进一步提高采样率而仍然不过多占用CPU资源。这种对ADC采样的高速处理能力,在STC芯片没有实现ADC、定时器、DMA和SRAM以及它们的级联的时候,简直是不可想像的。如果我们还希望在此基础上,进一步将ADC的采样数据通过SPI接口实时保存到外部SRAM中呢?只要ADC、定时器、DMA、SRAM和SPI都级联在一起,就能实现了!通过定时器,控制ADC以较高的频率无抖动地周期性采样,再通过DMA将采样的数据及时保存到SRAM中,再通过定时器控制SPI以等同于ADC采样频率的频率无抖动地周期性将SRAM中的数据发送出去(STC目前尚未实现此功能,因为无法控制发送周期,无法实现无抖动的发送周期),并存储到外部SRAM中,这样就可以实现硬件自运行的具有超高存储深度(例如几十MB)的ADC采样。

个人认为,所有的数据输出和输入口,包括而不限于IO端口、组合IO端口,以及计数器、比较器、ADC、SPI、I2C、I2S、UART、CAN等,都应普遍而系统地实现上述级联功能,因为它们对于STC芯片的性能提升效果实在是太突出了,等于为STC芯片开了无数个外挂,大大增强STC芯片的可玩性,使得用户有机会进一步挖掘出更多的独特新玩法!

(2)IO级联端口
①设计一个名为IOCFG的8位寄存器,其复位值为0x00,其[2:0]位和[5:3]位分别表示用于级联的输入端口和输出端口的编号。当低八位和高八位的端口编号相同时,表示输入端口和输出端口是同一个IO端口。
通过定时器,定时触发IOCFG指定的IO输入端口读取外部电平,并在硬件层将读取到的数据值作为SRAM偏移地址(预先设计SRAM基址),自动到SRAM中读取“基址+偏移地址”所对应的存储单元中的数据值,自动送至IOCFG指定的IO输出端口。那么,只要事先在SRAM中预置一个尺寸为256字节的映射表,就能使STC芯片实现硬件自运行的CPLD功能,用于高速地模拟任意数字逻辑芯片及其逻辑,并且能够控制逻辑芯片的响应速度。IOCFG的[7:6]位,指示对于组合端口中被IOMSK排除掉的那些IO引脚(不妨称为冲突引脚)在被传统寄存器操作时的影响:00-传统寄存器可以操作该IO端口中的所有IO引脚;01-传统寄存器仅能操作该IO端口中的有冲突引脚;10-传统寄存器仅能操作该IO端口操作中的无冲突引脚;11-传统寄存器不能操作该IO端口中的任何IO引脚。

②再设计一个名为IOMSK的16位寄存器,其复位值为0x0000,它的低八位的值表示是否允许IOCFG中指定的输入端口中的各个引脚被映射作为级联输入引脚,高八位的值表示是否允许IOCFG中指定的输出端口中的各个引脚被映射作为级联输出引脚;对于IOMSK中的每一个位,为1表示相应的引脚被禁止映射,为0表示被允许映射(默认)。


IO级联端口的硬件自运行原理可简单表述如下:
定时器---->触发IN端口周期性读取数据--->自动将读取到的数据值与BASE值相加得到SRAM目标地址---->自动读取目标SRAM地址中的数据---->将该数据自动送至OUT端口。
在SRAM中分配一个以BASE值为基址(基址值可以由用户任意设置)且尺寸为256字节的SRAM表,则用户只需要在该表中填充映射逻辑,就能改变IO级联端口的输入输出逻辑,从而模拟任何的数字逻辑芯片,实现了CPLD乃至FPGA的硬件能力。并且,由于STC芯片的IO口还可以做更多的控制,使得STC芯片模拟出来的CPLD比CPLD自身还要灵活、比FPGA也不遑多让。一款可以硬件自运行地模拟任意数字逻辑芯片和CPLD乃至FPGA的STC芯片,其性价比显然会上一个台阶。

如果更进一步,设计两组IO组合端口,并允许将它们设置为IO级联端口,则我们甚至能实现超过8位宽度的CPLD。用这样的STC芯片设计一款R-2R电阻网络式的手工并行DAC,岂不是更妙?常规的手工R-2R电阻网络存在非线性问题,但是我们可以利用硬件自运行的SRAM映射表,自动校准该网络的非线性问题。
其算法如下:首先,由用户构建13位R-2R电阻网络以实现13位的并行DAC;然后依次向DAC输出0~8091量化数据并用DAC回读,得到13位并行DAC的输入输出曲线,据此生成DAC校准表,保存在SRAM中。之后,将13位DAC电阻网络当成12位使用,每当需要输出量化数据时,只需将12位量化数据送入IN端口寄存器,硬件就会自动将该寄存器的值作为地址偏移量送至SRAM中找到对应的13位DAC校准值,再自动将该值送至OUT寄存器得到精确的DAC电压。从用户的角度看,只需要编写一个校准程序生成DAC校准表,就能实现硬件自运行的DAC校准模块,之后,用户只需向IN寄存器写入量化数据,硬件就能根据校准表自动将校准后的量化数据送往OUT端口产生正确的DAC电压。

更进一步,当STC芯片读取外部非线性传感器的信号并应用执行PID控制时,我们又可以利用硬件自运行的非线性校准表将非线性传感器的量化数据自动转换成线性的,从而在不太占用CPU的前提下实现具有更高运态性能的PID控制算法,使得8位MCU能够发挥出媲美乃至超过32位MCU性能的水准。

总之,STC芯片如果能在“将功能模块联动起来”这个方向下功夫,必然能极为显著地提高综合性能。

以上就是我的建议,希望STC官方予以考虑。




1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-7-27 16:20:13 | 显示全部楼层
你提到的“硬件级的联动,无需CPU干预的硬件自运行式的联动” 在很多厂牌的MCU有广泛应用,比如Silabs的EFM32系列具有多通道PRS(Peripheral Reflex System)俗称外设反射系统,这对于低功耗设计特别有用,MCU可以在休眠的状态下完成很多事情。
QQ截图20240727161815.png

睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-27 17:13:21 | 显示全部楼层
这样我突然想起来pico上的PIO功能了,,可编程IO,,一些简单的通讯接口都能够通过这个硬件来实现,之前玩过一个ws2812的驱动,没有用什么SPI或者软件模拟的乱七八糟的方式,直接用这个PIO编程出WS2812的(不能叫通讯协议)应该叫接口协议,,当时看的我一愣一愣的,,还是自己少见多怪了
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-03 00:02:01
已绑定手机

19

主题

3191

回帖

4876

积分

论坛元老

积分
4876
发表于 2024-7-27 17:28:56 来自手机 | 显示全部楼层
够用就行,不一定要那么多功能。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-09-22 02:32:15

3

主题

9

回帖

301

积分

中级会员

积分
301
发表于 2024-7-27 20:50:04 | 显示全部楼层
晓*** 发表于 2024-7-27 16:20
你提到的“硬件级的联动,无需CPU干预的硬件自运行式的联动” 在很多厂牌的MCU有广泛应用,比如Silabs的EFM ...

低功耗是一个需要重视的方面,更重要的还是提高硬件模块的极限性能和降低硬件模块工作于极限性能下的CPU占用率;尤其是硬件自运行特性,简直让人心驰神往。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 20:27 , Processed in 0.126509 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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