TinyGo 不是普通 Go 包,不能用 go install 安装,必须通过官方二进制包或包管理器(如 brew/apt)安装,并确保 LLVM 已就绪;构建需指定正确 target,外设须显式配置,烧录前须确认板子处于编程模式。

安装 TinyGo 时为什么 go install 失败?
TinyGo 不是普通 Go 包,不能用 go install 安装。它是个独立编译器,依赖 LLVM 和特定版本的 Go 工具链。常见错误是执行 go install github.com/tinygo-org/tinygo@latest,结果报 no Go files in 或构建失败。
- 必须从官方二进制发布页下载对应系统的预编译包(macOS ARM64、Linux x86_64 等),或用包管理器安装
- macOS 用户推荐
brew install tinygo-org/tinygo/tinygo;Ubuntu/Debian 用户用 sudo apt-get install tinygo(注意仓库源是否启用)
- 安装后验证:
tinygo version 应输出版本号,且 which tinygo 要有路径
- 如果
tinygo build 报 llvm-config: command not found,说明 LLVM 缺失:macOS 需 brew install llvm,Linux 需 sudo apt-get install llvm-dev libclang-dev
tinygo build -target 选错会导致烧录失败
目标设备型号决定编译输出格式和链接脚本,选错 target 不仅无法运行,还可能让 openocd 或 esptool 拒绝烧录。
- 常见 target 示例:
arduino(Uno/Nano)、feather-m0(ATSAMD21)、esp32、raspberry-pi-pico
- 查看支持列表用
tinygo targets,不要凭经验猜缩写(比如 pico 是错的,正确是 raspberry-pi-pico)
- ESP32 系列要区分芯片型号:
esp32(默认 S2)、esp32c3、esp32s3,参数不同,flash 模式和分区表也不同
- 构建命令必须带
-target,例如:tinygo build -target=feather-m0 -o firmware.uf2 main.go
main.go 里调用 machine.UART 却没反应?
TinyGo 的外设初始化不是自动完成的,UART、I2C、SPI 都需要显式配置引脚和波特率,且不同芯片默认引脚不同。
- 必须先调用
uart.Configure(),否则 uart.Write() 会卡住或返回 0
- 引脚映射由
machine 包按 target 决定,比如 feather-m0 的 UART 默认用 machine.SERIAL_RX_PIN 和 machine.SERIAL_TX_PIN,但 arduino target 可能根本不支持硬件 UART
- 示例片段:
uart := machine.UART0
uart.Configure(machine.UARTConfig{BaudRate: 115200})
uart.Write([]byte("hello\n"))
- 注意:有些板子(如 Pico)默认没有连接 USB CDC UART,需用
machine.Serial 替代 machine.UART0 才能在串口监视器看到输出
烧录后设备不运行,tinygo flash 却显示成功?tinygo flash 只负责把固件写入 Flash,不校验运行状态。常见静默失败点在启动流程或中断向量表偏移。
-
tinygo flash 实际调用的是底层工具(openocd、esptool、uf2conv),若板子未进入 DFU 模式或 USB 描述符异常,它可能误判为“成功”
- 烧录前确认板子处于可编程状态:Arduino 类需手动按复位键进 bootloader;Pico 要按住 BOOTSEL 键再插 USB
- 若用
tinygo flash -target=esp32,确保串口设备路径正确(/dev/tty.usbserial-XXXX 或 /dev/ttyUSB0),否则 esptool 会写到空设备并返回 success
- 最小验证法:先烧录官方 blink 示例,确认硬件链路正常,再替换自己的逻辑
brew install tinygo-org/tinygo/tinygo;Ubuntu/Debian 用户用 sudo apt-get install tinygo(注意仓库源是否启用) tinygo version 应输出版本号,且 which tinygo 要有路径 tinygo build 报 llvm-config: command not found,说明 LLVM 缺失:macOS 需 brew install llvm,Linux 需 sudo apt-get install llvm-dev libclang-dev
tinygo build -target 选错会导致烧录失败
目标设备型号决定编译输出格式和链接脚本,选错 target 不仅无法运行,还可能让 openocd 或 esptool 拒绝烧录。
- 常见 target 示例:
arduino(Uno/Nano)、feather-m0(ATSAMD21)、esp32、raspberry-pi-pico - 查看支持列表用
tinygo targets,不要凭经验猜缩写(比如pico是错的,正确是raspberry-pi-pico) - ESP32 系列要区分芯片型号:
esp32(默认 S2)、esp32c3、esp32s3,参数不同,flash 模式和分区表也不同 - 构建命令必须带
-target,例如:tinygo build -target=feather-m0 -o firmware.uf2 main.go
main.go 里调用 machine.UART 却没反应?
TinyGo 的外设初始化不是自动完成的,UART、I2C、SPI 都需要显式配置引脚和波特率,且不同芯片默认引脚不同。
- 必须先调用
uart.Configure(),否则 uart.Write() 会卡住或返回 0
- 引脚映射由
machine 包按 target 决定,比如 feather-m0 的 UART 默认用 machine.SERIAL_RX_PIN 和 machine.SERIAL_TX_PIN,但 arduino target 可能根本不支持硬件 UART
- 示例片段:
uart := machine.UART0
uart.Configure(machine.UARTConfig{BaudRate: 115200})
uart.Write([]byte("hello\n"))
- 注意:有些板子(如 Pico)默认没有连接 USB CDC UART,需用
machine.Serial 替代 machine.UART0 才能在串口监视器看到输出
烧录后设备不运行,tinygo flash 却显示成功?tinygo flash 只负责把固件写入 Flash,不校验运行状态。常见静默失败点在启动流程或中断向量表偏移。
-
tinygo flash 实际调用的是底层工具(openocd、esptool、uf2conv),若板子未进入 DFU 模式或 USB 描述符异常,它可能误判为“成功”
- 烧录前确认板子处于可编程状态:Arduino 类需手动按复位键进 bootloader;Pico 要按住 BOOTSEL 键再插 USB
- 若用
tinygo flash -target=esp32,确保串口设备路径正确(/dev/tty.usbserial-XXXX 或 /dev/ttyUSB0),否则 esptool 会写到空设备并返回 success
- 最小验证法:先烧录官方 blink 示例,确认硬件链路正常,再替换自己的逻辑
uart.Configure(),否则 uart.Write() 会卡住或返回 0 machine 包按 target 决定,比如 feather-m0 的 UART 默认用 machine.SERIAL_RX_PIN 和 machine.SERIAL_TX_PIN,但 arduino target 可能根本不支持硬件 UART uart := machine.UART0
uart.Configure(machine.UARTConfig{BaudRate: 115200})
uart.Write([]byte("hello\n"))machine.Serial 替代 machine.UART0 才能在串口监视器看到输出tinygo flash 却显示成功?tinygo flash 只负责把固件写入 Flash,不校验运行状态。常见静默失败点在启动流程或中断向量表偏移。
-
tinygo flash实际调用的是底层工具(openocd、esptool、uf2conv),若板子未进入 DFU 模式或 USB 描述符异常,它可能误判为“成功” - 烧录前确认板子处于可编程状态:Arduino 类需手动按复位键进 bootloader;Pico 要按住 BOOTSEL 键再插 USB
- 若用
tinygo flash -target=esp32,确保串口设备路径正确(/dev/tty.usbserial-XXXX或/dev/ttyUSB0),否则 esptool 会写到空设备并返回 success - 最小验证法:先烧录官方 blink 示例,确认硬件链路正常,再替换自己的逻辑
TinyGo 的 target 和 machine 包耦合极深,同一段代码换块板子就得改 -target、引脚名、甚至外设变量名,这点比 Arduino IDE 更容易漏掉。别信“一次编写到处运行”,得一块一块对。










