diff options
author | ardnew <[email protected]> | 2020-08-29 00:31:51 -0500 |
---|---|---|
committer | Ron Evans <[email protected]> | 2020-09-11 09:09:02 +0200 |
commit | 20a1c730a187477e2670f8906f4a18ff74dad72e (patch) | |
tree | 643f7118b063bbe2a5d035ea29d8d3d690bef2a6 /src/machine/board_feather-stm32f405.go | |
parent | 04f65f11892cda8ecbafe80feb48d9ccd94fd7fa (diff) | |
download | tinygo-20a1c730a187477e2670f8906f4a18ff74dad72e.tar.gz tinygo-20a1c730a187477e2670f8906f4a18ff74dad72e.zip |
add STM32F405 machine/runtime, and new board/target feather-stm32f405
Diffstat (limited to 'src/machine/board_feather-stm32f405.go')
-rw-r--r-- | src/machine/board_feather-stm32f405.go | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/machine/board_feather-stm32f405.go b/src/machine/board_feather-stm32f405.go new file mode 100644 index 000000000..6b7f30234 --- /dev/null +++ b/src/machine/board_feather-stm32f405.go @@ -0,0 +1,167 @@ +// +build feather_stm32f405 + +package machine + +import ( + "device/stm32" + "runtime/interrupt" +) + +const ( + NUM_DIGITAL_IO_PINS = 39 + NUM_ANALOG_IO_PINS = 7 +) + +// Pinout +const ( + // Arduino pin = MCU port pin // primary functions (alternate functions) + D0 = PB11 // USART3 RX, PWM TIM2_CH4 (I2C2 SDA) + D1 = PB10 // USART3 TX, PWM TIM2_CH3 (I2C2 SCL, I2S2 BCK) + D2 = PB3 // GPIO, SPI3 FLASH SCK + D3 = PB4 // GPIO, SPI3 FLASH MISO + D4 = PB5 // GPIO, SPI3 FLASH MOSI + D5 = PC7 // GPIO, PWM TIM3_CH2 (USART6 RX, I2S3 MCK) + D6 = PC6 // GPIO, PWM TIM3_CH1 (USART6 TX, I2S2 MCK) + D7 = PA15 // GPIO, SPI3 FLASH CS + D8 = PC0 // GPIO, Neopixel + D9 = PB8 // GPIO, PWM TIM4_CH3 (CAN1 RX, I2C1 SCL) + D10 = PB9 // GPIO, PWM TIM4_CH4 (CAN1 TX, I2C1 SDA, I2S2 WSL) + D11 = PC3 // GPIO (I2S2 SD, SPI2 MOSI) + D12 = PC2 // GPIO (I2S2ext SD, SPI2 MISO) + D13 = PC1 // GPIO, Builtin LED + D14 = PB7 // I2C1 SDA, PWM TIM4_CH2 (USART1 RX) + D15 = PB6 // I2C1 SCL, PWM TIM4_CH1 (USART1 TX, CAN2 TX) + D16 = PA4 // A0 (DAC OUT1) + D17 = PA5 // A1 (DAC OUT2, SPI1 SCK) + D18 = PA6 // A2, PWM TIM3_CH1 (SPI1 MISO) + D19 = PA7 // A3, PWM TIM3_CH2 (SPI1 MOSI) + D20 = PC4 // A4 + D21 = PC5 // A5 + D22 = PA3 // A6 + D23 = PB13 // SPI2 SCK, PWM TIM1_CH1N (I2S2 BCK, CAN2 TX) + D24 = PB14 // SPI2 MISO, PWM TIM1_CH2N (I2S2ext SD) + D25 = PB15 // SPI2 MOSI, PWM TIM1_CH3N (I2S2 SD) + D26 = PC8 // SDIO + D27 = PC9 // SDIO + D28 = PC10 // SDIO + D29 = PC11 // SDIO + D30 = PC12 // SDIO + D31 = PD2 // SDIO + D32 = PB12 // SD Detect + D33 = PC14 // OSC32 + D34 = PC15 // OSC32 + D35 = PA11 // USB D+ + D36 = PA12 // USB D- + D37 = PA13 // SWDIO + D38 = PA14 // SWCLK +) + +// Analog pins +const ( + A0 = D16 // ADC12 IN4 + A1 = D17 // ADC12 IN5 + A2 = D18 // ADC12 IN6 + A3 = D19 // ADC12 IN7 + A4 = D20 // ADC12 IN14 + A5 = D21 // ADC12 IN15 + A6 = D22 // VBAT +) + +// Pretty lights +const ( + LED = LED_BUILTIN + LED_BUILTIN = LED_RED + LED_RED = D13 + LED_NEOPIXEL = D8 +) + +// UART pins +const ( + NUM_UART_INTERFACES = 3 + + UART_RX_PIN = UART1_RX_PIN + UART_TX_PIN = UART1_TX_PIN + + UART0_RX_PIN = D0 + UART0_TX_PIN = D1 + UART1_RX_PIN = UART0_RX_PIN + UART1_TX_PIN = UART0_TX_PIN + + UART2_RX_PIN = D5 + UART2_TX_PIN = D6 + + UART3_RX_PIN = D14 + UART3_TX_PIN = D15 +) + +var ( + // TBD: why do UART0 and UART1 have different types (struct vs reference)? + UART0 = UART{ + Buffer: NewRingBuffer(), + Bus: stm32.USART3, + AltFuncSelector: stm32.AF7_USART1_2_3, + } + UART1 = &UART0 + +// UART2 = &UART{ +// Buffer: NewRingBuffer(), +// Bus: stm32.USART6, +// AltFuncSelector: stm32.AF8_USART4_5_6, +// } +// UART3 = &UART{ +// Buffer: NewRingBuffer(), +// Bus: stm32.USART1, +// AltFuncSelector: stm32.AF7_USART1_2_3, +// } +) + +// set up RX IRQ handler. Follow similar pattern for other UARTx instances +func init() { + UART0.Interrupt = interrupt.New(stm32.IRQ_USART3, UART0.handleInterrupt) + //UART2.Interrupt = interrupt.New(stm32.IRQ_USART6, UART2.handleInterrupt) + //UART3.Interrupt = interrupt.New(stm32.IRQ_USART1, UART3.handleInterrupt) +} + +// SPI pins +const ( + NUM_SPI_INTERFACES = 3 + + SPI_SCK_PIN = SPI1_SCK_PIN + SPI_SDI_PIN = SPI1_SDI_PIN + SPI_SDO_PIN = SPI1_SDO_PIN + + SPI0_SCK_PIN = D23 + SPI0_SDI_PIN = D24 + SPI0_SDO_PIN = D25 + SPI1_SCK_PIN = SPI0_SCK_PIN + SPI1_SDI_PIN = SPI0_SDI_PIN + SPI1_SDO_PIN = SPI0_SDO_PIN + + SPI2_SCK_PIN = D2 + SPI2_SDI_PIN = D3 + SPI2_SDO_PIN = D4 + + SPI3_SCK_PIN = D17 + SPI3_SDI_PIN = D18 + SPI3_SDO_PIN = D19 +) + +// Since the first interface is named SPI1, both SPI0 and SPI1 refer to SPI1. +// TODO: implement SPI2 and SPI3. +var ( + // TBD: why do SPI0 and SPI1 have different types (struct vs reference)? + SPI0 = SPI{ + Bus: stm32.SPI2, + AltFuncSelector: stm32.AF5_SPI1_SPI2, + } + SPI1 = &SPI0 + +// SPI2 = &SPI{ +// Bus: stm32.SPI3, +// AltFuncSelector: stm32.AF6_SPI3, +// } +// SPI3 = &SPI{ +// Bus: stm32.SPI1, +// AltFuncSelector: stm32.AF5_SPI1_SPI2, +// } +) |