diff --git a/sandbox/Makefile b/sandbox/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d2b36751fe171222b44bd0f24a822157a39d9cca --- /dev/null +++ b/sandbox/Makefile @@ -0,0 +1,41 @@ +TARGET:=sandbox + +all : flash + +PREFIX:=riscv64-unknown-elf + +GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User + +EVT:=../ch32v003evt + +CFLAGS:= \ + -g -Os -flto -ffunction-sections \ + -static-libgcc -lgcc \ + -march=rv32ec \ + -mabi=ilp32e \ + -I/usr/include/newlib \ + -I$(EVT) \ + -nostdlib \ + -I. + +LDFLAGS:=-T $(EVT)/ch32v003.ld -Wl,--gc-sections + +SYSTEM_C:=$(EVT)/startup_ch32v00x.S $(EVT)/embedlibc.c + +$(TARGET).elf : $(TARGET).c $(SYSTEM_C) + $(PREFIX)-gcc -o $@ $^ $(CFLAGS) $(LDFLAGS) + +$(TARGET).bin : $(TARGET).elf + $(PREFIX)-size $^ + $(PREFIX)-objdump -S $^ > $(TARGET).lst + $(PREFIX)-objdump -t $^ > $(TARGET).map + $(PREFIX)-objcopy -O binary $< $(TARGET).bin + $(PREFIX)-objcopy -O ihex $< $(TARGET).hex + +flash : $(TARGET).bin + make -C ../minichlink all + ../minichlink/minichlink -w $< -r + +clean : + rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex + diff --git a/sandbox/sandbox.c b/sandbox/sandbox.c new file mode 100644 index 0000000000000000000000000000000000000000..d2a92cf91437ae191c48f70e48bcfea232b44593 --- /dev/null +++ b/sandbox/sandbox.c @@ -0,0 +1,66 @@ +// Could be defined here, or in the processor defines. +#define SYSTEM_CORE_CLOCK 48000000 + +#include "ch32v00x.h" +#include <stdio.h> + +#define APB_CLOCK SYSTEM_CORE_CLOCK + +void SystemInit(void) +{ + // Values lifted from the EVT. There is little to no documentation on what this does. + RCC->CTLR |= (uint32_t)0x00000001; + RCC->CFGR0 &= (uint32_t)0xFCFF0000; + RCC->CTLR &= (uint32_t)0xFEF6FFFF; + RCC->CTLR &= (uint32_t)0xFFFBFFFF; + RCC->CFGR0 &= (uint32_t)0xFFFEFFFF; + RCC->INTR = 0x009F0000; + + // From SetSysClockTo_48MHZ_HSI + // This is some dark stuff. But, I copy-pasted it and it seems towork. + FLASH->ACTLR = (FLASH->ACTLR & ((uint32_t)~FLASH_ACTLR_LATENCY)) | FLASH_ACTLR_LATENCY_1; // Flash 0 wait state + RCC->CFGR0 = ( RCC->CFGR0 & ((uint32_t)~(RCC_PLLSRC)) ) | (uint32_t)(RCC_PLLSRC_HSI_Mul2); // PLL configuration: PLLCLK = HSI * 2 = 48 MHz + RCC->CTLR |= RCC_PLLON; // Enable PLL + while((RCC->CTLR & RCC_PLLRDY) == 0); // Wait till PLL is ready + RCC->CFGR0 = ( RCC->CFGR0 & ((uint32_t)~(RCC_SW))) | (uint32_t)RCC_SW_PLL; // Select PLL as system clock source + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source + + +} + +int main() +{ + + // PLL + Prescale down ADC +// RCC->CFGR0 = RCC_SW_PLL | RCC_SWS_PLL | RCC_ADCPRE_DIV8; +// RCC->CTLR = RCC_PLLON | RCC_HSION | 0xff00; +// RCC->CTLR = RCC_PLLON | RCC_HSION | 0xff00; + + // wow, it seems we + RCC->CTLR = RCC_PLLON | RCC_HSION | 0xf8; + + // Enable GPIOD. + RCC->APB2PCENR |= RCC_APB2Periph_GPIOD; + + // GPIO D0 Push-Pull, 10MHz Output + GPIOD->CFGLR &= ~(0xf<<(4*0)); + GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*0); + + // Testing with reset + GPIOD->CFGLR &= ~(0xf<<(4*7)); + GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*7); + + // Testing with PD6 + GPIOD->CFGLR &= ~(0xf<<(4*6)); + GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*6); + + while(1) + { + GPIOD->BSHR = 128+64+1; + GPIOD->BSHR = 1<<16; + GPIOD->BSHR = 1; + GPIOD->BSHR = 1<<16; + GPIOD->BSHR = 1; + GPIOD->BSHR = (128+64+1)<<16; + } +}