tinygo-org / tinygo

Go compiler for small places. Microcontrollers, WebAssembly (WASM/WASI), and command-line tools. Based on LLVM.
https://tinygo.org
Other
15.33k stars 905 forks source link

feature: add support for esp32c3 supermini board #4212

Open vaaski opened 6 months ago

vaaski commented 6 months ago

Hey, I recently got into Go and loved the idea of using it for microcontrollers in a new project. I have a bunch of ESP32-C3 superminis but I can't get tinygo to build for them. I'm on a MacBook Pro M3 Pro on Sonoma with Tinygo and Esptool installed via Homebrew. I've tried following the blinking LED example adjusted to work with the esp32c3

main.go ```go package main import ( "machine" "time" ) func main() { led := machine.GPIO8 led.Configure(machine.PinConfig{Mode: machine.PinOutput}) for { led.Low() time.Sleep(time.Millisecond * 500) led.High() time.Sleep(time.Millisecond * 500) } } ```

But building fails with the following output:

❯ tinygo build -target=esp32c3
# machine
/opt/homebrew/Cellar/tinygo/0.31.2/src/machine/machine_esp32c3_i2c.go:38:16: undefined: SCL_PIN
/opt/homebrew/Cellar/tinygo/0.31.2/src/machine/machine_esp32c3_i2c.go:41:16: undefined: SDA_PIN

I guess it's something with the i2c implementation, but I'm not familiar enough with Go or this project to pinpoint the exact issue yet. Since building with -target=esp32 works fine, I've tried flashing with that but it won't work either.

❯ tinygo flash -target=esp32  
esptool.py v4.7.0
Serial port /dev/cu.usbmodem1101
Connecting...

A fatal error occurred: This chip is ESP32-C3 not ESP32. Wrong --chip argument?
error: failed to flash /var/folders/93/m682qq_n5klc2btq3q_cb_0c0000gq/T/tinygo1642084370/main.bin: exit status 2

Thanks a lot for making all this in the first place, I can't wait to use Go for microcontrollers!

vaaski commented 6 months ago

As a workaround, commenting out these lines makes it work as expected. My LED is blinking.

https://github.com/tinygo-org/tinygo/blob/6384ecace093df2d0b93915886954abfc4ecfe01/src/machine/machine_esp32c3_i2c.go#L37-L42

deadprogram commented 6 months ago

@vaaski the issue here is that you need to use a target with an actual board file in order to have the correct mapping. An example is the Seeed XIAO ESP32C3 board.

For example, see target https://github.com/tinygo-org/tinygo/blob/release/targets/xiao-esp32c3.json with board file https://github.com/tinygo-org/tinygo/blob/release/src/machine/board_xiao-esp32c3.go

Note that the target "inherits" from the target esp32c3. That target is really meant to be used in this way, not as a target of its own.

Hope that helps!

deadprogram commented 5 months ago

@vaaski if you wanted to create a PR that added the board definitions for the esp32c3 supermini we'd be happy to accept it. :smile:

See https://forum.arduino.cc/t/esp32-c3-supermini-pinout/1189850/6 for the pin definitions.

See https://github.com/tinygo-org/tinygo/wiki/Adding-a-new-board#adding-a-new-board for instructions on how to go about doing this.