news 2026/10/6 3:36:54

用Arduino IDE开发STM32 Nucleo:环境搭建、烧录与踩坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Arduino IDE开发STM32 Nucleo:环境搭建、烧录与踩坑指南

我的工作台上长期摆着两块板子,一块Arduino Uno,一块STM32 Nucleo。Uno烧代码三秒搞定,但一看参数就叹气——16MHz主频、2KB RAM,跑个稍微复杂的算法就捉襟见肘。Nucleo性能确实强,但每次想让它干点活,都得开Keil或者STM32CubeIDE,新建工程、配引脚、写HAL,等到编译通过,灵感基本已经凉透了。后来我找到一条路:让Arduino IDE直接支持STM32 Nucleo开发板。这篇文章就把整套流程从头到尾讲清楚,包括核心包怎么装、烧录怎么配、有哪些非踩不可的坑。如果你手里正好有Nucleo板但一直没动力去碰,这篇应该能让你在十分钟内跑起第一个程序。

1. 当一块Nucleo板遇到Arduino IDE:这事为什么值得做

1.1 普通玩家的真实痛点

先说说为什么这个需求这么常见。用Arduino Uno或者Pro Mini做小项目,最舒服的地方是生态环境:库多、资料多、串口监视器一开就能调试。但Uno的硬件上限摆在那里,ATmega328P毕竟是16MHz、2KB RAM,跑个传感器融合、显示个稍微复杂的波形,或者同时挂几个外设,很快就触到天花板。换到ESP32虽然性能好,但它不叫STM32,很多场合你要落地的是STM32平台。

Nucleo系列是ST官方的评估板,价格不贵,性能又实在,比如Nucleo-F401RE是Cortex-M4F 84MHz、512KB Flash、96KB RAM,浮点运算都能硬算。它和Arduino Uno算是一个阵营的开发板,都有标准排针、都能插面包板,但上手门槛差距巨大。Keil要注册激活、CubeIDE要学工程结构、HAL库函数名字又长又绕,对一个只想验证“板子能不能跑起来”的人来说,这个学习成本有点高。

而让Arduino IDE支持STM32之后,情况完全变了:你依然用那套熟悉的pinMode、digitalWrite、Serial.println,但底层跑的已经是ARM Cortex-M处理器。代码风格、库调用习惯、调试流程都不用换,这等于用Arduino的开发效率去玩STM32的硬件。对广大创客、学生、以及想快速做原型验证的工程师来说,这是一条非常实用的路径。

1.2 让IDE认识STM32的三条路线,我推荐哪条

目前想用Arduino生态开发STM32,主要有三条路,我按推荐程度排个序。

第一条是STM32duino官方核心,也就是现在由STMicroelectronics自己维护的“STM32 MCU based boards”支持包。直接在Arduino IDE开发板管理器里就能安装,安装之后所有Nucleo、Discovery、以及常见的第三方面板(比如Blue Pill)都能选。优点是维护活跃、文档更新快、和ST官方工具链配合得也好。这篇文章后面用到的就是这一条路线。

第二条是PlatformIO加STM32平台。PlatformIO本身是个跨平台嵌入式构建系统,对STM32的支持非常完整,还能配合VS Code使用。但它的学习曲线比Arduino IDE陡一点,要理解platformio.ini里的配置项,还要习惯它自己管理工具链。如果你以后打算长期混嵌入式,我建议学,但如果你今天就想把Nucleo点起来,先不用碰它。

第三条是自己写Makefile或者用CMake直接调用arm-none-eabi-gcc来编译,再通过ST-LINK命令手工烧录。这套流程对深入理解编译过程很有帮助,但对多数人来说是在浪费时间,我也就不展开了。

所以本文的核心就是:只改Arduino IDE的配置,不装额外软件,不写编译脚本,把Nucleo变成一块可以“抄起就写”的板子。

1.3 这套玩法的边界在哪里

