|
|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 suhetao 于 2026-1-30 08:44 编辑
最近想DIY一个电桥,重复造轮子没有任何意义,综合考虑后想着从开源方案入手,改良复刻一个成熟度比较高的低成本开源方案。无疑最早开源的许老师电桥资料比较多,热度比较高,但是查看windows画图搞的原理图后,DDS是通过PWM+RC低通滤波器模拟DAC实现,受限于PWM精度以及MCU性能7.8125khz就是极限,无法实现更高测量频率的需求。
随后发现立创开源上有个公开的许老师电桥STM32 100khz电桥设计,感谢作者nxpyhgp001的分享
https://oshwhub.com/nxpyhgp001/stm32lcd-biao
mcu升级成cortex-m3 stm32f103,同时利用ad9850 DDS芯片提高了测量频率,然而不幸的是软件代码并没有开源,只提供了一个名为GPIO.hex半成品的烧录固件,需要许老师提供注册码手动输入后才能使用。此举无疑限制了此版本的发展,也让硬件无法改动,可玩性几乎等于0。加上原始贴所在矿坛删库跑路,此版本电桥唯恐要成为绝唱。
工作之余稍微花了点时间逆向分析一下固件,先分析出相关的序列号以及注册码生成算法。后续会慢慢逆向或者重构实现一个完全适配此硬件的开源软件版本。这里省略逆向分析的过程。这并不是这个帖子讨论的重点,直接上结果。
1、序列号生成算法是通过读取stm32 96位的Unique device ID register获取唯一设备ID,拆分成3个32位的DWORD类型表示和进行以下计算。
- uint32_t *CPUID = 0x1FFFF7E8;
- int iSerialKey;
- double fSerialKey = fmod(CPUID[0] * 7.0 + CPUID[1] * 2.0 + CPUID[2] * 9.0, 973000.0);
- fSerialKey = fabs(fSerialKey);
- iSerialKey = (int)fSerialKey;
- if (iSerialKey < 100000)
- iSerialKey += 100000;
复制代码
例如stm32的96位唯一的设备ID是(16进制)
48FF6F064986
575624371187
通过以上运算后得到的iSerialKey就是924670(10进制)
屏幕上会在设备id下面显示924670-V2,序列号就是924670
2、注册码的生成,通过生成的序列号进行以下运算
- double cos_val = cos(iSerialKey % 97);
- double sin_val = sin(iSerialKey % 8843);
- double fLicenseKey = fabs(cos_val * sin_val);
- int iLicenseKey = (int)(fLicenseKey * 60043.0 + 5233.0);
复制代码
例如屏幕上显示的是924670-V2,序列号iSerialKey就是924670
924670通过以上运算得到的注册码iLicenseKey就是21468,输入21468既可完成注册且把结果保存写入在mcu内部flash。
再次重申一下宇宙声明
1、所有讨论仅限个人学习与研究目的,以上是我个人研究学习的一些经验所得和知识分享。
2、请尊重ta人的劳动成果和知识产权,许老师既然没有选择把STM32 100Khz电桥的软件代码开源自然有他自己的考量,本人深表理解和尊重。
3、帖子中任何内容被认定会让许老师STM32 100KHZ电桥的软件版权受到侵犯,请立即联系论坛管理或者联系我本人第一时间删除此贴。
|
打赏
-
查看全部打赏
|