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

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

调试过程中,我发现了一个比较严重的问题:如果点击“调试”按钮来启动程序,并且 CLion 运行配置中选择的启动模式是 reset init,单片机的系统时钟频率就会不正确(始终为 64MHz),并且抖动很大;然而,如果点击“运行”按钮来启动程序,又一切正常。这是为什么呢?

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

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

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

继续阅读“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 的电源(现在市面上大部分电脑电源都是这种电源),会导致供电不稳定、不开机等问题,强烈不建议购买!!

解决 Linux 下 Vivado 字体渲染异常、崩溃的问题

众所周知 Xilinx Vivado 在 Linux 下存在诸如字体渲染丑陋、不定期崩溃的问题,今天试了一下,可以替换自带的 JRE 为 Intellij IDEA 的 JRE,就可以解决多数问题。不过,如果直接替换 jre 目录,会出现找不到 com.sun.java.swing.plaf.windows.WindowsLookAndFeel的错误。经过一番折腾从原始 jdk 里面提取了这个类,将它补全到 classes 目录里面就可以了。

经过一段时间的测试暂时没发现什么问题,仿真、综合、下载功能都是正常运行的,如果有其他问题请在下面评论区补充。

给出替换使用的脚本,供大家参考:

$VIVADO_HOME=/mnt/largejunk/Xilinx/Vivado/2019.1
$JBR_HOME=/opt/intellij-idea-ultimate-edition/jbr/
cd $VIVADO_HOME/tps/lnx64
mv jre9.0.4 jre9.0.4-bak
ln -s $JBR_HOME jre9.0.4
cd $VIVADO_HOME/lib/classes
wget --content-disposition "https://seafile.t123yh.xyz:2/f/f260c2f5132541549e86/?dl=1"  # Add the WindowsLookAndFeel absent in Linux JREs.