说句公道话,Arduino IDE不是万能的。它把底层封装成了一个好用的“黑盒”,但代价是对芯片配置的控制力下降。HAL库里那些精细的时钟树配置、外设中断优先级、低功耗模式,在Arduino层面对新用户是不透明的。

我的经验是,这个方案最适合三类场景:一是做产品原型验证,先快速确认算法和传感器方案可行,再移植到正式工程;二是学生做课程设计和毕业设计,用Arduino语法能省掉大量翻阅芯片手册的时间;三是创客项目,尤其是已经积累了大量Arduino库代码的人,可以直接把老项目搬到Nucleo上,顺手获得更强性能。

但如果你要做量产固件,或者项目需要精细控制外设时序、定时器资源、低功耗策略,那还是老老实实用STM32CubeMX加HAL库起步吧,Arduino层在这里反而会绊脚。理解这个边界,就不会在错误的地方骂工具不好用。

2. 动手前的四个关键准备:板卡确认、驱动、IDE与烧录工具

2.1 先搞清楚你手里的Nucleo是哪一款

Nucleo这个家族长得都像,但细节差异会影响后面的选择。主流分三类:Nucleo-32(小板子)、Nucleo-64(最常见,和Uno差不多大的排针间距)、Nucleo-144(大板子,带更多外设)。绝大多数人拿到的都是Nucleo-64,比如Nucleo-F103RB、Nucleo-F401RE、Nucleo-L476RG。

选板子之前,把板子翻过来看芯片丝印,这一点很重要。有些Nucleo-64的型号后缀和芯片实际容量对不上,比如丝印写着F401RE但芯片可能是F401RC。虽然绝大多数情况下是一致的,但多看一眼能省掉后面“Flash报错”的麻烦。

还要确认板载ST-LINK调试器。Nucleo-64和Nucleo-144几乎都板载了ST-LINK/V2-1,也就是说一根USB线既能供电、又能烧录、又能虚拟串口通信,不用额外买下载器。Nucleo-32里有一部分不支持板载调试,需要外接ST-LINK,这种板子在开发板管理器里也会单独标注。确认好手里板子的型号,后面工具菜单里选型才不会懵。

2.2 Windows驱动:最容易出问题的一步

Nucleo板用USB线插到电脑后,会自动枚举出三个东西:一个ST-LINK调试口、一个虚拟串口(COM口)、还有一个大容量存储设备(姑且先不管)。在Windows上,如果设备管理器里能看到一个带黄色感叹号的设备,别急着怀疑板子坏了,多半是驱动没装好。

ST官方的ST-LINK驱动包叫STSW-LINK009,去ST官网搜索下载安装即可。装完再去设备管理器看,应该能看到“ST-Link”开头的设备,以及“STMicroelectronics Virtual COM Port”字样。虚拟串口那项尤其重要,后面用串口监视器调试全指望它。

macOS和Linux这边一般免驱,插上之后用ls /dev/cu.usbmodem*或者ls /dev/ttyACM*能看到对应设备。如果你用的是Arduino IDE 2.x,端口下拉列表里也会直接显示。

提示:先插上Nucleo,确认系统识别出设备,再继续后面的步骤。驱动都解决不了的话,后面烧录大概率也会报“No ST-LINK detected”。这个顺序不能跳。

2.3 选Arduino IDE哪个版本

我在两个版本上都跑通了,结论是:如果你从零开始装,直接装最新版Arduino IDE 2.x。2.x不仅对STM32核心包的兼容性更好,编译日志显示也更清楚,还带了自动补全和跳转定义这些实用功能。1.8.x也不是不能用,但开发板管理器搜索、安装、更新核心时的体验明显落后。

一个细节是,IDE版本会影响“开发板管理器”的加载速度,但STM32核心包本身对两个版本都兼容。也就是说,你手里的1.8.x旧环境如果已经装了一堆库和第三方核心,那继续用旧版本完全没问题。但如果是新环境,建议一步到位选2.x。

2.4 STM32CubeProgrammer:烧录环节的隐藏依赖

