micropython/ports/samd
Jim Mussared 94beeabd2e py/obj: Convert make_new into a mp_obj_type_t slot.
Instead of being an explicit field, it's now a slot like all the other
methods.

This is a marginal code size improvement because most types have a make_new
(100/138 on PYBV11), however it improves consistency in how types are
declared, removing the special case for make_new.

Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
2022-09-19 19:06:15 +10:00
..
boards ports: Reformat more C and Python source code. 2022-04-20 16:17:35 +10:00
modules samd: Integrate latest asf4, add help, more time funcs and uPy features. 2021-11-19 11:05:05 +11:00
Makefile ports: Always append to GIT_SUBMODULES. 2022-08-03 00:05:26 +10:00
README.md samd/README.md: Update README to reflect new features and boards. 2021-11-19 11:49:10 +11:00
help.c samd: Integrate latest asf4, add help, more time funcs and uPy features. 2021-11-19 11:05:05 +11:00
machine_led.c py/obj: Convert make_new into a mp_obj_type_t slot. 2022-09-19 19:06:15 +10:00
machine_pin.c py/obj: Convert make_new into a mp_obj_type_t slot. 2022-09-19 19:06:15 +10:00
main.c ports: Use default VFS config for import_stat and builtin_open. 2022-05-25 13:04:45 +10:00
modmachine.c all: Remove third argument to MP_REGISTER_MODULE. 2022-06-02 16:31:37 +10:00
modmachine.h samd: Add Pin and LED classes, and machine.unique_id. 2021-11-19 11:43:06 +11:00
modsamd.c all: Remove third argument to MP_REGISTER_MODULE. 2022-06-02 16:31:37 +10:00
modutime.c all: Remove third argument to MP_REGISTER_MODULE. 2022-06-02 16:31:37 +10:00
mpconfigport.h samd/mpconfigport: Enable MICROPY_ENABLE_FINALISER when VFS is used. 2022-09-13 13:08:32 +10:00
mphalport.c samd: Integrate latest asf4, add help, more time funcs and uPy features. 2021-11-19 11:05:05 +11:00
mphalport.h samd: Integrate latest asf4, add help, more time funcs and uPy features. 2021-11-19 11:05:05 +11:00
qstrdefsport.h all: Add *FORMAT-OFF* in various places. 2020-02-28 10:31:07 +11:00
samd_flash.c py/obj: Convert make_new into a mp_obj_type_t slot. 2022-09-19 19:06:15 +10:00
samd_isr.c all: Reformat C and Python source code with tools/codeformat.py. 2020-02-28 10:33:03 +11:00
samd_soc.c samd/samd_soc: Allow a board to configure the low-level MCU config. 2021-11-19 11:42:47 +11:00
samd_soc.h samd/samd_soc: Allow a board to configure the low-level MCU config. 2021-11-19 11:42:47 +11:00
sections.ld samd: Add support for building with user C modules. 2021-07-22 22:22:03 +10:00
tusb_config.h samd: Add new port to Microchip SAMDxx microcontrollers. 2019-07-01 17:19:18 +10:00
tusb_port.c ports: Rename USBD_VID/PID config macros to MICROPY_HW_USB_VID/PID. 2021-08-07 23:13:55 +10:00

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