stm32: initial support
Этот коммит содержится в:
родитель
12298d23a7
коммит
dd5b5a381c
9 изменённых файлов: 153 добавлений и 1 удалений
2
.gitignore
предоставленный
2
.gitignore
предоставленный
|
@ -3,3 +3,5 @@ src/device/avr/*.go
|
|||
src/device/avr/*.ld
|
||||
src/device/nrf/*.go
|
||||
src/device/nrf/*.s
|
||||
src/device/stm32/*.go
|
||||
src/device/stm32/*.s
|
||||
|
|
3
.gitmodules
предоставленный
3
.gitmodules
предоставленный
|
@ -7,3 +7,6 @@
|
|||
[submodule "lib/avr"]
|
||||
path = lib/avr
|
||||
url = https://github.com/avr-rust/avr-mcu.git
|
||||
[submodule "lib/cmsis-svd"]
|
||||
path = lib/cmsis-svd
|
||||
url = https://github.com/posborne/cmsis-svd
|
||||
|
|
13
Makefile
13
Makefile
|
@ -15,6 +15,12 @@ else ifeq ($(TARGET),pca10040)
|
|||
OBJCOPY = arm-none-eabi-objcopy
|
||||
TGOFLAGS += -target $(TARGET)
|
||||
|
||||
else ifeq ($(TARGET),bluepill)
|
||||
# "blue pill" development board
|
||||
# See: https://wiki.stm32duino.com/index.php?title=Blue_Pill
|
||||
OBJCOPY = arm-none-eabi-objcopy
|
||||
TGOFLAGS += -target $(TARGET)
|
||||
|
||||
else ifeq ($(TARGET),arduino)
|
||||
OBJCOPY = avr-objcopy
|
||||
TGOFLAGS += -target $(TARGET)
|
||||
|
@ -39,6 +45,9 @@ flash-%: build/%.hex
|
|||
else ifeq ($(TARGET),arduino)
|
||||
flash-%: build/%.hex
|
||||
avrdude -c arduino -p atmega328p -P /dev/ttyACM0 -U flash:w:$<
|
||||
else ifeq ($(TARGET),bluepill)
|
||||
flash-%: build/%.hex
|
||||
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c 'program $< reset exit'
|
||||
endif
|
||||
|
||||
clean:
|
||||
|
@ -57,6 +66,10 @@ gen-device-avr:
|
|||
./tools/gen-device-avr.py lib/avr/packs/atmega src/device/avr/
|
||||
go fmt ./src/device/avr
|
||||
|
||||
gen-device-stm32:
|
||||
./tools/gen-device-svd.py lib/cmsis-svd/data/STMicro/ src/device/stm32/ --source=https://github.com/posborne/cmsis-svd/tree/master/data/STMicro
|
||||
go fmt ./src/device/stm32
|
||||
|
||||
|
||||
# Build the Go compiler.
|
||||
build/tgo: *.go
|
||||
|
|
1
lib/cmsis-svd
Подмодуль
1
lib/cmsis-svd
Подмодуль
|
@ -0,0 +1 @@
|
|||
Subproject commit 2ab163c2aea83eb9b39c163856450089255ce4f2
|
|
@ -1,4 +1,4 @@
|
|||
// +build !avr,!nrf
|
||||
// +build !avr,!nrf,!stm32
|
||||
|
||||
package machine
|
||||
|
||||
|
|
81
src/machine/machine_stm32.go
Обычный файл
81
src/machine/machine_stm32.go
Обычный файл
|
@ -0,0 +1,81 @@
|
|||
// +build stm32
|
||||
|
||||
package machine
|
||||
|
||||
// Peripheral abstraction layer for the stm32.
|
||||
|
||||
import (
|
||||
"device/stm32"
|
||||
)
|
||||
|
||||
type GPIOMode uint8
|
||||
|
||||
const (
|
||||
GPIO_INPUT = 0 // Input mode
|
||||
GPIO_OUTPUT = 2 // Output mode, max speed 2MHz
|
||||
)
|
||||
|
||||
const (
|
||||
portA = iota * 16
|
||||
portB
|
||||
portC
|
||||
portD
|
||||
portE
|
||||
portF
|
||||
portG
|
||||
)
|
||||
|
||||
const (
|
||||
LED = portC + 13
|
||||
)
|
||||
|
||||
func (p GPIO) getPort() *stm32.GPIO_Type {
|
||||
switch p.Pin / 16 {
|
||||
case 0:
|
||||
return stm32.GPIOA
|
||||
case 1:
|
||||
return stm32.GPIOB
|
||||
case 2:
|
||||
return stm32.GPIOC
|
||||
case 3:
|
||||
return stm32.GPIOD
|
||||
case 4:
|
||||
return stm32.GPIOE
|
||||
case 5:
|
||||
return stm32.GPIOF
|
||||
case 6:
|
||||
return stm32.GPIOG
|
||||
default:
|
||||
panic("machine: unknown port")
|
||||
}
|
||||
}
|
||||
|
||||
// Configure this pin with the given configuration.
|
||||
func (p GPIO) Configure(config GPIOConfig) {
|
||||
// Enable clock.
|
||||
// Do this always, as it isn't known whether the clock has already been
|
||||
// enabled.
|
||||
stm32.RCC.APB2ENR |= stm32.RCC_APB2ENR_IOPCEN_Msk;
|
||||
|
||||
// Configure the GPIO pin.
|
||||
port := p.getPort()
|
||||
pin := p.Pin % 16
|
||||
pos := p.Pin % 8 * 4
|
||||
if pin < 8 {
|
||||
port.CRL = stm32.RegValue((uint32(port.CRL) &^ (0xf << pos)) | (uint32(config.Mode) << pos))
|
||||
} else {
|
||||
port.CRH = stm32.RegValue((uint32(port.CRH) &^ (0xf << pos)) | (uint32(config.Mode) << pos))
|
||||
}
|
||||
}
|
||||
|
||||
// Set the pin to high or low.
|
||||
// Warning: only use this on an output pin!
|
||||
func (p GPIO) Set(high bool) {
|
||||
port := p.getPort()
|
||||
pin := p.Pin % 16
|
||||
if high {
|
||||
port.BSRR = 1 << pin
|
||||
} else {
|
||||
port.BSRR = 1 << (pin + 16)
|
||||
}
|
||||
}
|
34
src/runtime/runtime_stm32.go
Обычный файл
34
src/runtime/runtime_stm32.go
Обычный файл
|
@ -0,0 +1,34 @@
|
|||
// +build stm32
|
||||
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"device/arm"
|
||||
)
|
||||
|
||||
type timeUnit int64
|
||||
|
||||
const tickMicros = 1 // TODO
|
||||
|
||||
//go:export Reset_Handler
|
||||
func handleReset() {
|
||||
main()
|
||||
}
|
||||
|
||||
func init() {
|
||||
}
|
||||
|
||||
func putchar(c byte) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
func sleepTicks(d timeUnit) {
|
||||
// TODO: use a real timer here
|
||||
for i := 0; i < int(d/535); i++ {
|
||||
arm.Asm("")
|
||||
}
|
||||
}
|
||||
|
||||
func ticks() timeUnit {
|
||||
return 0 // TODO
|
||||
}
|
8
targets/bluepill.json
Обычный файл
8
targets/bluepill.json
Обычный файл
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"llvm-target": "armv7m-none-eabi",
|
||||
"build-tags": ["stm32", "stm32f103xx", "arm", "js", "wasm"],
|
||||
"linker": "arm-none-eabi-gcc",
|
||||
"pre-link-args": ["-nostdlib", "-nostartfiles", "-mcpu=cortex-m3", "-mthumb", "-T", "targets/stm32.ld", "-Wl,--gc-sections", "-fno-exceptions", "-fno-unwind-tables", "-ffunction-sections", "-fdata-sections", "-Os", "src/device/stm32/stm32f103xx.s"],
|
||||
"objcopy": "arm-none-eabi-objcopy",
|
||||
"flash": "openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c 'program {hex} reset exit'"
|
||||
}
|
10
targets/stm32.ld
Обычный файл
10
targets/stm32.ld
Обычный файл
|
@ -0,0 +1,10 @@
|
|||
|
||||
MEMORY
|
||||
{
|
||||
FLASH_TEXT (rw) : ORIGIN = 0x08000000, LENGTH = 64K
|
||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
||||
}
|
||||
|
||||
_stack_size = 2K;
|
||||
|
||||
INCLUDE "targets/arm.ld"
|
Загрузка…
Создание таблицы
Сослаться в новой задаче