这是很多人忽略的一步。STM32duino核心在Nucleo上最稳的烧录方式是“STM32CubeProgrammer (SWD)”,它本质上是在后台调用ST官方的STM32CubeProgrammer命令行工具,往芯片里写固件。

如果电脑上没装这个工具,Arduino IDE会报错,提示找不到STM32_Programmer_CLI。所以提前下载安装STM32CubeProgrammer,安装完成后把它的bin目录加入系统PATH,或者记住安装路径。在Windows上默认路径类似C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin,macOS通常在/Applications/STM32CubeProgrammer/STM32CubeProgrammer.app/Contents/MacOs,Linux则在/opt/stm32cubeProgrammer/bin。

装完后打开命令行跑一句STM32_Programmer_CLI --version,能输出版本号就说明路径没问题。这一步前后十分钟的事,却能省掉后面排查烧录失败的大量时间。

3. 打通开发板管理器:添加JSON源并安装STM32核心包

3.1 把STM32芯片包地址写进附加开发板管理器URL

Arduino IDE默认只认识AVR系列的板子,要让开发板管理器认识STM32,需要手动添加一个“附加开发板管理器URL”。打开左上角“文件”菜单的“首选项”(2.x里叫“Preferences”),找到“附加开发板管理器网址”或者“Additional boards manager URLs”,在里面粘贴:

https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json

这个地址是STM32duino官方维护的核心包索引。如果你的首选项里已经填了其他URL(比如ESP8266、ESP32的),不要覆盖,用逗号分隔多个地址即可。

填完保存,去“工具-开发板-开发板管理器”(2.x是左侧面板的“Board Manager”图标)搜索“STM32”,就会看到一个叫“STM32 MCU based boards”的条目,发布者是STMicroelectronics。点击安装,选择最新稳定版本。这个过程会下载工具链和核心文件,体积比较大,第一次可能要等几分钟,耐心一点。

提示:如果开发板管理器一直显示搜索不到,先确认网络能正常访问GitHub。也可以直接把地址里的raw路径放到浏览器里打开,能下载到一个JSON文件就说明地址没问题。

3.2 安装细节与版本选择

安装的时候有个值得注意的地方:核心包会同时拉取arm-none-eabi-gcc交叉编译工具链,这部分在老版本的1.8.x上经常因为下载超时而中断。如果中途失败,别慌,把开发板管理器关掉再重新打开,点安装,它会断点续传或者重新下载。

装好后验证方法是:打开“工具-开发板”,往下拉能看到一个“STM32 MCU boards”分组,里面列出了STM32F0到STM32H7的几乎所有官方板子。看到这一项,就说明核心包已经成功加载了。

如果列表里找不到你的板子型号,看一眼是不是核心包版本太旧。ST一直在往这个包里塞新板卡,老版本对新板卡支持确实不到位。建议直接装最新版,或者去GitHub的STMicroelectronics/Arduino_Core_STM32仓库看Release说明。

3.3 工具菜单里那几个关键选项

选好“Nucleo-64”之后,工具菜单会多出一大堆配置项,第一次看到容易晕。但真正必须关心的只有这几个。

第一项“Board part number”,必须和板子芯片型号严格一致。比如你是Nucleo-F401RE,就选“Nucleo F401RE”,别选成“Nucleo F401RC”或者“F401RD”,Flash容量和RAM大小不同,代码稍大就会编译失败。

第二项“Upload method”,我建议直接选“STM32CubeProgrammer (SWD)”。Nucleo板载ST-LINK和芯片的SWD口在出厂时就连好了,选SWD就是走板载调试器写入,稳定、速度快,还能自动复位运行。不要选“Mass storage”,那个依赖ST-LINK的虚拟U盘模式,不是所有固件版本都默认开启,选了容易失败。

第三项“USB support”默认选“None”就行,除非你打算用USB CDC和电脑直接通信再改成“CDC generic”。第四项“U(S)ART support”保持默认即可,它决定Serial默认映射到哪组串口,后面调试时候再细说。

