chen 发表于 2023-12-10 14:59:58

神农鼎 发表于 2023-12-10 10:15
STC32的 DMA-SPI 是设置的啥速度 ? 驱动 WS2812B...
帮也开源下参考程序,供大家交叉参考



等有空了我整理一下源码发出来,话说stc也可以考虑整个硬件驱动,这玩意用量还是很大的,搞个便宜的就可以成专用驱动了{:lol:}

chen 发表于 2023-12-10 19:23:09

神农鼎 发表于 2023-12-10 10:15
STC32的 DMA-SPI 是设置的啥速度 ? 驱动 WS2812B...
帮也开源下参考程序,供大家交叉参考



stc32f12k54驱动全彩led,无需反相,灯带数量只受xdata大小限制
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=5601
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)
已上传

神农鼎 发表于 2023-12-10 19:41:18

chen 发表于 2023-12-10 19:23
stc32f12k54驱动全彩led,无需反相,灯带数量只受xdata大小限制
https://www.stcaimcu.com/forum.php?mod ...

感谢,已加精,已广为转发 51世界 共享


https://www.stcaimcu.com/forum.php?mod=viewthread&tid=5601&page=1&extra=#pid44047
SPI-DMA, 驱动全彩LED,猜猜驱动的谁
SPI-DMA@STC32F12K54驱动全彩LED,无需反相,灯带数量只受xdata大小限制
===STC32F12K54, 8K edata
===STC32F12K54, 4K xdata, xdata 可以做 DMA-SPI 的缓冲区

chen 发表于 2023-12-10 20:06:17

还有就是希望带sw硬件仿真的产品,默认开启仿真(切到其他口不占用3.0和3.1),像stm32那样,可以在程序中关闭仿真和把仿真口用作普通io。
这样的话开发起来直接keil里面下载不用先设置仿真芯片

zhudean11 发表于 2023-12-10 20:06:32

希望能带can通讯

神农鼎 发表于 2023-12-10 20:09:18

zhudean11 发表于 2023-12-10 20:06
希望能带can通讯


杨为民 发表于 2023-12-10 23:08:41

本帖最后由 杨为民 于 2023-12-10 23:14 编辑

STC8H MDU32+功能设计1.   STC MDU32+简介(1)STC MDU32+是一款32位多功能数字运算单元。(2)STC MDU32+使用一组扩展的32位/16位/8位通用寄存器来实现扩展运算的功能。(3)由于STC8H的DATA空间很小,并且Keil的C51编译器缺省只使用8051的BANK0寄存器地址(DATA地址范围为00H~7H),因此STC MDU32+的扩展通用寄存器映射到地址00H~0FH的DATA空间,可以用传统的8051指令对其内容进行存取,实现了对8051的兼容。(4)除了扩展通用寄存器,STCMDU32+还包含了一个扩展操作寄存器EOP(SFR)和一个扩展状态寄存器ESR以及一个扩展操作出错(比如除以0,操作溢出)专用中断INT_MDU32。
2.STC MDU32+寄存器8位、16位、32位地址映射表
STC8H单片机系列
地址0 / 81 / 92 / A3 / B4 / C5 / D6 / E7 / F
8(08H)EDXECX32位名
DX2DXCX2CX16位名
BR8BR9BR10 BR11BR12BR13BR14BR15 / CL8位名
0(00H)EBXEAX32位名
BX2BXAX2AX16位名
BR0BR1BR2BR3BR4BR5BR6 BR7 8位名
在同一地址的不同名寄存器存取的内容是一样的。寄存器的高位在低地址。
3.   STC MDU32+基本操作
(1)寄存器操作
操作助记符操作内容说明
SWAP_ABEAX与EBX的内容互换与之对应的16位、8位寄存器内容也互换。
SWAP_CDECX与EDX的内容互换与之对应的16位、8位寄存器内容也互换

