mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-20 04:19:04 +00:00
stm32: use stm32-rs SVDs which are of much higher quality
This commit changes the number of wait states for the stm32f103 chip to 2 instead of 4. This gets it back in line with the datasheet, but it also has the side effect of breaking I2C. Therefore, another (seemingly unrelated) change is needed: the i2cTimeout constant must be increased to a higher value to adjust to the lower flash wait states - presumably because the lower number of wait states allows the chip to run code faster.
This commit is contained in:
committed by
Ron Evans
parent
65caf777dd
commit
154c7c691b
@@ -1,4 +1,4 @@
|
||||
// +build stm32,!stm32f103xx
|
||||
// +build stm32,!stm32f103
|
||||
|
||||
package machine
|
||||
|
||||
@@ -38,85 +38,106 @@ const (
|
||||
// TBD
|
||||
)
|
||||
|
||||
// Define several bitfields that have different names across chip families but
|
||||
// essentially have the same meaning.
|
||||
const (
|
||||
// MODER bitfields.
|
||||
gpioModeInput = 0
|
||||
gpioModeOutput = 1
|
||||
gpioModeAlternate = 2
|
||||
gpioModeAnalog = 3
|
||||
gpioModeMask = 0x3
|
||||
|
||||
// PUPDR bitfields.
|
||||
gpioPullFloating = 0
|
||||
gpioPullUp = 1
|
||||
gpioPullDown = 2
|
||||
gpioPullMask = 0x3
|
||||
|
||||
// OSPEED bitfields.
|
||||
gpioOutputSpeedHigh = 2
|
||||
gpioOutputSpeedLow = 0
|
||||
gpioOutputSpeedMask = 0x3
|
||||
)
|
||||
|
||||
// Configure this pin with the given configuration
|
||||
func (p Pin) Configure(config PinConfig) {
|
||||
// Use the default system alternate function; this
|
||||
// will only be used if you try to call this with
|
||||
// one of the peripheral modes instead of vanilla GPIO.
|
||||
p.ConfigureAltFunc(config, stm32.AF0_SYSTEM)
|
||||
p.ConfigureAltFunc(config, 0)
|
||||
}
|
||||
|
||||
// Configure this pin with the given configuration including alternate
|
||||
// function mapping if necessary.
|
||||
func (p Pin) ConfigureAltFunc(config PinConfig, altFunc stm32.AltFunc) {
|
||||
func (p Pin) ConfigureAltFunc(config PinConfig, altFunc uint8) {
|
||||
// Configure the GPIO pin.
|
||||
p.enableClock()
|
||||
port := p.getPort()
|
||||
pin := uint8(p) % 16
|
||||
pos := pin * 2
|
||||
pos := (uint8(p) % 16) * 2 // assume each field is two bits in size (with mask 0x3)
|
||||
|
||||
switch config.Mode {
|
||||
|
||||
// GPIO
|
||||
case PinInputFloating:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeInput, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRFloating, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeInput, gpioModeMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullFloating, gpioPullMask, pos)
|
||||
case PinInputPulldown:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeInput, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRPullDown, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeInput, gpioModeMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullDown, gpioPullMask, pos)
|
||||
case PinInputPullup:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeInput, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRPullUp, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeInput, gpioModeMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullUp, gpioPullMask, pos)
|
||||
case PinOutput:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeOutputGeneral, 0x3, pos)
|
||||
port.OSPEEDR.ReplaceBits(stm32.GPIOSpeedHigh, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeOutput, gpioModeMask, pos)
|
||||
port.OSPEEDR.ReplaceBits(gpioOutputSpeedHigh, gpioOutputSpeedMask, pos)
|
||||
|
||||
// UART
|
||||
case PinModeUARTTX:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeOutputAltFunc, 0x3, pos)
|
||||
port.OSPEEDR.ReplaceBits(stm32.GPIOSpeedHigh, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRPullUp, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeAlternate, gpioModeMask, pos)
|
||||
port.OSPEEDR.ReplaceBits(gpioOutputSpeedHigh, gpioOutputSpeedMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullUp, gpioPullMask, pos)
|
||||
p.SetAltFunc(altFunc)
|
||||
case PinModeUARTRX:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeOutputAltFunc, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRFloating, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeAlternate, gpioModeMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullFloating, gpioPullMask, pos)
|
||||
p.SetAltFunc(altFunc)
|
||||
|
||||
// I2C
|
||||
case PinModeI2CSCL:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeOutputAltFunc, 0x3, pos)
|
||||
port.OTYPER.ReplaceBits(stm32.GPIOOutputTypeOpenDrain, 0x1, pos)
|
||||
port.OSPEEDR.ReplaceBits(stm32.GPIOSpeedLow, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRFloating, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeAlternate, gpioModeMask, pos)
|
||||
port.OTYPER.ReplaceBits(stm32.GPIO_OTYPER_OT0_OpenDrain, stm32.GPIO_OTYPER_OT0_Msk, pos/2)
|
||||
port.OSPEEDR.ReplaceBits(gpioOutputSpeedLow, gpioOutputSpeedMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullFloating, gpioPullMask, pos)
|
||||
p.SetAltFunc(altFunc)
|
||||
case PinModeI2CSDA:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeOutputAltFunc, 0x3, pos)
|
||||
port.OTYPER.ReplaceBits(stm32.GPIOOutputTypeOpenDrain, 0x1, pos)
|
||||
port.OSPEEDR.ReplaceBits(stm32.GPIOSpeedLow, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRFloating, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeAlternate, gpioModeMask, pos)
|
||||
port.OTYPER.ReplaceBits(stm32.GPIO_OTYPER_OT0_OpenDrain, stm32.GPIO_OTYPER_OT0_Msk, pos/2)
|
||||
port.OSPEEDR.ReplaceBits(gpioOutputSpeedLow, gpioOutputSpeedMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullFloating, gpioPullMask, pos)
|
||||
p.SetAltFunc(altFunc)
|
||||
|
||||
// SPI
|
||||
case PinModeSPICLK:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeOutputAltFunc, 0x3, pos)
|
||||
port.OSPEEDR.ReplaceBits(stm32.GPIOSpeedLow, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRFloating, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeAlternate, gpioModeMask, pos)
|
||||
port.OSPEEDR.ReplaceBits(gpioOutputSpeedLow, gpioOutputSpeedMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullFloating, gpioPullMask, pos)
|
||||
p.SetAltFunc(altFunc)
|
||||
case PinModeSPISDO:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeOutputAltFunc, 0x3, pos)
|
||||
port.OSPEEDR.ReplaceBits(stm32.GPIOSpeedLow, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRFloating, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeAlternate, gpioModeMask, pos)
|
||||
port.OSPEEDR.ReplaceBits(gpioOutputSpeedLow, gpioOutputSpeedMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullFloating, gpioPullMask, pos)
|
||||
p.SetAltFunc(altFunc)
|
||||
case PinModeSPISDI:
|
||||
port.MODER.ReplaceBits(stm32.GPIOModeOutputAltFunc, 0x3, pos)
|
||||
port.OSPEEDR.ReplaceBits(stm32.GPIOSpeedLow, 0x3, pos)
|
||||
port.PUPDR.ReplaceBits(stm32.GPIOPUPDRFloating, 0x3, pos)
|
||||
port.MODER.ReplaceBits(gpioModeAlternate, gpioModeMask, pos)
|
||||
port.OSPEEDR.ReplaceBits(gpioOutputSpeedLow, gpioOutputSpeedMask, pos)
|
||||
port.PUPDR.ReplaceBits(gpioPullFloating, gpioPullMask, pos)
|
||||
p.SetAltFunc(altFunc)
|
||||
}
|
||||
}
|
||||
|
||||
// SetAltFunc maps the given alternative function to the I/O pin
|
||||
func (p Pin) SetAltFunc(af stm32.AltFunc) {
|
||||
func (p Pin) SetAltFunc(af uint8) {
|
||||
port := p.getPort()
|
||||
pin := uint8(p) % 16
|
||||
pos := (pin % 8) * 4
|
||||
|
||||
Reference in New Issue
Block a user