这些配置保存在boards.txt里,不同的核心版本选项名可能略有不同,但“Board part number”和“Upload method”这两个关键项是固定存在的。配置完之后就可以尝试编译第一个程序了。

4. 从LED开始:编写、编译、烧录全流程实战

4.1 先搞懂Nucleo上那颗用户LED的引脚

大部分Nucleo-64板的用户LED是一个绿色的LED,板子上的丝印标着“LD2”,原理图上它连在PA5引脚。在Arduino STM32核心中,PA5被定义成了LED_BUILTIN,所以你写pinMode(LED_BUILTIN, OUTPUT)的时候,控制的其实就是板上那颗绿色LED。

但我个人建议直接在代码里写PA5而不是LED_BUILTIN。原因后面章节会细说,先用标准写法把程序跑通。下面这个代码就是经典的LED闪烁:

void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(500); digitalWrite(LED_BUILTIN, LOW); delay(500); }

如果你的心情比较急,想一次看到更多动作,可以改成用PWM做一个呼吸灯,STM32的核心支持analogWrite,而且PWM分辨率默认比Uno高。但第一步先保持简单,LED能闪起来,说明编译、烧录、复位整个链路都是通的。

4.2 第一次编译会遇到的等待和日志

点击IDE左上角的“验证/编译”按钮,如果是第一次编译,底部日志区会先出现一大堆下载信息,那是核心包在初始化工具链。等真正开始编译,你会看到Compiling sketch...后面跟着一长串的源文件路径,其中包含大量core目录下的HAL底层层文件。

编译输出里有几个关键信息值得关注。一是末尾会给出Sketch占用Flash和RAM的数值,比如Sketch uses 12288 bytes (2.3% of program storage space),这行字能帮你判断选型是否正确。如果显示占用超过100%,那就说明Board part number选错了,芯片型号的Flash容量不对。

二是在日志里能看到arm-none-eabi-gcc交叉编译器的调用,这就证明核心包使用的是ARM工具链而非AVR工具链。编译出错时,日志会跳到带error:的行,多数情况下旁边会直接标明是语法错误还是配置错误,对照着改就行。

4.3 用SWD烧录并复位运行

编译通过后,点“上传”。日志区会出现一系列ST-LINK相关的输出,正常情况下大概是:先通过SWD连接芯片,然后擦除Flash,写入.elf或者.bin文件,最后复位目标芯片。看到类似Download verified successfully或者Reset字样时,黑色终端窗口会消失,板子上的LED马上就会开始闪烁。

此刻你的Nucleo就真正变成了一块“用Arduino开发的STM32板”。我经常把这一步作为整套环境是否配置成功的判定标准:如果LED没闪,那就先别急着往下写代码,回到上一章的工具菜单选项里检查板卡型号和上传方式。

4.4 顺手把串口调通

LED闪起来只是第一步,嵌入式调试最大利器是串口。Nucleo板载ST-LINK已经把虚拟串口接到了芯片的USART2上,对应引脚是PA2和PA3。在STM32duino核心中,USART2默认对应Serial2,所以你想往电脑上的串口监视器打印数据,代码应该这么写:

void setup() { Serial2.begin(115200); pinMode(LED_BUILTIN, OUTPUT); } void loop() { Serial2.println("Nucleo alive"); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); delay(1000); }

打开工具-串口监视器,选择刚才在设备管理器里看到的那个COM端口,波特率设为115200,你就能每隔一秒看到一行Nucleo alive。这里有个容易踩的坑:很多教程里直接写Serial.begin(115200),但默认的Serial在STM32免核心中对应的是USART1,引脚是PA9/PA10,和ST-LINK虚拟串口没接在一起,所以监视器里什么都不会出现。正确做法就是用Serial2,或者手动把代码改成Serial并开启USB CDC模式。后面第5节我详细讲这个坑。

5. 我踩过的那些坑:串口映射、烧录方式与引脚记法

5.1 上传时报“No ST-LINK detected”的完整排查链路

