From f2183c5dacb02d9a50833fba04b04002159941c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 12 Mar 2021 22:28:00 +0100 Subject: [PATCH] First test code for SK6812 LEDs --- firmware/Makefile | 4 +-- firmware/main.c | 27 +++++++++++++++------ firmware/setup/system_init.c | 28 +++++++++++++++++++-- firmware/sk6812.S | 47 ++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 11 deletions(-) create mode 100644 firmware/sk6812.S diff --git a/firmware/Makefile b/firmware/Makefile index 97717a2..4e927e5 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -12,7 +12,7 @@ endif #Add Files and Folders below######################################################### CFILES = main.c syscalls/syscalls.c setup/system_init.c startup/startup_stm32f0xx.c -ASFILES = +ASFILES = sk6812.S INCLUDEPATH = -Iinclude -Iinclude/cmsis OBJDIR=obj @@ -39,7 +39,7 @@ LFLAGS += -mfloat-abi=soft --disable-newlib-supplied-syscalls -nostartfiles LFLAGS += -Tstartup/stm32f030.ld -Wl,-Map=$(mapfile).map -Wl,--gc-sections -g CFLAGS = -c -fmessage-length=0 -mlittle-endian -mthumb -mcpu=cortex-m0 -mthumb-interwork -CFLAGS += -mfloat-abi=soft -nostartfiles -Wall -g +CFLAGS += -mfloat-abi=soft -nostartfiles -Wall -g -O3 #################################################################################### diff --git a/firmware/main.c b/firmware/main.c index c778c4a..3e04baf 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -1,19 +1,32 @@ #include - +#include unsigned int i = 0x12345678; unsigned char c = 2; -int main(void) { - RCC->AHBENR |= RCC_AHBENR_GPIOBEN; - GPIOB->MODER |= (1<<1*2); - GPIOB->ODR |= (1<<1); +extern void sk6812_send_led(uint32_t rgbw); + +volatile uint32_t wait_tick = 0; + +static void wait_for_ticks(uint32_t ticks) +{ + wait_tick = 0; + while (wait_tick < ticks); +} + +int main(void) +{ + RCC->AHBENR |= RCC_AHBENR_GPIOAEN; + GPIOA->MODER |= (1<<3*2); SysTick_Config(800000); while(1) { - i++; + __disable_irq(); + sk6812_send_led(0x000000FF); + __enable_irq(); + wait_for_ticks(30); } } void SysTick_Handler(void) { - GPIOB->ODR ^= (1<<1); + wait_tick++; } diff --git a/firmware/setup/system_init.c b/firmware/setup/system_init.c index 380e59f..c06d710 100644 --- a/firmware/setup/system_init.c +++ b/firmware/setup/system_init.c @@ -61,10 +61,34 @@ static void __init_default_clocks(void) RCC->CIR = 0x00000000; } +void __setup_clocks(void) +{ + uint32_t tmp; + + /* TODO: Switch HSE on for better accuracy */ + + /* Switch PLL source to HSI OSC */ + RCC->CFGR &= ~RCC_CFGR_PLLSRC; + + /* Set PLL multiplication to 12 (4 MHz * 12 = 48 MHz SysClk) */ + RCC->CFGR |= RCC_CFGR_PLLMUL_3 | RCC_CFGR_PLLMUL_1; + + /* HSI Already running. Switch on PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait for PLL to be ready */ + while (!(RCC->CR & RCC_CR_PLLRDY)); + + /* Switch System Clock to PLL */ + tmp = RCC->CFGR; + tmp &= ~0x3; + tmp |= RCC_CFGR_SW_1; + RCC->CFGR = tmp; +} void __system_init(void) { - __init_default_clocks(); - + __init_default_clocks(); + __setup_clocks(); } diff --git a/firmware/sk6812.S b/firmware/sk6812.S new file mode 100644 index 0000000..9dd764d --- /dev/null +++ b/firmware/sk6812.S @@ -0,0 +1,47 @@ +.global sk6812_send_led + +.equ BSRR_REGISTER, 0x48000018 +.equ PINNUM, 3 +.syntax unified + +sk6812_send_led: + push {lr} + push {r4, r5, r6} + ldr r1, =BSRR_REGISTER + ldr r2, =(1<