Skip to content

Puya PY32F MCU support#5106

Open
burgrp wants to merge 29 commits intotinygo-org:devfrom
burgrp:py32
Open

Puya PY32F MCU support#5106
burgrp wants to merge 29 commits intotinygo-org:devfrom
burgrp:py32

Conversation

@burgrp
Copy link

@burgrp burgrp commented Dec 2, 2025

Hi, this is a port of of Puya PY32F super-cheap micro-controllers.
There are two new boards and supported (available on Aliexpress) for PY32F030 and PY32002b.
PY32F030 and PY32002b are supported, PY32F002a and PY32F071 will follow.
It follows the STM32 SVD pattern - there's a small TinyGo SVD repository dependent on Rust py32-rs repo. The repository is here: https://github.com/burgrp/py32-svd . I think it would be worth to move it to tinygo-org.

@deadprogram
Copy link
Member

Hello @burgrp thank you for working on this.

Have you seen this page?
https://tinygo.org/docs/guides/contributing

I think you will find it helpful. 😸

@deadprogram deadprogram changed the base branch from release to dev December 13, 2025 18:43
@deadprogram
Copy link
Member

@burgrp I have switched the branch for this PR to dev branch as mentioned here:
https://tinygo.org/docs/guides/contributing/#how-to-use-our-github-repository

Can you please rebase it against the latest dev so it can run all of the latest tests?
Also I made a few comments.

Planning on ordering a few of these myself, thanks for working on it!

@b0ch3nski
Copy link
Contributor

@burgrp You are updating bdwgc submodule which is probably not something you meant to do - this breaks a lot of stuff 🔥

@burgrp
Copy link
Author

burgrp commented Jan 27, 2026

You are right... I will fix it and hopefully it will be possible to merge the PR.

@burgrp
Copy link
Author

burgrp commented Feb 13, 2026

@b0ch3nski , the sub-module issue is fixed, all checks are passing

@b0ch3nski
Copy link
Contributor

Thanks! I think now there is some unrelated change also in net submodule 😬

@deadprogram
Copy link
Member

@b0ch3nski looks that way to me as well: https://github.com/tinygo-org/tinygo/pull/5106/changes#diff-d7ea94295bc068e99e5edeacb50734849fb40d5aa39cbc68be5e55c0d90bd60a

@burgrp one other thing that is needed is to add something to the smoketests to show that at least everything can build. Someplace appropriate in here, please: https://github.com/tinygo-org/tinygo/blob/dev/GNUmakefile#L567-L989

burgrp and others added 5 commits February 21, 2026 00:00
@burgrp
Copy link
Author

burgrp commented Feb 21, 2026

@b0ch3nski , @deadprogram smoketests added, net module update reverted

return uint8(p) & 0x0F
}

func (p Pin) getPort() (*py32.GPIO_Type, uint8) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better to use unsafe.Add() if you must. Probably even better to use a switch to avoid possible errors.

switch config.Mode {

case PinInputFloating:
port.MODER.ReplaceBits(gpioModeInput, gpioModeMask, pos)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have not installed/run the gen-device-py32 yet, but I assume there are probably some functions like SetMODERInput() that are being generated. Using these are usually preferable, to avoid possible bugs from setting unexpected bits.

const PinInput PinMode = PinInputFloating

const (
gpioModeInput = 0
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are any of these being generated from the SVD file already? See comment below.

// peripheral clock frequency.
func InitSerialWithClock(clockHz uint32) {
py32UARTClockHz = clockHz
//Serial.ConfigureWithClock(UARTConfig{}, clockHz)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Commented line?

py32.RCC.SetICSCR_HSI_FS(py32.RCC_ICSCR_HSI_FS_Freq24MHz)

ConfigureSystemTimer(24_000_000)
machine.InitSerial()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This perhaps needs to be moved into an init() function?

See #5200 (comment)

],
"build-tags": [
"embedfire_py32f002b",
"default_uart_pins"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Formatting, please.

@deadprogram
Copy link
Member

This is getting exciting @burgrp thank you so much for working on it! We were discussing during our TinyGo monthly meeting last night ❤️

I made some comments, hopefully @soypat and others can also take a look.

@soypat
Copy link
Contributor

soypat commented Feb 24, 2026

I've taken a look and have some reservations on exported API chosen. I'd like to better understand how we define APIs in machine package to understand if the exported functions implemented here match with what the rest of TinyGo does. Basically working on getting something like go doc -tags=rp2040 machine to work (which it does not currently)

@soypat
Copy link
Contributor

soypat commented Feb 25, 2026

I vibe coded a tool to help us understand the tinygo APIs better. I'll invite you all to check it out to understand what our APIs look like in TinyGo #5224

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

4 participants