Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GPIO interrupts not recognized on RP2350 (Pico 2) #4689

Open
tdunning opened this issue Jan 5, 2025 · 2 comments
Open

GPIO interrupts not recognized on RP2350 (Pico 2) #4689

tdunning opened this issue Jan 5, 2025 · 2 comments
Labels

Comments

@tdunning
Copy link

tdunning commented Jan 5, 2025

I have written a simple program that should recognize edges on an input and trigger an interrupt. The interrupt doesn't happen.

Here is the simple program:

package main

import (
	"fmt"
	"machine"
	"time"
)

func bcast(x bool) int {
	if x {
		return 1
	} else {
		return 0
	}
}

func main() {
	// square wave is fed to pin 10
	p := machine.Pin(10)
	p.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
	// and should be echoed to pin 11
	q := machine.Pin(11)
	q.Configure(machine.PinConfig{Mode: machine.PinOutput})
	err := p.SetInterrupt(machine.PinRising, func(pin machine.Pin) {
		fmt.Printf("verify pin: %d\n", pin)
		fmt.Printf("interrupt: %d, %d\n", bcast(p.Get()), bcast(pin.Get()))
		q.Set(p.Get())
	})
	if err != nil {
		fmt.Printf("err set interrupt: %s\n", err.Error())
		panic(err.Error())
	} else {
		fmt.Printf("set interrupt ok\n")
	}
	for i := 0; i < 300; i++ {
		fmt.Printf("tick %d, pin=%d\n", i, bcast(p.Get()))
		time.Sleep(1 * time.Second)
	}
}

And here is the output when run on a Pico2. The main loop runs fine and the pin is clearly changing state but the interrupt is not recognized.

I suspect that there is something about the RP2350 that requires a slight additional bit of work in order to enable the control of interrupts. It may have to do with the newly introduced security model.

I don't have a 2040 based Pico to test on right now so I can't confirm this works on the RP2040

 tinygo flash -target=pico2 -scheduler=tasks -gc=conservative -size=full -stack-size=20kb -monitor IrqBug/main.go
   code  rodata    data     bss |   flash     ram | package
------------------------------- | --------------- | -------
      0      45       3       5 |      48       8 | (padding)
   1560       0      10      45 |    1570      55 | (unknown)
   1220       0       0       0 |    1220       0 | C compiler-rt-builtins
      0     248       0       0 |     248       0 | C interrupt vector
     76       0       0       0 |      76       0 | C picolibc
      0       0       0    2048 |       0    2048 | C stack
    160       0       0       0 |     160       0 | Go interface assert
    292       0       0       0 |     292       0 | Go interface method
      0    1148       0       0 |    1148       0 | Go types
     96       0       0       0 |      96       0 | device/arm
     68       0       0       0 |      68       0 | device/rp
      6       0       0       0 |       6       0 | errors
   8286     216       0       0 |    8502       0 | fmt
     14       0       0       0 |      14       0 | internal/binary
   1136      21       0       0 |    1157       0 | internal/fmtsort
    132       2       0       0 |     134       0 | internal/itoa
      0      19       8       0 |      27       8 | internal/oserror
    338      48       4       4 |     390       8 | internal/task
     46       2       0       0 |      48       0 | io/fs
   1662     159       8    1082 |    1829    1090 | machine
    400       0       0       7 |     400       7 | machine/usb/cdc
      0       0      93       0 |      93      93 | machine/usb/descriptor
    440      88       0       0 |     528       0 | main
    134       0       0       0 |     134       0 | math/bits
    160      39      32       0 |     231      32 | os
   4826     773      48       0 |    5647      48 | reflect
   4350     722       4     753 |    5076     757 | runtime
    792       0       0       0 |     792       0 | runtime/volatile
    510       0       0       0 |     510       0 | sort
   7632   16012    1338       0 |   24982    1338 | strconv
     76       0       0       0 |      76       0 | sync
     32       6       0       0 |      38       0 | syscall
   1036     288       0       0 |    1324       0 | unicode/utf8
------------------------------- | --------------- | -------
  35480   19836    1548    3944 |   56864    5492 | total
Connected to /dev/cu.usbmodem14101. Press Ctrl-C to exit.
tick 1, pin=0
tick 2, pin=0
tick 3, pin=0
tick 4, pin=0
tick 5, pin=0
tick 6, pin=0
tick 7, pin=0
tick 8, pin=0
tick 9, pin=0
tick 10, pin=1
tick 11, pin=1
tick 12, pin=1
tick 13, pin=1
tick 14, pin=0
tick 15, pin=0
tick 16, pin=0
tick 17, pin=1
tick 18, pin=0
tick 19, pin=0
@tdunning
Copy link
Author

tdunning commented Jan 6, 2025

Ref to @soypat @deadprogram @aykevl @cibomahto

@tdunning
Copy link
Author

tdunning commented Jan 8, 2025

I have now confirmed that interrupts worked as expected on the RP2040.

That means that this is, indeed, an issue introduced by the 2350. My guess is the security stuff isn't being disabled during initial boot.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants