关于用户无效输入处理的小想法

编写用户界面逻辑时,我们需要处理用户无效输入,或在某些情况下禁止用户操作。要应对这种意外情况,有两类方法:“先发制人”,隐藏无效操作的按钮或界面元素,让用户根本无法进行无效操作;“坐以待毙”,在用户进行无效操作后,弹出错误提示。本文针对这两种方法的优劣进行讨论。

继续阅读“关于用户无效输入处理的小想法”

STM32 使用 OpenOCD+CLion 调试时系统时钟频率不正确的问题解决

使用 CLion 开发 STM32 程序日渐成为一种新时尚。在 CLion 中,我们一般使用 OpenOCD 作为 gdb server 来进行调试。

在使用 LL 库的过程中,使用“调试”功能时,我发现了一个比较严重的问题:如果点击“调试”按钮来启动程序,并且 CLion 运行配置中选择的启动模式是 reset init,单片机的系统时钟频率就会不正确(始终为 64MHz),并且抖动很大;然而,如果点击“运行”按钮来启动程序,又一切正常。上述问题在使用 HAL 库时依然存在,且问题更加严重:程序在配置系统时钟的函数里直接卡死,进入 Error_Handler。本文对此故障进行分析,并提出解决方法。

继续阅读“STM32 使用 OpenOCD+CLion 调试时系统时钟频率不正确的问题解决”

MP5416 OTP GUI 软件连接芯片的方案(无需 Eval Kit)

MP5416 是一款便宜大碗的电源芯片,包含 4 路 DCDC、5 路 LDO,且电压、上电时序均可使用 I2C 配置。这么牛逼的芯片,居然 tb 5 块钱就能买到(今年芯片涨价前甚至只要 1 块多),实在是无人能及了。本文简单介绍 MP5416 的联机方法。

继续阅读“MP5416 OTP GUI 软件连接芯片的方案(无需 Eval Kit)”

为什么在门级仿真中不使用 X 作为寄存器的初始值

我们在做数字逻辑仿真时,通常用 X (unknown) 作为寄存器的初始值(仿真器的默认行为),这样可以通过 X 值的传播使未初始化的寄存器暴露出来。然而,这种方法并不总是准确的,其会导致一些情形下,原本应为有效值的信号也被误判为 X。如果设计中使用了同步复位,在综合后的网表级仿真时,很容易发生这种误判。

继续阅读“为什么在门级仿真中不使用 X 作为寄存器的初始值”

解决 gcc + openocd + stm32 烧录程序时覆盖 bootloader 的问题

我希望将 bootloader 放到 0x08000000,主程序放到 0x08008000。gcc 编译时默认会把 Program Header 的 Align 调到 0x10000,导致产生的 ELF 文件的加载地址从 0x08000000 起始,openocd 烧写时会覆盖掉 bootloader,产生麻烦。解决办法是在链接器参数中增加 -z max-page-size=4096,调小页面大小;或者直接增加 -n选项,让 Program Header 不要对齐。修改后,烧录时就不会覆盖掉 bootloader 了。

APC BP1000CH UPS 调试记录

TL;DR: 这是一款套牌产品,实际使用的不是 APC 的协议,而是 Voltronic 的协议。这款 UPS 可以用 NUT 工具来连接电脑,实现 Linux 系统下的自动关机,只需使用 https://networkupstools.org/protocols/voltronic-qs.html 协议就行了。

更新:这款 UPS 输出是方波(最廉价的方案),不兼容带有主动 PFC 的电源(现在市面上大部分电脑电源都是这种电源),会导致供电不稳定、不开机等问题,强烈不建议购买!!