rddzmcvb 发表于 2025-12-7 14:52:35

STC32G144K246 的 DSP-数学协处理器 怎么使用?

对 STC32G144K246 的 DSP-数学协处理器 有兴趣,
但没有看明白怎么使用,最简单的:


我想实现32位有符号的乘法,这个结果可能是64位的,
keil 中貌似没有long long ?

另外,我要32位有符号的加法,如果从结果判断是否溢出等等。
看手册貌似要汇编配合,但没有看明白和C的调用关系...
希望有老师能讲解下


神农鼎 发表于 2025-12-7 21:42:20



深圳国芯人工智能有限公司-库函数

神农鼎 发表于 2025-12-7 21:44:12

STC32G144K246 的 DSP32-数学协处理器
包含 原 STC32G12K128/AI8051U的 MDU32-数学协处理器





====================================================================


STC32的CPU-指令集原生有 32位加减指令集,16位乘除加减指令集
===参见 AI8051U 用户手册










王昱顺 发表于 2025-12-8 13:15:56

本程序使用C程序中调用ASM函数实现DSP运算

已在STC32G144K246核心板V1.1上测试通过,测试内容包括固定值计算:
32x32=64:



变化值计算:


均验证成功


因为Keil C251本身不支持long long类型定义,这里使用了一个数组来表示,实际运算中,这部分使用汇编传递,并不影响

程序使用了EDATA内的绝对地址定义,函数内并无传参(推荐使用这种方法,因为传参有参数量限制,绝对地址定义可以直接用)


使用说明:
ASM文件中,已经给出对应关系,直接照着写就行了://EAX->DR4,EBX->DR0,ECX->DR20,EDX->DR16(默认状态下)
小科普:DR0代表的是32位的值,可以拆分成WR0和WR2这两个16位的值,也可以拆分成R0,R1,R2,R3这样四个8位的值,
改变R0,WR0和DR0内的最高8位也会跟随改变
MOV DR0, EDATA 100H 这句就是将我们的变量直接装载进这个寄存器,32位一次性操作就行了
MOV DPUOP,#09BH 这个是对应的触发指令,这里可以参考数据手册的这个部分:

对应的指令填上就行了
最后是MOV EDATA 108H, DR16 这句的意思是将结果值再复制到结果变量里面
如果需要多个函数,只需要类似这样,复制粘贴增加一个不同名字的函数即可(我这里的ASM_ADD实际还是乘法部分的内容,用户自己更改成对应的即可)

然后新增加的函数,到main.c的开头添加一个extern定义,就可以在程序中调用了


以下是编译通过的程序,程序运行在120Mhz,内部使用CHIPID和PLL调整到120Mhz,与下载时指定的IRC无关
串口使用115200bps即可看到数据回传


李理离黎里 发表于 2026-1-26 21:13:16

神农鼎 发表于 2025-12-7 21:42
深圳国芯人工智能有限公司-库函数

大佬,是不是把这个库文件加到我的工程里面,计算时就使用DSP了?{:baoquan:}
页: [1]
查看完整版本: STC32G144K246 的 DSP-数学协处理器 怎么使用?