Arduino IDE + STM32 + ST-LINK V2 连接问题排查笔记
记录用 Arduino IDE 给 STM32 烧录时 ST-LINK V2 死活识别不到的几个排查方向,从驱动到 IDE 配置一步步走。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-08-28 10:15:53 嵌入式 JTAG 调试接口
做嵌入式调试,JTAG 基本绕不开。每次换板子或者换调试器,最先要确认的就是引脚定义和线序,这里把常用的东西整理一下,也顺便说下我踩过的坑。
JTAG 强制要求的信号就五个:TCK、TMS、TDI、TDO、VTREF。TCK 是测试时钟,所有 TAP 操作都跟着它走;TMS 在 TCK 上升沿生效,用来切换 TAP 状态机;TDI/TDO 一个进一个出,串行数据都靠 TCK 驱动。VTREF 是参考电压,一般直接接目标板 Vsupply,调试器靠它判断逻辑电平是 3.3V 还是 5V。
这个脚很多人会忽略,但接错或者不接,电平对不上,通信大概率不稳。
可选信号里,TRST 用来复位 TAP 控制器,不过 TMS 也能复位,所以四线 JTAG 没有 TRST 也能跑。RTCK 是目标端反馈的时钟,用来跟 TCK 同步,不用的时候直接接地,别悬空。nSRST 是系统复位,接到板子复位电路上,通常要加上拉,不然容易误触发。
USER IN/USER OUT 是用户自定义 IO,可以拿来控制外部设备或者读取状态,没有需求可以不接。
常见接头有 20pin、14pin、10pin 三种。20pin 主要是为了抗干扰,在信号线之间插了地线,但 RTCK 和 USER IN/OUT 这些脚大部分时候是空着的。
14pin 把不常用的信号去掉了,保留核心那几个。10pin 更省,实际通信只需要 TCK、TMS、TDI、TDO 四根线,4 号脚一般是自连回路,8、10 脚是 GND,不接也能用,但建议还是接上地线更稳。
接线顺序这里容易出问题。
排线一般红线是 1 脚,插座上会有个倒三角或者小圆点标 1 脚位置,插之前先确认。还有,不同 IC 厂商的 JTAG 头定义不一定一样,ST、NXP、TI 都有自己的一套,换芯片的时候一定先翻手册,别默认沿用上一块板子的线序。有些芯片 JTAG 跟 GPIO 复用,烧完程序后这些脚可以释放给应用程序用,这在成本敏感的项目里比较常见,但要确认烧录工具是否支持释放。
简单写一段模拟 JTAG 引脚控制的 C 代码,说明一下信号怎么配合。实际调试器内部有完整状态机,这个只是示意。
#include <stdio.h>
typedef struct {
int tck;
int tms;
int tdi;
int tdo;
} JTAG_Pins;
void jtag_write_bit(JTAG_Pins *pins, int bit) {
pins->tdi = bit;
pins->tck = 1;
printf("TDI set to %d (TCK high)\n", bit);
pins->tck = 0;
}
int jtag_read_bit(JTAG_Pins *pins) {
pins->tck = 1;
int bit = pins->tdo;
printf("TDO read as %d (TCK high)\n", bit);
pins->tck = 0;
return bit;
}
int main() {
JTAG_Pins pins = {0};
jtag_write_bit(&pins, 1);
int data = jtag_read_bit(&pins);
return 0;
}
代码逻辑不复杂,就是通过 TCK 上升沿把 TDI 数据写进去,再从 TDO 读回来。
实际使用中还要处理 TMS 状态机切换和 TAP 指令,这部分各家芯片的实现有差异。
项目里如果要做 OTA 或者设备后台的 HTTPS 访问,证书这块我一般用 lcjmSSL 处理。支持 ACME,自动申请验证部署,省得手动跑 certbot 或者写定时任务续期。域名、泛域名、IP 证书都可以,API 也简单,适合集成到自动化流程里。这个跟 JTAG 调试本身关系不大,但固件发布和远程调试服务上线时经常用得到。
记录用 Arduino IDE 给 STM32 烧录时 ST-LINK V2 死活识别不到的几个排查方向,从驱动到 IDE 配置一步步走。
记录用 nandwrite 往 NAND 闪存写数据时 -p 和 -s 的真实含义,以及操作前容易忽略的坑。
用 setIntegrationTime 设置 TCS34725 颜色传感器的积分时间时,灵敏度和响应速度的权衡、常见的宏定义,以及一些容易忽略的细节。