256 строки
7,2 КиБ
Go
256 строки
7,2 КиБ
Go
//go:build feather_stm32f405
|
|
// +build feather_stm32f405
|
|
|
|
package machine
|
|
|
|
import (
|
|
"runtime/interrupt"
|
|
"tinygo.org/x/device/stm32"
|
|
)
|
|
|
|
const (
|
|
NUM_DIGITAL_IO_PINS = 39
|
|
NUM_ANALOG_IO_PINS = 7
|
|
)
|
|
|
|
// Digital pins
|
|
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
|
|
)
|
|
|
|
func init() {
|
|
initLED()
|
|
initUART()
|
|
initSPI()
|
|
initI2C()
|
|
}
|
|
|
|
// -- LEDs ---------------------------------------------------------------------
|
|
|
|
const (
|
|
NUM_BOARD_LED = 1
|
|
NUM_BOARD_NEOPIXEL = 1
|
|
|
|
LED_RED = D13
|
|
LED_NEOPIXEL = D8
|
|
LED_BUILTIN = LED_RED
|
|
LED = LED_BUILTIN
|
|
WS2812 = D8
|
|
)
|
|
|
|
func initLED() {}
|
|
|
|
// -- UART ---------------------------------------------------------------------
|
|
|
|
const (
|
|
// #===========#==========#==============#============#=======#=======#
|
|
// | Interface | Hardware | Bus(Freq) | RX/TX Pins | AltFn | Alias |
|
|
// #===========#==========#==============#============#=======#=======#
|
|
// | UART1 | USART3 | APB1(42 MHz) | D0/D1 | 7 | ~ |
|
|
// | UART2 | USART6 | APB2(84 MHz) | D5/D6 | 8 | ~ |
|
|
// | UART3 | USART1 | APB2(84 MHz) | D14/D15 | 7 | ~ |
|
|
// | --------- | -------- | ------------ | ---------- | ----- | ----- |
|
|
// | UART0 | USART3 | APB1(42 MHz) | D0/D1 | 7 | UART1 |
|
|
// #===========#==========#==============#============#=======#=======#
|
|
NUM_UART_INTERFACES = 3
|
|
|
|
UART1_RX_PIN = D0 // UART1 = hardware: USART3
|
|
UART1_TX_PIN = D1 //
|
|
|
|
UART2_RX_PIN = D5 // UART2 = hardware: USART6
|
|
UART2_TX_PIN = D6 //
|
|
|
|
UART3_RX_PIN = D14 // UART3 = hardware: USART1
|
|
UART3_TX_PIN = D15 //
|
|
|
|
UART0_RX_PIN = UART1_RX_PIN // UART0 = alias: UART1
|
|
UART0_TX_PIN = UART1_TX_PIN //
|
|
|
|
UART_RX_PIN = UART0_RX_PIN // default/primary UART pins
|
|
UART_TX_PIN = UART0_TX_PIN //
|
|
)
|
|
|
|
var (
|
|
UART1 = &_UART1
|
|
_UART1 = UART{
|
|
Buffer: NewRingBuffer(),
|
|
Bus: stm32.USART3,
|
|
TxAltFuncSelector: AF7_USART1_2_3,
|
|
RxAltFuncSelector: AF7_USART1_2_3,
|
|
}
|
|
UART2 = &_UART2
|
|
_UART2 = UART{
|
|
Buffer: NewRingBuffer(),
|
|
Bus: stm32.USART6,
|
|
TxAltFuncSelector: AF8_USART4_5_6,
|
|
RxAltFuncSelector: AF8_USART4_5_6,
|
|
}
|
|
UART3 = &_UART3
|
|
_UART3 = UART{
|
|
Buffer: NewRingBuffer(),
|
|
Bus: stm32.USART1,
|
|
TxAltFuncSelector: AF7_USART1_2_3,
|
|
RxAltFuncSelector: AF7_USART1_2_3,
|
|
}
|
|
DefaultUART = UART1
|
|
)
|
|
|
|
func initUART() {
|
|
UART1.Interrupt = interrupt.New(stm32.IRQ_USART3, _UART1.handleInterrupt)
|
|
UART2.Interrupt = interrupt.New(stm32.IRQ_USART6, _UART2.handleInterrupt)
|
|
UART3.Interrupt = interrupt.New(stm32.IRQ_USART1, _UART3.handleInterrupt)
|
|
}
|
|
|
|
// -- SPI ----------------------------------------------------------------------
|
|
|
|
const (
|
|
// #===========#==========#==============#==================#=======#=======#
|
|
// | Interface | Hardware | Bus(Freq) | SCK/SDI/SDO Pins | AltFn | Alias |
|
|
// #===========#==========#==============#==================#=======#=======#
|
|
// | SPI1 | SPI2 | APB1(42 MHz) | D23/D24/D25 | 5 | ~ |
|
|
// | SPI2 | SPI3 | APB1(42 MHz) | D2/D3/D4 | 6 | ~ |
|
|
// | SPI3 | SPI1 | APB2(84 MHz) | D17/D18/D19 | 5 | ~ |
|
|
// | --------- | -------- | ------------ | ---------------- | ----- | ----- |
|
|
// | SPI0 | SPI2 | APB1(42 MHz) | D23/D24/D25 | 5 | SPI1 |
|
|
// #===========#==========#==============#==================#=======#=======#
|
|
NUM_SPI_INTERFACES = 3
|
|
|
|
SPI1_SCK_PIN = D23 //
|
|
SPI1_SDI_PIN = D24 // SPI1 = hardware: SPI2
|
|
SPI1_SDO_PIN = D25 //
|
|
|
|
SPI2_SCK_PIN = D2 //
|
|
SPI2_SDI_PIN = D3 // SPI2 = hardware: SPI3
|
|
SPI2_SDO_PIN = D4 //
|
|
|
|
SPI3_SCK_PIN = D17 //
|
|
SPI3_SDI_PIN = D18 // SPI3 = hardware: SPI1
|
|
SPI3_SDO_PIN = D19 //
|
|
|
|
SPI0_SCK_PIN = SPI1_SCK_PIN //
|
|
SPI0_SDI_PIN = SPI1_SDI_PIN // SPI0 = alias: SPI1
|
|
SPI0_SDO_PIN = SPI1_SDO_PIN //
|
|
|
|
SPI_SCK_PIN = SPI0_SCK_PIN //
|
|
SPI_SDI_PIN = SPI0_SDI_PIN // default/primary SPI pins
|
|
SPI_SDO_PIN = SPI0_SDO_PIN //
|
|
)
|
|
|
|
var (
|
|
SPI1 = SPI{
|
|
Bus: stm32.SPI2,
|
|
AltFuncSelector: AF5_SPI1_SPI2,
|
|
}
|
|
SPI2 = SPI{
|
|
Bus: stm32.SPI3,
|
|
AltFuncSelector: AF6_SPI3,
|
|
}
|
|
SPI3 = SPI{
|
|
Bus: stm32.SPI1,
|
|
AltFuncSelector: AF5_SPI1_SPI2,
|
|
}
|
|
SPI0 = SPI1
|
|
)
|
|
|
|
func initSPI() {}
|
|
|
|
// -- I2C ----------------------------------------------------------------------
|
|
|
|
const (
|
|
// #===========#==========#==============#==============#=======#=======#
|
|
// | Interface | Hardware | Bus(Freq) | SDA/SCL Pins | AltFn | Alias |
|
|
// #===========#==========#==============#==============#=======#=======#
|
|
// | I2C1 | I2C1 | APB1(42 MHz) | D14/D15 | 4 | ~ |
|
|
// | I2C2 | I2C2 | APB1(42 MHz) | D0/D1 | 4 | ~ |
|
|
// | I2C3 | I2C1 | APB1(42 MHz) | D9/D10 | 4 | ~ |
|
|
// | --------- | -------- | ------------ | ------------ | ----- | ----- |
|
|
// | I2C0 | I2C1 | APB1(42 MHz) | D14/D15 | 4 | I2C1 |
|
|
// #===========#==========#==============#==============#=======#=======#
|
|
NUM_I2C_INTERFACES = 3
|
|
|
|
I2C1_SDA_PIN = D14 // I2C1 = hardware: I2C1
|
|
I2C1_SCL_PIN = D15 //
|
|
|
|
I2C2_SDA_PIN = D0 // I2C2 = hardware: I2C2
|
|
I2C2_SCL_PIN = D1 //
|
|
|
|
I2C3_SDA_PIN = D9 // I2C3 = hardware: I2C1
|
|
I2C3_SCL_PIN = D10 // (interface duplicated on second pair of pins)
|
|
|
|
I2C0_SDA_PIN = I2C1_SDA_PIN // I2C0 = alias: I2C1
|
|
I2C0_SCL_PIN = I2C1_SCL_PIN //
|
|
|
|
I2C_SDA_PIN = I2C0_SDA_PIN // default/primary I2C pins
|
|
I2C_SCL_PIN = I2C0_SCL_PIN //
|
|
|
|
SDA_PIN = I2C0_SDA_PIN
|
|
SCL_PIN = I2C0_SCL_PIN
|
|
)
|
|
|
|
var (
|
|
I2C1 = &I2C{
|
|
Bus: stm32.I2C1,
|
|
AltFuncSelector: AF4_I2C1_2_3,
|
|
}
|
|
I2C2 = &I2C{
|
|
Bus: stm32.I2C2,
|
|
AltFuncSelector: AF4_I2C1_2_3,
|
|
}
|
|
I2C3 = &I2C{
|
|
Bus: stm32.I2C1,
|
|
AltFuncSelector: AF4_I2C1_2_3,
|
|
}
|
|
I2C0 = I2C1
|
|
)
|
|
|
|
func initI2C() {}
|