作为一名蝴蝶粉,对STM32缺货涨价事情表示遗憾。但是不论做产品还是DIY玩,成本也不可能不在乎(说不在乎也是有限度的)。
去年下半年我设计了一个作品(算少量批量做的产品),板子上有些地方需要个MCU进行简单的控制。因为我用 STM32 系列用得最熟悉,就选了差不多最便宜的 20 脚 STM32F030F4P6 来用。当时两块多一片吧,也不是最便宜的 MCU 方案,但这样对我来说开发起来最快。一个月后第二批采购的时候,同一卖家的报价就涨了不少,不过还是继续用了。再过了一个月,居然又涨了价,于是我换成了引脚兼容的 STM32L010F4P6,从STM32天猫店买的,四元不到。虽然比原来的还是贵,但比当时的 F030F4P6 要便宜。
再后来,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脚复位了。
新闻来源:电子工程世界,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。