再后来,STM32F030 的价格离谱了(虽然 MCU 成本占比并不大),我就开始选择国产替代了。
尝试①CKS32F030F4P6. 据说是二进制兼容 STM32F030 的,价格又便宜。买来样片一试,居然可以用 ST-Link 下载,被 ST-Link Utility 识别为 STM32F030 了。原来的 HEX 不作改动直接烧写,运行效果和 STM32 一样。因为我要的功能很简单,只是我用到的功能验证没有问题,不代表 100% 和 STM32 兼容。便宜好用,可是,今年初也缺货涨价了。
尝试②HK32F030MF4P6. 当我发现国产替代的 MCU 也开始缺货,就考虑下其它方案了,不排除以后用 C51 带代替。因为还有引脚兼容要考虑,我把 PCB 修改成了兼容 STM8S003 的,不兼容 STM32F030 了。接着,发现了 HK32F030MF4P6 这个奇特的型号。这家厂家还有叫做 HK32F030F4P6 的型号,后者是和 STM32F030 引脚兼容的。而前者,却是兼容 STM8S003. 我测试样品发现它并不能被 ST 的工具识别,只能用 OpenOCD 来自己写脚本程序下载了。虽然引脚分布变了,但一看手册我发现这和 STM32 的寄存器基本上是一回事,所以用个 STM8S 的小板子放了段代码进去,运行点灯没问题,就投板子做去了。
尝试③3XM1008F6P6. 最近的事情,我有另一个作品用 STM32F031F6P6 的需要再做,但因为缺货也得找替代型号了。CKS32F031 已经买不到了。搜索找到这个型号号称可以兼容 ST 的 F030/031, 价格还不贵。好象厂家正在做推广,买样片还包邮顺丰,那就先验证。居然又是可以被 ST 工具识别成 STM32F0 的,但是我的代码烧进去不能正常工作了。
下面说踩的坑了
XM1008 这个,我遇到原来 STM32 代码不兼容的地方有两个。(1) GPIO.BSRR 这个寄存器,在 STM32 中是可以 32-bit/16-bit/8-bit 读写的,但是在 XM1008 上面,BSRR 的高16位用一个半字操作来写,就无效了——源代码改一下就能解决。但是这暗示着 XM1008 可能在寄存器的访问方式上与 STM32 不完全一致。(2) 这个其实是我在 STM32 的代码中有bug, 但是STM32却按我的意图工作了,在 XM1008 上严格地失败。我操作 SYSCFG 的 CR 寄存器改变内存映射,却没有在 RCC 中将 SYSCFG 使能。这个错误操作在 STM32 上居然成功起了作用。
HK32F030MF4P6 的坑,因为板子刚焊回来,是才调试的。这里的坑倒是费了我不少工夫找问题。这个芯片,可以看成 STM32F030 的一个变种。虽然比较头文件的寄存器定义,跟 STM32 看起来是一样的……(但是魔鬼可能在细节里面)我修改过引脚使用的程序烧进去就不工作了,而且不能重新烧程序,SWD 口连不上…… 我的程序用了 STOP 模式,靠外部中断唤醒。按照 STM32 上的经验,在 STOP 模式下是能用 SWD 调试的,除非把 DBGMCU 里面允许低功耗调试的开了。奇怪的是,我用复位引脚也不能让 SWD 连上(Connect under reset),这个 MCU 变砖了一样。 为了找问题,我用了实验板和另外一片芯片,在代码中加了一段延时用于调试器介入。我发现了 MCU 的 SCB.CR 的 SLEEPDEEP 位不设置的话,外部中断可以唤醒,也就是在普通 Sleep 模式工作是正常的。为什么用 STOP 模式就不正常呢?而且,在 STOP 模式进入之后,不但外部中断不能唤醒,复位脚也不起作用。
后来我注意到这产品手册上提到,除了电源脚外,引脚都可以做 GPIO. 哦,是,NRST 脚也可以做 GPIO. 仔细核对,NRST 脚也就是 PA0. 而我的代码将默认引脚都设置成 analog 模式去了。所以,要给 PA0 设置成 AF 才可以作复位。复位脚问题解决了。但是 STOP 模式下还是不能复位。奇怪了,我测量了下工作电流,还没有达到 STOP 模式那么低。再对照下手册,HK32F030M 有 Sleep, Deep Sleep, STOP 模式,比 STM32F030 多了一个 Deep Sleep. 而我测量的电流,似乎和 Deep Sleep 差不多。难道休眠模式错了
按照手册给出的说明,我设置 SLEEPDEEP 位进入 STOP 模式并没有问题。这坑从哪里来的?
然而,我将 PWR.CR 的 LPDS 位写1之后,居然就成功了。电流也小了,也可以NRST脚复位了。