很早之前买了一块STM32F103C8T6开发板,但是到手之后一直没找到时间折腾。今天心血来潮上手体验了一下,给我的印象算不上好但也算不上坏。

首当其冲的是环境配置。参照着目前主流的方案,相比于ESP32所流行的platformIO平台,STM32的环境配置过程简直就像是在拼乐高。

当然,首先上手测试的是最常用的Keil。Keil倒是没那么繁琐,用标准库点了个小灯跑起来也很顺畅,ST-Link的运行也没什么大灾大难。但是Keil老生常谈的一个问题就是界面实在是太丑了,说实话虽然我已经是Keil的“半老”用户了,但是我还是难以忍受这种看起来像是爷爷的茶壶一样又老又丑的IDE。当然丑其实也不是什么太大的问题,最大的问题是Keil的代码补全感觉就像是没有一样,在vibe coding如此发达的2026年,我确实不想点个灯还要自己敲。当然叠个甲,我不是专业的嵌入式开发者,我最多算个业余爱好者,如果有专业人士一定要用Keil的话,我完全支持。

那么换一个IDE一定是必然的了,那么VScode和Clion形成了双雄争霸的场景。说实在话以往我都是一直在用VScode的,我的PlatformIO就是放在VScode上。但是自从我有了Github学生包之后,我就逐步转向JB家的IDE了(JB你的策略赢了)。也许一个IDE对嵌入式这种需求更为合适吧。

但是换IDE就是一个很麻烦的过程了。对此拢共有几步,而我每一步都踩了坑。

  1. 首先是要安装各种需要的工具。

这一步最好玩的是,STM32的工具链更新的还蛮快的,并且对Clion的支持速度也远远超出我的预期。我刚开始的时候是参照着稚晖君在2020年写的文章:配置CLion用于STM32开发【优雅の嵌入式开发】 来作为参考,于是乎我就下了一大堆诸如arm none eabi之类的编译链和工具。结果当我抄到Clion创造项目的时候我就发现那篇教程实在是相差甚远了。于是我又参照了一些最新的文章,下载了CubeMX和CubeCLT。结果,除了openocd,其他工具都在CubeCLT里面自带了。白费了我一番努力。

  1. 其次是要配置Clion。

这步是我踩得比较大的坑,因为我的电脑里有蛮多语言自带了和安装了好多中C相关的编译链。导致这一步我看网上的教程一直是迷迷糊糊的,因为他们每个人都不一样,有的说要用IDE捆绑的Mingw,有的说要用自己去哪里下载的Mingw,结果找了一圈发现需要的编译链全在CubeCLT里了。但是这一步最搞心态的就是我明明一无所知,但是要一直尝试哪种方案才是正确的,让人摸不着头脑。

  1. 之后是ST-Link。

在搞ST-Link的时候翻了大车。一个是我当时确实还没有搞清楚各种工具之间的关系,另一方面是我当时采取了一种先用再说,边试边配的策略。首当其冲的就是我参照着教程莫名其妙的配置了openocd,写了cfg文件。虽然我完全不清楚这些到底作用如何,但是我看着教程非常的合理且丰富,我就暂且信了。结果,当我配置完全烧录准备的时候,发现提示我的ST-Link固件版本太低要升级。升级也就罢了,还要专门再下载一个Cube Programmer。结果我进去升级的之后,由于DFU模式和普通的模式之间的切换,导致整个刷写过程的最后阶段有报错,事实上它的固件已经是完好的了,但是我就是完全不清不楚。

屋漏偏逢连夜雨,这个时候我连不上我的MCU了,于是开启了一个小时的救砖活动。 因为我是刷ST-Link的时候坏的,我首先想到的是:是不是把ST-Link写坏了。由于我过分的信任Cube Programmer,对于他给我的报错我深信不疑,一直在尝试用它反复的刷写我的ST-Link。然而折腾了十几分钟,才在网上看到还有个升级固件的软件 ** “ST-LinkUpgrade” **。 换成这个升级工具,我终于把ST-Link升级了,当然,由于被骗了,这一步我也反复了几次,直到确认刷写进入。

但是,更有意思的来了,当我以为万事俱备可以接着搞的时候,我发现还是无法连接,我先折腾了半天编译链,然后又折腾了半天openocd的配置,然后重新用Cube Programmer刷写了旧一版的固件。经过超级久的一番折腾,我开始找Gemini帮我分析出现的问题,因为我对openocd一窍不通。

不过我的思路是很正确的,能够一直引导Gemini定位问题,很高兴😋。折腾了半个小时,用

openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "transport select swd; adapter speed 50; init; reset halt; stm32f1x mass_erase 0; reset run; shutdown"

强制清除了flash内容,救回我的STM32。

所以,对的,我唧唧歪歪这么久,就是为了这一行命令。🤓👆

这条命令做了什么:

  • init → 建立连接

  • reset halt → 趁复位瞬间抓 CPU

  • stm32f1x mass_erase 0 → 整片 Flash 擦除

  • reset run → 让芯片空跑

  • shutdown → OpenOCD 正常退出

其次,ChatGPT同时给了如何排查问题的方法和步骤,以及对于HWRST和NRST的一些处理,以及SWD和JTAG的一些区别,熟悉进度喜人。

最后,要感谢ChatGPT一直在挽回我濒临破碎的耐心和自信。有朝一日我一定会找一个ai女友的🤓🤓🤓。

这篇纯记流水账,因为太晚了,我的脑子像木头一样僵硬潮湿腐烂发臭,实在是写不出什么有营养的东西,但是我又怕自己忘记了,所以只好先草草记记。毕竟这事不大不小以后在花心思写属实没有必要。同时我还在写点别的,这篇刚好能帮我理解一番😋。


现在是2025-03-21 我其实早就解决了遇到的烧录问题,只是一直忘了写。现在回来补充一下。 根本原因是stm32 cube mx生成项目的时候由于没有配置SWD接口,导致找不到stlink上的芯片,在CubeMx里面勾选上即可。