diff --git a/ch32v003fun/ch32v003fun.c b/ch32v003fun/ch32v003fun.c
index 998632aa95c4d00e4085a652f09ea31003e8c4e7..c6582da496051cced0e982073ad7dbe866419013 100644
--- a/ch32v003fun/ch32v003fun.c
+++ b/ch32v003fun/ch32v003fun.c
@@ -1424,7 +1424,7 @@ void SystemInit()
 		EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;
 	#endif
 	#if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL
-		RCC->CFGR0 = RCC_HPRE_DIV1 | PLL_MULTIPLICATION;
+		RCC->CFGR0 = BASE_CFGR0;
 		RCC->CTLR  = BASE_CTLR | RCC_HSION | RCC_PLLON; 			// Use HSI, enable PLL.
 	#else
 		RCC->CFGR0 = RCC_HPRE_DIV1;                               	// PLLCLK = HCLK = SYSCLK = APB1
diff --git a/ch32v003fun/ch32v003fun.h b/ch32v003fun/ch32v003fun.h
index 09a220657fc5db55323cb4f3b7901e891a872ff1..c6e20704e4ecfe70a299034dbdda5bb782522519 100644
--- a/ch32v003fun/ch32v003fun.h
+++ b/ch32v003fun/ch32v003fun.h
@@ -5,6 +5,35 @@
 
 #include "funconfig.h"
 
+/*****************************************************************************
+	CH32V003 BASICS
+
+	1. Be sure to see configuration section below!
+
+	2. Backend Initialization
+		SystemInit();
+
+	3. Arduino-like I/O
+		funGpioInitAll();
+		funPinMode( PA2, GPIO_CFGLR_OUT_10Mhz_PP );
+		funDigitalWrite( PA2, FUN_HIGH );
+		funDigitalWrite( PA2, FUN_HIGH );
+
+	4. Delays
+		Delay_Us(n)
+		Delay_Ms(n)
+		DelaySysTick( uint32_t n );
+
+	5. printf
+		printf, _write may be semihosted, or printed to UART.
+
+		poll_input, handle_debug_input may be used with semihsoting.
+
+		Note: Semihosting appears to currently only work on the CH32V003 (may be improved in future)
+*/
+
+
+
 /*****************************************************************************
 	CH32V003 Fun Configs:
 
diff --git a/ch32v003fun/ch32v003fun.ld b/ch32v003fun/ch32v003fun.ld
index 108cdc9a4d87aa7f7a4fbb8a025c0e025cc36c51..c05071e2ada788b4533d19785be284211b3a2f1a 100644
--- a/ch32v003fun/ch32v003fun.ld
+++ b/ch32v003fun/ch32v003fun.ld
@@ -2,7 +2,10 @@ ENTRY( InterruptVector )
 
 MEMORY
 {
-#if TARGET_MCU == CH32V10x
+#if TARGET_MCU == CH32V003
+	FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16K
+	RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 2K
+#elif TARGET_MCU == CH32V10x
 	#if MCU_PACKAGE == 1
 		FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
 		RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
@@ -13,7 +16,6 @@ MEMORY
 		#error "Unknown MCU package"
 	#endif
 #elif TARGET_MCU == CH32V20x
-
 	#if MCU_PACKAGE == 1
 		FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
 		RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
@@ -37,9 +39,7 @@ MEMORY
 		#error "Unknown MCU package"
 	#endif
 #else
-	// CH32V003
-	FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16K
-	RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 2K
+	#error "Unknown MCU target"
 #endif
 }
 
diff --git a/ch32v003fun/ch32v003fun.mk b/ch32v003fun/ch32v003fun.mk
index f20e8203e2d1c8bee6a38f36211ae62c2825e3d1..d528ab58f672e0d98fc854f20418a99be24f03de 100644
--- a/ch32v003fun/ch32v003fun.mk
+++ b/ch32v003fun/ch32v003fun.mk
@@ -41,7 +41,8 @@ ifeq ($(TARGET_MCU),CH32V003)
 		-DCH32V003=1 \
 		-I. -Wall $(EXTRA_CFLAGS)
 
-	LINKER_SCRIPT?=$(CH32V003FUN)/ch32v003fun.ld
+	GENERATED_LD_FILE?=$(CH32V003FUN)/generated_ch32v003.ld
+	LINKER_SCRIPT?=$(GENERATED_LD_FILE)
 else
 	ifeq ($(findstring CH32V10,$(TARGET_MCU)),CH32V10)
 		include $(CH32V003FUN)/ch32v10xfun.mk
@@ -98,6 +99,10 @@ clangd_clean :
 
 FLASH_COMMAND?=$(MINICHLINK)/minichlink -w $< $(WRITE_SECTION) -b
 
+$(GENERATED_LD_FILE) :
+	$(PREFIX)-gcc -E -P -x c -DTARGET_MCU=CH32V003 $(CH32V003FUN)/ch32v003fun.ld > $(GENERATED_LD_FILE)
+
+
 cv_flash : $(TARGET).bin
 	make -C $(MINICHLINK) all
 	$(FLASH_COMMAND)
diff --git a/examples/blink/blink.bin b/examples/blink/blink.bin
index 9e1ae23d43b12cdfa77b0c77a9ed36f2df41a617..8bd2f2e5946493a5f584fc1bf7236b61a5d0fdd3 100755
Binary files a/examples/blink/blink.bin and b/examples/blink/blink.bin differ