micropython/ports/samd
..
boards
modules
Makefile
README.md
help.c
machine_led.c
machine_pin.c
main.c
modmachine.c
modmachine.h
modsamd.c
modutime.c
mpconfigport.h
mphalport.c
mphalport.h
qstrdefsport.h
samd_flash.c
samd_isr.c
samd_soc.c
samd_soc.h
sections.ld
tusb_config.h
tusb_port.c

README.md

Port of MicroPython to Microchip SAMD MCUs

Supports SAMD21 and SAMD51.

Features:

REPL

  • REPL over USB VCP
  • REPL over USART using board specified USART pins (initialised on startup).
    • The USART Pins are board specific, defined in boards/$(BOARD)/mpconfigboard.h, and set at compile time. See the table below. At this stage, the USART cannot be moved to different pins unless mpconfigboard.h is edited and the port recompiled.
    • Two USART functions are accessible through MicroPython:
      • uart_init(). The 'C' function behind this function is what initialises the USART on startup. Calling this function in MicroPython resets any other peripheral operating on these pins and reconnects the USART SERCOM to the designated pins.
      • uart_deinit(). This simply 'disconnects' the SERCOM from the pins. The USART remains operating over USB VCP to maintain access to the REPL.

Boards

Board USART LFS1 Flash size Tested
ADAFRUIT_FEATHER_M0_EXPRESS Tx=PA10=SERCOM0/PAD[2], Rx=PA11=SERCOM0/PAD[3] 64k No
ADAFRUIT_ITSYBITSY_M4_EXPRESS Tx=TX_D1=PA17=SERCOM3/PAD[0], Rx=RX_D0=PA16=SERCOM3/PAD[1] 128k No
ADAFRUIT_TRINKET_M0 Tx=D4=PA06=SERCOM0/PAD[2], Rx=D3=PA07=SERCOM0/PAD[3] 64k No
MINISAM_M4 Tx=TX_D1=PA17=SERCOM3/PAD[0], Rx=RX_D0=PA16=SERCOM3/PAD[1] 128k No
SAMD21_XPLAINED_PRO Tx=PA10=SERCOM0/PAD[2], Rx=PA11=SERCOM0/PAD[3] 64k No
SEEED_WIO_TERMINAL Tx=BCM14=PB27=SERCOM2/PAD[0], Rx=BCM15=PB26=SERCOM2/PAD[1] 128k Yes
SEEED_XIAO Tx=A6=PB8=SERCOM4/PAD[0], Rx=A7=PB9=SERCOM4/PAD[1] 64k Yes

Note: all USARTs are set to: async, 8 bit, 1 stop bit, no parity, 115200 bps.

Modules

  • Internal modules and functions:

>>>help('modules') __main__ micropython uheapq ustruct _boot samd uio usys _uasyncio uarray ujson utime builtins uasyncio uos uzlib gc ubinascii urandom machine uctypes ure Plus any modules on the filesystem