这个报错我见过太多次,而且绝大多数不是硬件坏了。我的排查顺序是:先换一根USB线。别笑,USB线是重灾区,很多便宜线只能充电不能传数据,插入后电脑能供电,但ST-LINK根本没被枚举出来。换了线之后重新插拔,看设备管理器里是否出现ST-LINK设备。

第二步查驱动。Windows更新后偶尔会把ST-LINK识别成未知设备,前面提到的STSW-LINK009直接覆盖安装一遍就好。

第三步查上传方式。如果你无意中选了“STM32CubeProgrammer (DFU)”或者“Serial”,而Nucleo并没有DFU bootloader,就必然报错。切回“STM32CubeProgrammer (SWD)”再试。

第四步查STM32CubeProgrammer的安装路径。如果Arduino日志里提示Unable to find STM32_Programmer_CLI,那是环境变量的问题,把bin目录手动加到PATH里,或者重新启动IDE。

最后才考虑硬件问题:检查Nucleo上的ST-LINK跳线帽是否被拔了,或者板载ST-LINK固件是否需要升级。排查到这一步的概率极小,但真到了,用STM32CubeProgrammer的固件升级功能刷一下即可。

5.2 “烧录成功但板子没反应”的三种可能

LED不闪,但烧录日志明明写成功,这个问题比较隐蔽。我遇到过的原因有三种。

第一种是Board part number选错了。比如你的板子是F401RE,你在工具菜单里选了“Nucleo F401RC”,编译时Flash和RAM大小用了RC的参数,烧录虽然能进去,但地址空间已经错位,程序跑起来自然不对。回去核对芯片丝印,改成正确的型号重新编译上传。

第二种是上传方法选错,比如选了USB CDC模式,但程序里又没有USB初始化代码,导致系统一启动就卡在USB枚举上。如果你用不到USB的话,把“USB support”改回“None”再试。

第三种是代码逻辑问题。最典型的就是把LED_BUILTIN理解成了“板上所有LED总开关”。实际上Nucleo板上有三颗LED,其中LD1和LD3是ST-LINK控制或电源指示灯,只有当这几颗LED一起亮的时候才看起来像死机。你真正该盯的是那颗绿色LD2,而且确认它的引脚是PA5。把代码改成直接操作PA5,更直观也更好查。

5.3 引脚记法:D0不是D0,A0也不是A0

这是STM32核心和AVR核心最大的区别。在Arduino Uno上,D0到D13、A0到A5是硬件固化的,所有人都知道。但在STM32上,数字引脚的“D几”、模拟引脚的“A几”是由核心包里的variant文件定义的,不同板卡甚至不同核心版本,映射都可能不一样。

比如在某个Nucleo板的variant里,D0可能对应PB7,D1可能是PB6,A0可能是PC0,看起来没什么规律。如果你按照Uno的习惯用digitalWrite(D4, HIGH),结果往往不是你预期的那根排针。

我现在的习惯是:在STM32上写代码,直接使用PA0、PB1、PC13这样的物理引脚名。STM32核心是接受这种写法的,pinMode(PA5, OUTPUT)和pinMode(LED_BUILTIN, OUTPUT)效果完全相同。这么做的好处是,不管你以后换到哪个Nucleo,还是换到Blue Pill,代码的引脚含义都不会变。唯一的代价是写代码时得翻一下原理图确认引脚号,但这点成本远比调试莫名其妙的引脚映射省时间。

5.4 SoftwareSerial在STM32上的惨痛教训

Arduino生态有几个著名软件串口库,SoftwareSerial是其中之一。在AVR上虽然效率低,但还能用。到STM32上,如果你继续用SoftwareSerial去接一个GPS模块或者ESP8266,高波特率下大概率是满屏乱码。

原因很简单:STM32的时钟频率高,但Arduino软件串口库本质是靠定时中断和IO翻转模拟时序,在Cortex-M4上反而比AVR更容易出错,因为库的实现没有针对STM32做充分优化。我的经验是:能上硬件串口就上硬件串口,STM32最不缺的就是UART。Nucleo-F401RE有USART1、USART2、USART6三组硬件串口,完全够用。

