mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-09 13:33:39 +00:00
cfd74c2954
* Add STM32G0B1 target support Introduce support for STM32G0B1 microcontrollers, including target-specific JSON files, linker scripts, and runtime initialization. This update adds hardware support for GPIO, UART, SPI, I2C, timers, and additional board-specific configurations like Nucleo-G0B1RE. * Update STM32G0 clock initialization to 64MHz and adjust related configurations Reconfigure STM32G0 to use a 64MHz system clock via PLL with HSI16 as the source. Update flash latency, prescaler settings, and I2C timing values to reflect the new frequency. * Cleanup * Cleanup * Add STM32G0-specific UART implementation Introduce a new UART implementation for the STM32G0 series with chip-specific setup and configuration methods. Update the generic STM32 UART code to exclude STM32G0. * Refactor STM32G0 runtime and machine code to utilize chip-specific register access functions Simplify and standardize register operations with dedicated setter methods in the STM32G0 runtime and machine code and cleanup redundant syntax. * Remove redundant commented-out APBENR1 register operations in STM32G0 machine code * Introduce FDCAN support for STM32G0B1 series Add FDCAN peripheral implementation targeting STM32G0B1, including support for standard, extended identifiers, and bit rate configuration. Update board files to include FDCAN pins, instances, and clock configuration for Nucleo-G0B1RE and Amken Trio boards.
87 lines
2.1 KiB
Go
87 lines
2.1 KiB
Go
//go:build stm32g0
|
|
|
|
package machine
|
|
|
|
// Peripheral abstraction layer for UARTs on the stm32g0 family.
|
|
|
|
import (
|
|
"device/stm32"
|
|
"runtime/interrupt"
|
|
"runtime/volatile"
|
|
"unsafe"
|
|
)
|
|
|
|
// UART representation
|
|
type UART struct {
|
|
Buffer *RingBuffer
|
|
Bus *stm32.USART_Type
|
|
Interrupt interrupt.Interrupt
|
|
TxAltFuncSelector uint8
|
|
RxAltFuncSelector uint8
|
|
|
|
// Registers specific to the chip
|
|
rxReg *volatile.Register32
|
|
txReg *volatile.Register32
|
|
statusReg *volatile.Register32
|
|
txEmptyFlag uint32
|
|
}
|
|
|
|
// Configure the UART.
|
|
func (uart *UART) Configure(config UARTConfig) {
|
|
// Default baud rate to 115200.
|
|
if config.BaudRate == 0 {
|
|
config.BaudRate = 115200
|
|
}
|
|
|
|
// Set the GPIO pins to defaults if they're not set
|
|
if config.TX == 0 && config.RX == 0 {
|
|
config.TX = UART_TX_PIN
|
|
config.RX = UART_RX_PIN
|
|
}
|
|
|
|
// STM32 families have different, but compatible, registers for
|
|
// basic UART functions. For each family populate the registers
|
|
// into `uart`.
|
|
uart.setRegisters()
|
|
|
|
// Enable USART clock
|
|
enableAltFuncClock(unsafe.Pointer(uart.Bus))
|
|
|
|
uart.configurePins(config)
|
|
|
|
// Set baud rate
|
|
uart.SetBaudRate(config.BaudRate)
|
|
|
|
// Enable USART port, tx, rx and rx interrupts
|
|
// STM32G0 uses CR1_FIFO_ENABLED register
|
|
uart.Bus.CR1_FIFO_ENABLED.Set(stm32.USART_CR1_TE | stm32.USART_CR1_RE | stm32.USART_CR1_RXNEIE | stm32.USART_CR1_UE)
|
|
|
|
// Enable RX IRQ
|
|
uart.Interrupt.SetPriority(0xc0)
|
|
uart.Interrupt.Enable()
|
|
}
|
|
|
|
// handleInterrupt should be called from the appropriate interrupt handler for
|
|
// this UART instance.
|
|
func (uart *UART) handleInterrupt(interrupt.Interrupt) {
|
|
uart.Receive(byte((uart.rxReg.Get() & 0xFF)))
|
|
}
|
|
|
|
// SetBaudRate sets the communication speed for the UART. Defer to chip-specific
|
|
// routines for calculation
|
|
func (uart *UART) SetBaudRate(br uint32) {
|
|
divider := uart.getBaudRateDivisor(br)
|
|
uart.Bus.BRR.Set(divider)
|
|
}
|
|
|
|
// WriteByte writes a byte of data to the UART.
|
|
func (uart *UART) writeByte(c byte) error {
|
|
uart.txReg.Set(uint32(c))
|
|
|
|
for !uart.statusReg.HasBits(uart.txEmptyFlag) {
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (uart *UART) flush() {}
|