(2)双操作数算术运算
操作助记符操作内容说明
ADDX_EABXEAX=EAX + EBX32位加法
ADDX_ABXAX=AX + BX16位加法
SUBX_EABXEAX=EAX - EBX32位减法
SUBX_ABXAX=AX - BX16位减法
MULX_EABXEDX+EAX=EAX * EBX32位乘法,结果64位,高32位在EDX
MULX_ABXAX2+AX=AX * BX16位乘法,结果32位,高16位在AX2
MULX_KEIL16AX=AX2 * AXKEIL编译器的16位乘法,结果16位在AX
DIVU_EABXEAX+EBX=EAX / EBX32位无符号除法,结果32位商在EAX,32位余数在EBX
DIVS_EABXEAX+EBX=EAX / EBX32位有符号除法,结果32位商在EAX,32位余数在EBX
DIVU_ABXAX=AX / BX16位无符号除法,结果16位商在AX,16位余数在AX2
DIVU_KEIL16AX=AX / AX2KEIL编译器的16位无符号除法,结果16位商在AX,16位余数在AX2
DIVS_ABXAX=AX / BX16位有符号除法,结果16位商在AX,16位余数在AX2
DIVS_KEIL16AX=AX / AX2KEIL编译器的16位有符号除法,结果16位商在AX,16位余数在AX2

(3)单操作数算术运算
操作助记符操作内容说明
SET0_EAXEAX=032位全清0
SET1_EAXEAX=-132位全置1
SET0_EBXEBX=032位全清0
SET1_EBXEBX=-132位全置1
SET0_ECXECX=032位全清0
SET1_ECXECX=-132位全置1
SET0_EDXEDX=032位全清0
SET1_EDXEDX=-132位全置1




NEGS_EAXEAX=-EAX32位求负数
NEGS_EBXEBX=-EBX32位求负数
NEGS_AXAX=-AX16位求负数
NEGS_BXBX=-BX16位求负数




INC1_EAXEAX=EAX+132位加1运算
INC1_EBXEBX=EBX+132位加1运算
INC4_EAXEAX=EAX+432位加4运算
INC4_EBXEBX=EBX+432位加4运算
INC1_AXAX=AX+116位加1运算
INC1_BXBX=BX+116位加1运算
INC2_AXAX=AX+216位加2运算
INC2_BXBX=BX+216位加2运算
DEC1_EAXEAX=EAX-132位减1运算
DEC1_EBXEBX=EBX-132位减1运算
DEC4_EAXEAX=EAX-432位减4运算
DEC4_EBXEBX=EBX-432位减4运算
DEC1_AXAX=AX-116位减1运算
DEC1_BXBX=BX-116位减1运算
DEC2_AXAX=AX-216位减2运算
DEC2_BXBX=BX-216位减2运算

(4)二进制按位运算
操作助记符操作内容说明
BAND_EABXEAX= EAX & EBX32位与运算
BAND_ABXAX= AX & BX16位与运算
BOR_EABXEAX= EAX | EBX32位或运算
BOR_ABXAX= AX | BX16位或运算
BXOR_EABXEAX= EAX ^ EBX32位异或运算
BXOR_ABXAX= AX ^ BX16位异或运算
BCPL_EAXEAX= ~ EAX32位求反运算
BCPL_EBXEBX= ~ EBX32位求反运算

(5)位移运算
操作助记符操作内容说明
SHLX_EAX_CLEAX=EAX << CL32位左移
SHLX_EBX_CLEBX=EBX << CL32位左移
SHLX_AX_CLAX=AX << CL16位左移
SHLX_BX_CLBX=BX << CL16位左移
SHRU_EAX_CLEAX=EAX >> CL32位无符号整数右移
SHRU_EBX_CLEBX=EBX >> CL32位无符号整数右移
SHRU_AX_CLAX=AX >>CL16位无符号整数右移
SHRU_BX_CLBX=BX >>CL16位无符号整数右移
SHRS_EAX_CLEAX=EAX >> CL32位有符号整数右移
SHRS_EBX_CLEBX=EBX >> CL32位有符号整数右移
SHRS_AX_CLAX=AX >>CL16位有符号整数右移
SHRS_BX_CLBX=BX >>CL16位有符号整数右移





