micropython/ports/samd
robert-hh fc9d66fac6 samd/machine_rtc: Add the machine.RTC class.
Methods implemented are:
- rtc.init(date)
- rtc.datetime([new_date])
- rtc.calibration(value)

The presence of this class can be controlled by MICROPY_PY_MACHINE_RTC.  If
the RTC module is used, the time module uses the RTC as well.

For boards without a 32kHz crystal, using RTC makes no sense, since it will
then use the ULP32K oscillator, which is not precise at all.  Therefore, it
will by default only be enabled for boards using a crystal, but can be
enabled in the respective mpconfigboard.h.
2022-10-25 23:20:09 +11:00
..
boards samd/modmachine: Get the bootloader magic address from the lib. 2022-10-25 23:09:04 +11:00
mcu samd/machine_rtc: Add the machine.RTC class. 2022-10-25 23:20:09 +11:00
modules samd/mcu: Use lf2s for SAMD51 and lfs1 for SAMD21. 2022-10-06 23:14:21 +11:00
Makefile samd/machine_rtc: Add the machine.RTC class. 2022-10-25 23:20:09 +11:00
README.md samd/README.md: Update README to reflect new features and boards. 2021-11-19 11:49:10 +11:00
clock_config.h samd: Change the symbol names for the peripheral clocks. 2022-10-06 23:10:08 +11:00
fatfs_port.c samd/machine_rtc: Add the machine.RTC class. 2022-10-25 23:20:09 +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_adc.c samd/machine_adc: Add the machine.ADC class. 2022-10-06 22:41:44 +11:00
machine_bitstream.c samd/machine_bitstream: Add the machine.bitstream() function. 2022-10-06 23:00:00 +11:00
machine_dac.c samd/machine_dac: Add the machine.DAC class. 2022-10-06 22:55:10 +11:00
machine_i2c.c samd: Rename machine I2C type consistently across ports. 2022-10-22 12:57:32 +11:00
machine_led.c samd/machine_pin: Change the printing of Pin and LED objects. 2022-10-06 23:14:21 +11:00
machine_pin.c samd/modmachine: Implement machine.lightsleep(). 2022-10-25 23:07:27 +11:00
machine_pwm.c samd: Change the symbol names for the peripheral clocks. 2022-10-06 23:10:08 +11:00
machine_rtc.c samd/machine_rtc: Add the machine.RTC class. 2022-10-25 23:20:09 +11:00
machine_spi.c samd: Change the symbol names for the peripheral clocks. 2022-10-06 23:10:08 +11:00
machine_timer.c samd/machine_timer: Add machine.Timer based on the shared soft-timer. 2022-10-06 22:52:39 +11:00
machine_uart.c samd/machine_uart: Implement uart.txdone() and uart.flush(). 2022-10-25 23:11:57 +11:00
machine_wdt.c samd/machine_wdt: Add the machine.WDT class. 2022-10-06 22:53:06 +11:00
main.c samd/main: Initialize readline on start up. 2022-10-06 23:14:21 +11:00
modmachine.c samd/machine_rtc: Add the machine.RTC class. 2022-10-25 23:20:09 +11:00
modmachine.h samd/machine_rtc: Add the machine.RTC class. 2022-10-25 23:20:09 +11:00
modsamd.c samd/modsamd: Add pininfo() function to the samd module. 2022-10-06 22:53:28 +11:00
moduos.c samd/moduos: Add uos.urandom() for SAMD51. 2022-10-06 22:50:29 +11:00
modutime.c samd/machine_rtc: Add the machine.RTC class. 2022-10-25 23:20:09 +11:00
mpconfigport.h samd/mpconfigport: Restructure to use ROM feature levels. 2022-10-06 23:00:44 +11:00
mphalport.c samd/mphalport: Fix USB endpoint handling ignoring Ctrl-C. 2022-10-06 23:08:22 +11:00
mphalport.h samd/modmachine: Add machine.dht_readinto and enable on SAMD51. 2022-10-25 23:06:44 +11:00
pendsv.c samd/machine_timer: Add machine.Timer based on the shared soft-timer. 2022-10-06 22:52:39 +11:00
pendsv.h samd/machine_timer: Add machine.Timer based on the shared soft-timer. 2022-10-06 22:52:39 +11:00
pin_af.c samd/pin_af: Simplify the pin-af-table handling. 2022-10-06 23:05:46 +11:00
pin_af.h samd/machine_dac: Add the machine.DAC class. 2022-10-06 22:55:10 +11:00
qstrdefsport.h all: Add *FORMAT-OFF* in various places. 2020-02-28 10:31:07 +11:00
samd_flash.c samd/boards: Move the flash filesystem definitions to the linker files. 2022-10-06 23:14:08 +11:00
samd_isr.c samd/machine_timer: Add machine.Timer based on the shared soft-timer. 2022-10-06 22:52:39 +11:00
samd_soc.c samd/machine_rtc: Add the machine.RTC class. 2022-10-25 23:20:09 +11:00
samd_soc.h samd/samd_isr: Change the way a Sercom ISR is registered and called. 2022-10-06 22:52:10 +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