_奶咖君_ 发表于 2023-12-15 17:27:11

STC8H8K64U与STC8A8K64D4与STC15W4K48S4的一些区别

本帖最后由 cofmilk 于 2023-12-15 20:26 编辑

开一贴,记录一下标题中的三款单片机的寄存器在手册中的区别。

由于工作性质需要将三款单片机的驱动整合到一个工程中,所以有了目前的需求。

持续更新 直到整合完成。由于代码属于公司的,所以这里只归纳手册上的差异。


以下使用STC8AD4表示STC8A8K64D4,使用STC8H表示STC8H8K64U,使用STC15W表示STC15W4K48S4(PS:个人表述习惯,李姐李姐)

_奶咖君_ 发表于 2023-12-15 17:53:33

第一部分,时钟
由于工作性质,这里讨论时钟的控制。对于主时钟对外输出功能不作讨论
1.STC15W单片机由于上市的比较早,这里只有一个主时钟分频寄存器,至于选择外部晶振还是内部晶振都是在ISP软件上选择的。
2.STC8AD4这里就已经多了很多的时钟源,当然寄存器也增加了很多,相比于STC15W最主要的增加了时钟选择寄存器,且各个时钟源的控制寄存器。
3.STC8H时代由于技术的发展时钟源又多了,且时钟树也更加的复杂。


这里着重比较一下STC8AD4与STC8H的寄存器,在STC8H的CLKSEL寄存器中多了有关PLL与高速IO相关的位。目前还没有用到,那么对于系统时钟的生成的代码上基本和STC8A的一致,无论是使用内部高速IRC还是使用外部高速晶振。当然在后面准备使用STC8H的可能还需要操作一下外部低速晶振。
对于主时钟分频这里STC8AD4与STC8H一样都是又256级 ,STC15W这里就如上图所示。


_奶咖君_ 发表于 2023-12-15 20:22:02

第二部分,EEPROM.

对于EEPROM STC8AD4与STC8H使用方法和寄存器相关的基本一致,代码可以直接使用. 但是与STC15W相比多了一个必须要配置的寄存器IAP_TPS.


如果STC15W使用这段代码时直接将这个寄存器操作平掉,然后在IAP_CONTR的WT中写入与主频相关的数据



_奶咖君_ 发表于 2023-12-15 20:55:54

本帖最后由 cofmilk 于 2023-12-15 21:00 编辑

第三部分,ADC



ADC这里STC15W的区别可就太大了,大跨步的大。

STC15W 是10位精度8个通道加一个内部通道的ADC;而STC8AD4与STC8H均是12位精度15个通道加一个内部通道的ADC

在对ADC的操作上也有很大区别,所以再写这部分代码的时候,就分开写的两边不再混用。

STC15W单片机的ADC在配置时还需要配置一个P1口模拟功能控制寄存器,在配置时需要置位对应通道的P1ASF位。不仅如此ADC转换结果调整寄存器位还塞到了CLK_DIV寄存器里,在使用的时候需要注意一下赋值方式.千万别一不小心把这个寄存器的其他位置的数据给改了..


到了STC8AD4与STC8H的时候就没有那么多的事儿了,只需要配置正确的IO工作模式就可以。其次,ADC功能相关的寄存器也没有东塞一个西塞一个了。而且,还可以使用PWM触发ADC的采集。再而且增加了ADC的时序控制和硬件自动求平均的功能。实际体验自动求平均确实再一定程度上抑制了ADC结果的波动。这东西有就用上..

而对于相同功能的寄存器位在不同单片机上的位置不同的问题,直接使用宏定义替换掉就OK了。实际上在代码开发的时候也推荐使用宏定义的方式替换掉魔法数字。


_奶咖君_ 发表于 2023-12-15 21:24:36

本帖最后由 _奶咖君_ 于 2024-2-18 14:19 编辑

第四部分,串口通讯。



对于这三个单片机来说串口有4个。如果从最基本的用法来说(中断接收+轮询发送),这三款单片机的串口驱动基本可以通用。

实际上STC8单片机比STC15单片机的串口1多了一组端口重映射(STM32手册上的叫法)或者叫功能脚切换。且STC8系列单片机上增加了DMA之后使用串口的方式又多了一种。

最近拿到了从积分商城里兑换的STC8H8K64U单片机之后,对DMA进行了测试,,也了解了一些机制。从单片机上来说由于没有串口超时中断,所以需要使用串口接收中断和定时器做串口接收超时功能。导致就算使用上了DMA单片机还是要不停地进入串口接收中断,且如果再使用DMA的串口发送,就需要在串口中断中加入对串口发送完成中断标志位的清除(之前使用的是轮询标志位的方式发送数据)。还有就是这个串口DMA在使用的时候一次只能传输256个字节,,emmmm,对于我的工作性质来说,稍微有点不够用。在我使用的过程中一次传输三四百个字节是经常会出现的情况。迫不得已实现了一套,不定长接收+不定长发送的DMA串口驱动。目前来说功能是已经实现了,,就看在之后的使用中又没有什么其他的bug。

增加一条,在串口2的重映射引脚上STC8AD4 与 STC8H和STC15W单片机的不同
STC15W和STC8H

STC8AD4


在串口1上除了 STC15W 上只有3组重映射端口,其余完全一样




神农鼎 发表于 2023-12-15 23:36:58

STC32G8K64-42I-LQFP48/44/32, 开始都有这个功能







神农鼎 发表于 2023-12-15 23:39:27


www.stcai.com



神农鼎 发表于 2023-12-15 23:44:23

STC8H8K64U实验箱中有系统解决方案





www.stcai.com/syx



巧克力 发表于 2023-12-16 09:40:18

本帖最后由 巧克力 于 2023-12-16 09:43 编辑

好好学习,天天向上

_奶咖君_ 发表于 2023-12-16 13:17:58

本帖最后由 cofmilk 于 2023-12-16 13:24 编辑

第五部分,定时器。

从STC15W开始到STC8H T0 与 T1定时器使用上完全一样,应该是从8051传下来的传统。

而到了T2 T3 T4这里出现了区别。最大的区别,在STC8系列单片机上,这里增加了8位预分频,这样就可以用定时器定更长的时间,从而减少单片机进入中断的次数。而之前的STC15W单片机没有这个预分频寄存器,如果想要定更长的时间就需要使用软件变量累加计数的方式来定时需求的时间。
其次就是定时器中断标志在STC8系列上可以软件读取,清除。但实际使用中这些标志是在中断服务函数中,由硬件自动清除。代码上完全不用处理。

对于定时器时钟输出部分,目前没有用到,不作讨论。

(PS:由于定时器1 2 3 4都有可能要作为串口1 2 3 4的波特率发生器,所以自己在写代码的时候为了更好的代码可移植性和易维护性,都是尽量避免使用定时器1 2 3 4来定时。选择其他的可以用来作为定时器功能的外设。例如:STC15W和STC8AD4上的PCA,STC8H上的PWM(还是16位的哦!),当然这个是和我自身工作的需求相关。)




页: [1] 2 3 4 5
查看完整版本: STC8H8K64U与STC8A8K64D4与STC15W4K48S4的一些区别