(6)高精度/快速运算
操作助记符操作内容说明
MMD32_EABXEAX=EAX*EBX/EDX32位混合乘除,先乘为64位中间结果,再除为32位结果在EAX
MMD16_ABXAX=AX*BX/DX16位混合乘除,先乘为32位中间结果,再除为16位结果在AX
LTC32_EAXEAX=(EAX-EBX)*ECX/EDX32位线性定标,中间结果为64位(不损失精度)。EAX为测量值,EBX为零点值,ECX为满刻度信号值,EDX为AD变换级数
LTC16_AXAX=(AX-BX)*CX/DX16位线性定标,中间结果为32位(不损失精度)。AX为测量值,BX为零点值,CX为满刻度信号值,DX为AD变换级数
MA32_EDXEDX=EDX+EAX*EBX32位乘加运算


以上是根据个人编程经验的总结出来的,提出给大家分享和讨论。希望通过对STC8H系列单片机增加MDU32+硬件处理器的方法,将STC8H系列8位单片机的核心性能提高到32位的水平,为用户提供一款低价位高性能的8051单片机。
如果MDU32+实现了上述功能,本质上是为8位的CISC的8051内核增加一颗32位的RISC的APU,这将使STC8H成为第一颗双核的8051单片机


LAOXU 发表于 2023-12-11 04:28:15

杨老师的大作, 仔细看了 3遍, 写的非常周全, ALU 常用主要功能已全包括.

提点小建议:

1. SWAP_AB         EAX与EBX的内容互换   与之对应的16位、8位寄存器内容也互换。
   SWAP_CD         ECX与EDX的内容互换   与之对应的16位、8位寄存器内容也互换

   这两条指令, 实际操作是 两字内容交换(相当于 51的 XCH 指令), 因为你的寄存器排列风格是: EAX与ECX 组对, EBX与EDX 组对

   并非常规的 EAX与EBX 组对, ECX与EDX 组对, 是否改成 SWAP_AC , SWAP_BD 更加有用一点(字内容的 高低交换, 相当于 51的 SWAP 指令) ?



2. MULX_EABX       EDX+EAX=EAX * EBX      32位乘法,结果64位,高32位在EDX

   这条指令, 与其他操作指令风格有点差异, 是否 高32位改在ECX 中, 会更好一些 ?

                   ECX+EAX=EAX * EBX      32位乘法,结果64位,高32位在ECX(寄存器EAX与ECX 组对, 在风格上保持高度一致)



3. MULX_ABX / MULX_KEIL16 , DIVU_ABX / DIVU_KEIL16 , DIVS_ABX / DIVS_KEIL16 ,

这 3组 16位乘除法, 有点重复多余, 个人认为 2选1 足够满足实际使用了.

推荐保留 MULX_ABX , DIVU_ABX , DIVS_ABX 操作(和其他操作指令风格一致), KEIL16 的去掉(实际使用中, 前面多加一条数据 MOV 即可实现此功能).


4. 位移运算, 无论左移还是右移, 移出位 放在 CY 中(不能丢弃), 使于后续扩展操作(比如 64位移位, 双精度浮点数运算 等)

LAOXU 发表于 2023-12-11 04:35:21

5.最好多增加一条 规格化 32位左移 操作

LAOXU 发表于 2023-12-11 05:45:43

6.由于 寄存器的高位在低地址。

    是否 把 EAX 和 EBX 及其相关寄存器, 互换一下定义位置, 更加 顺眼便于理解 ?

    同理,   ECX 和 EDX 及其相关寄存器,也需要互换一下定义位置,
页: 1 2 3 4 [5] 6 7 8 9 10 11
查看完整版本: STC8新设计将搭载新MDU32硬件32位加减乘除移位,向64位超算进军,请建议