Flash

  • Internal Flash Block Device samd.Flash() initialised with littlefs1 in frozen module '_boot.py'.

  • No external SPI Flash driver (ToDo).

  • Block Device size is set in ports/samd/boards/$(BOARD)/mpconfigboard.h :

    • SAMD21: (eg; SEEED_XIAO): 64k 0xFFFF
    • SAMD51: (eg; M4's): 128k 0x1FFFF

Pins & LEDs

machine.Pin() class.
  • GPIO methods & constants:

    value IN OUT PULL_DOWN PULL_UP high init low off on toggle

  • Each board has its own pin numbering scheme, so please see the table below (the structure is defined inboards/$(BOARD)/pins.c) for pin numbers referenced (index) by 'Pin'. Eg; SEEED_XIAO/pins.c: {{&machine_pin_type}, PIN_PA02}, // A0/D0 means MicroPython Pin(0) is SEEED_XIAO pin "A0/D0" on SAMD21G18A PortA, Pin2.

  • Note: on the SEEED_XIAO, if the TX & TX pins are used by the Pin() class, the Pin() initialisation disconnects the pins from the SERCOM similar to the way machine.uart_deinit() does.

MicroPython Pin() SAMD51 Pin#/ ItsyBitsy_M4 SAMD21 Pin#/ Feather_M0 SAMD21 Pin#/ Xplained Pro SAMD21 Pin#/ Trinket_M0 SAMD51 Pin#/ Minisam SAMD21 Pin#/ SEEED_XIAO SAMD51 Pin#/ SEEED_WIO_TERMINAL
Pin(0) PA16/ RX_D0 PA11/ D0 PB00/ PIN3_ADC(+) (ext1) PA08/ D0 PA02/ A0,D9 PA02 / A0/D0 PB08 / A0/D0
Pin(1) PA17/ TX_D1 PA10/ D1 PB01/ PIN4_ADC(-) (ext1) PA02/ D1 PB08/ A1,D10 PA04 / A1/D1 PB09 / A1/D1
Pin(2) PA07/ D2 PA14/ D2 PB06/ PIN5_GPIO (ext1) PA09/ D2 PB09/ A2,D11 PA10 / A2/D2 PA07 / A2/D2
Pin(3) PB22/ D3 PA09/ D3/ PB07/ PIN6_GPIO (ext1) PA07/ D3/ RxD PA04/ A3,D12 PA11 / A3/D3 PB04 / A3/D3
Pin(4) PA14/ D4 PA08/ D4/ PB02/ PIN7_PWM(+) (ext1) PA06/ D4/ TxD PA05/ A4,D13 PA08 / A4/D4 PB05 / A4/D4
Pin(5) PA15/ D5 PA15/ D5 PB03/ PIN8_PWM(-) (ext1) PA06/ A5 PA09 / A5/D5 PB06 / A5/D5
Pin(6) -1/ D6 PA20/ D6 PB04/ PIN9_IRQ/GPIO (ext1) PA16/ RX_D0 PB08 / A6/D6/TX PA04 / A6/D6
Pin(7) PA18/ D7 PA21/ D7 PB05/ PIN10_SPI_SS_B/GPIO (ext1) PA17/ TX_D1 PB09 / A7/D7/RX PB07 / A7/D7
Pin(8) -1/ D8 PA06/ D8/ PA08/ PIN11_TWI_SDA (ext1) PA07/ D2,A6 PA07 / A8/D8 PA06 / A8/D8
Pin(9) PA19/ D9 PA07/ D9/ PA09/ PIN12_TWI_SCL (ext1) PA19/ D3 PA05 / A9/D9 PD08 / SWITCH_X
Pin(10) PA20/ D10 PA18/ D10 PB09/ PIN13_UART_RX (ext1) PA20/ D4 PA06 / A10/D10 PD09 / SWITCH_Y
Pin(11) PA21/ D11 PA16/ D11 PB08/ PIN14_UART_TX (ext1) PA21/ D5 PD10 / SWITCH_Z
Pin(12) PA23/ D12 PA19/ D12 PA05/ PIN15_SPI_SS_A (ext1) PA00/ BUTTON PD12 / SWITCH_B
Pin(13) PA22/ D13 PA17/ D13/ PA06/ PIN16_SPI_MOSI (ext1) PD20 / SWITCH_U
Pin(14) PA02/ A0 PA02/ A0 PA04/ PIN17_SPI_MISO (ext1) PC26 / BUTTON_1
Pin(15) PA05/ A1 PB08/ A1 PA07/ PIN18_SPI_SCK (ext1) PC27 / BUTTON_2
Pin(16) PB08/ A2 PB09/ A2 PA10/ PIN3_ADC(+) (ext2) PC28 / BUTTON_3
Pin(17) PB09/ A3 PA04/ A3/ PA11/ PIN4_ADC(-) (ext2) PD11 / BUZZER_CTR
Pin(18) PA04/ A4 PA05/ A4/ PA20/ PIN5_GPIO (ext2) PC14/ 5V_OUTPUT_CTR- '1'= 5V on hdr
Pin(19) PA06/ A5 PB02/ A5 PA21/ PIN6_GPIO (ext2) PC15/ 3V3_OUTPUT_CTR- '0'= 3V3 on hdr
Pin(20) PB12/ PIN7_PWM(+) (ext2)
Pin(21) PB13/ PIN8_PWM(-) (ext2)
Pin(22) PB14/ PIN9_IRQ/GPIO (ext2)
Pin(23) PB15/ PIN10_SPI_SS_B/GPIO (ext2)
Pin(24) -1 / PIN11_TWI_SDA already defined
Pin(25) -1 / PIN12_TWI_SCL already defined
Pin(26) PB11/ PIN13_UART_RX (ext2)
Pin(27) PB10/ PIN14_UART_TX (ext2)
Pin(28) PA17/ PIN15_SPI_SS_A (ext2)
Pin(29) PA18/ PIN16_SPI_MOSI (ext2)
Pin(30) PA16/ PIN17_SPI_MISO (ext2)
Pin(31) PA19/ PIN18_SPI_SCK (ext2)
Pin(32) PA02/ PIN3_ADC(+) (ext3)
Pin(33) PA03/ PIN4_ADC(-) (ext3)
Pin(34) -1/ PIN5_GPIO already defined
Pin(35) PA15/ PIN6_GPIO; USER_BUTTON (ext3)
Pin(36) PA12/ PIN7_PWM(+) (ext3)
Pin(37) PA13/ PIN8_PWM(-) (ext3)
Pin(38) PA28/ PIN9_IRQ/GPIO (ext3)
Pin(39) PA27/ PIN10_SPI_SS_B/GPIO (ext3)
Pin(40) -1/ PIN11_TWI_SDA already defined
Pin(41) -1/ PIN12_TWI_SCL already defined
Pin(42) -1/ PIN13_UART_RX already defined
Pin(43) -1/ PIN14_UART_TX already defined
Pin(44) PA15/ PIN6_GPIO; USER_BUTTON (ext3)
Pin(45) PB22/ PIN16_SPI_MOSI (ext3)
Pin(46) PB16/ PIN17_SPI_MISO (ext3)
Pin(47) PB23/ PIN18_SPI_SCK (ext3)
machine.LED() class.
  • GPIO methods & constants:

value OUT high low off on toggle

  • As above, please see boards/$(BOARD)/pins.c for pin numbers referenced by 'LED'. Eg; SEEED_XIAO/pins.c: {{&machine_led_type}, PIN_PA17}, // W13 means MicroPython LED(0) is SEEED_XIAO LED "W13" connected to SAMD21G18A PortA, Pin17.
MicroPython LED() SAMD51 Pin#/ ItsyBitsy_M4 SAMD21 Pin#/ Feather_M0 SAMD21 Pin#/ Xplained Pro SAMD21 Pin#/ Trinket_M0 SAMD51 Pin#/ Minisam SAMD21 Pin#/ SEEED_XIAO SAMD51 Pin#/ SEEED_WIO_TERMINAL
LED(0) PA22/ D13/ user LED PA17/ D13/ user LED PB30/ USER_LED PA10/ USER_LED PA15/ LED PA17 / W13 PA15 / USER_LED (Blue)
LED(1) PA18 / RX_LED PC05 / LCD_BACKLIGHT_CTR
LED(2) PA19 / TX_LED