如果你确实需要更多串口,先从核心内置的Serial1、Serial2、Serial6里挑,各自的引脚可以通过查STM32的数据手册拿到。真要万不得已用软串口,把波特率降到9600,并且在初始化之后加一段延时,成功率会高一点,但依然不推荐。这就是为什么我前面说调试串口一定要用Serial2而不是Serial,硬件连接决定一切,软件只能顺着硬件走。

6. 把STM32的水平发挥出来:时钟、ADC、PWM与库选型

6.1 用Arduino代码触摸STM32硬件能力

LED和串口只是热身。STM32核心把很多高性能外设也暴露给了Arduino API,有些甚至比Uno好用得多。

比如ADC:Uno的analogRead是10位分辨率,STM32核心默认是12位,还能通过analogReadResolution(12)设置。Nucleo-F401RE上有多个ADC通道,采样速度快得多。再比如PWM:Uno的analogWrite频率大约是490Hz,STM32可以通过analogWriteFrequency()调整PWM频率,想驱动舵机、蜂鸣器、调光灯都能找到合适的频率。

下面这段代码做个简单验证,用PA5输出的PWM做呼吸灯,同时把PA0引脚的模拟电压读回来:

void setup() { analogWriteResolution(12); Serial2.begin(115200); pinMode(PA5, OUTPUT); // LED pinMode(PA0, INPUT); // 模拟输入 } void loop() { for (int i = 0; i < 4096; i += 16) { analogWrite(PA5, i); delay(5); } for (int i = 4095; i >= 0; i -= 16) { analogWrite(PA5, i); delay(5); } Serial2.println(analogRead(PA0)); delay(100); }

这段代码在F401RE上跑起来,呼吸灯的变化明显比Uno细腻,因为PWM分辨率提升到了12位。PA0接一个可调电阻到3.3V,串口就能实时打印0到4095的数值。注意STM32的ADC输入范围是0到3.3V,别直接喂5V,芯片不吃这一套。

6.2 真实性能对比: Uno、Nucleo-F401RE与Nucleo-H743ZI

很多时候你觉得一个需求“Arduino做不到”,其实是“Uno这颗芯片做不到”。我把常用的几块板子放一起对比,看完你就明白为什么在STM32上用Arduino很值得:

指标Arduino UnoNucleo-F401RENucleo-H743ZI
主控核心ATmega328PSTM32F401RET6STM32H743ZIT6
架构AVR 8位Cortex-M4FCortex-M7
主频16 MHz84 MHz480 MHz
Flash32 KB512 KB2 MB
RAM2 KB96 KB1 MB
ADC分辨率10位12位16位
硬件串口1个3个以上8个以上
浮点运算软件模拟硬件FPU双精度FPU
典型价格约20元约70元约150元

看到差异就知道,Nucleo-F401RE跑同样的Arduino代码,性能和内存余量完全不是一个量级。我甚至试过在F401RE上用Arduino库跑了一个简单的PID温控和一个7寸屏幕的GUI,只要选对库,稳定性和响应速度都远好于Uno。对很多人来说,Uno的瓶颈不是Arduino这个开发环境,而是AVR这颗芯片本身。

6.3 库选型与正式项目的分界线

Arduino生态的成熟库在STM32上大部分能用,但有几个值得关注的地方。

FastLED在STM32上表现很好,我做过一组WS2812灯带驱动,用F401RE跑得很稳,刷新率比Uno高好几倍。U8g2和Adafruit GFX系列图形库也支持STM32,配合SPI或I2C显示屏非常顺手,但一定要确认对应的SPI引脚映射,手动设置好SPI.begin()的引脚。LiquidCrystal这类并口字符屏库问题也不大,只是接线多,不如I2C屏方便。

需要警惕的是那些深度依赖AVR寄存器的库,比如某些舵机库、红外遥控库、PWM调声库,它们可能假设了AVR的定时器结构,在STM32上要么编译不过,要么行为怪异。遇到这种库,先看作者有没有在README里标注“AVR-only”,没有的话就当作踩坑处理。

至于什么时候从Arduino切到STM32CubeIDE加HAL,我的判断标准是:一旦项目开始出现以下信号,就该切了。一是需要FreeRTOS做多任务实时调度,Arduino层虽然也能跑,但配置和控制粒度不够;二是需要CubeMX做引脚冲突检测和时钟树规划,外设一多,手写初始化容易漏;三是需要精细控制低功耗模式,比如待机电流、唤醒源选择。这时候Arduino快速原型的作用已经完成,正式工程必须落在更接近硬件的工具链上。两者不是对立关系,而是接力关系。

写在最后的一点私人体会

前前后后用这套流程点亮了七八块Nucleo板,从F103、F401到L476、H743都走了一遍。我最大的感触是,很多人对STM32的恐惧其实来自工具链,而不是芯片本身。Arduino IDE把这条门槛削掉之后,STM32就是一块性能充沛的大号开发板,你先写出能跑的东西,再去理解底层细节,这个学习路径比一上来就啃HAL库舒服得多。

另外分享一个小习惯:我拿到一块新Nucleo板的第一件事,不是写复杂的业务逻辑,而是先跑一遍LED闪烁加Serial2串口输出,确认环境、烧录、时钟、复位、串口全部正常。这个“最小可运行系统”省了我后面大量排查时间。如果这篇文章能帮你把这块板子跑起来,那我写这些字也就值了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 3:33:20

室内定位传感器方案全解析:从UWB到地磁的11种选型指南

干室内定位这些年&#xff0c;有个问题几乎每次都会被问到&#xff1a;“GPS不是挺准的吗&#xff0c;为啥屋里还非得再来一套&#xff1f;”只要让机器人在客厅和厨房之间来一次自主导航&#xff0c;或者在商场里用手机找一家店&#xff0c;你马上就会明白——室内定位压根不是…

作者头像 李华
网站建设 2026/10/6 3:31:49

惯性质量与引力质量等价性的本源几何证明

传说是这样开始的&#xff1a;伽利略站在比萨斜塔上&#xff0c;同时松开一个大铁球和一个小木球&#xff0c;让它们一起落地。考证历史的人多半会告诉你&#xff0c;这故事是后人编的&#xff0c;但问题本身是真实的——两个质量悬殊的物体&#xff0c;在重力作用下为什么下落…

作者头像 李华
网站建设 2026/10/6 3:31:49

IDEA中GitLab登录弹框反复出现?PAT与SSH配置全解

如果你最近在IDEA里拉取GitLab代码时&#xff0c;右上角一直弹出“Add GitLab Account”的登录框&#xff0c;关掉没两分钟又出现&#xff0c;甚至每次执行git pull/push都要先跟它斗争一番&#xff0c;那这篇笔记是专门为你准备的。这个问题我上个月刚在公司电脑上踩过&#x…

作者头像 李华
网站建设 2026/10/6 3:30:03

电力智能巡检机器人:闭环决策系统与多模态感知工程实践

简介&#xff1a;本资源是一份面向电力行业运维工程师、智能装备研发人员及高校自动化/电气专业师生的技术型PPT课件&#xff0c;系统讲解室外与室内智能巡检机器人在输电、变电、配电及地下管廊隧道等场景的落地应用。内容覆盖巡检痛点分析、功能架构&#xff08;如红外测温、…

作者头像 李华
网站建设 2026/10/6 3:27:58

麒麟V10等保密码策略配置:从PAM到登录锁定完整指南

1. 等保测评到底查什么&#xff1a;先弄清密码策略的“及格线”干过等保测评这档子事的人都知道&#xff0c;密码策略是每次检查里的“铁打的考点”。测评师打开服务器第一件事&#xff0c;就是看密码策略配了没有、配得够不够&#xff0c;三项硬指标跑不掉&#xff1a;密码长度…

作者头像 李华