diff --git a/ch32v003fun/ch32v003fun.h b/ch32v003fun/ch32v003fun.h
index ca69c05f735ed29d81dabaa0bce5c49887cd48d3..aecc9d880fa5fcb230eedca872a65c8782b6d4fd 100644
--- a/ch32v003fun/ch32v003fun.h
+++ b/ch32v003fun/ch32v003fun.h
@@ -59,6 +59,13 @@
 #define FUNCONF_DEBUGPRINTF_TIMEOUT 160000 // Arbitrary time units
 */
 
+// Sanity check for when porting old code.
+#if defined(CH32V10x) || defined(CH32V20x) || defined(CH32V30x)
+	#if defined(CH32V003)
+		#error Cannot define CH32V003 and another arch.
+	#endif
+#endif
+
 #if !defined(FUNCONF_USE_DEBUGPRINTF) && !defined(FUNCONF_USE_UARTPRINTF)
 	#define FUNCONF_USE_DEBUGPRINTF 1
 #endif
@@ -12361,8 +12368,13 @@ void DefaultIRQHandler( void ) __attribute__((section(".text.vector_handler")))
 #endif
 
 // For debug writing to the debug interface.
-#define DMDATA0 ((volatile uint32_t*)0xe00000f4)
-#define DMDATA1 ((volatile uint32_t*)0xe00000f8)
+#if defined(CH32V003)
+	#define DMDATA0 ((volatile uint32_t*)0xe00000f4)
+	#define DMDATA1 ((volatile uint32_t*)0xe00000f8)
+#else
+	#define DMDATA0 ((volatile uint32_t*)0xe0000380)
+	#define DMDATA1 ((volatile uint32_t*)0xe0000384)
+#endif
 
 #endif
 
diff --git a/ch32v003fun/ch32v003fun.mk b/ch32v003fun/ch32v003fun.mk
index a29c248a3af52f50b87e299658c1689d44748bec..4de9c1966b7ef3661fc325d1d54054c6f76369b8 100644
--- a/ch32v003fun/ch32v003fun.mk
+++ b/ch32v003fun/ch32v003fun.mk
@@ -17,45 +17,136 @@ MINICHLINK?=$(CH32V003FUN)/../minichlink
 WRITE_SECTION?=flash
 SYSTEM_C?=$(CH32V003FUN)/ch32v003fun.c
 
-ifeq ($(TARGET_MCU),CH32V003)
-	CFLAGS+= \
-		-g -Os -flto -ffunction-sections -fdata-sections \
-		-static-libgcc \
-		-march=rv32ec \
-		-mabi=ilp32e \
-		-I/usr/include/newlib \
-		-I$(CH32V003FUN)/../extralibs \
-		-I$(CH32V003FUN) \
-		-nostdlib \
-		-DCH32V003=1 \
-		-I. -Wall
+CFLAGS?=-g -Os -flto -ffunction-sections -fdata-sections
 
+ifeq ($(TARGET_MCU),CH32V003)
+	CFLAGS_ARCH+=-march=rv32ec -mabi=ilp32e -DCH32V003=1
 	GENERATED_LD_FILE?=$(CH32V003FUN)/generated_ch32v003.ld
 	TARGET_MCU_LD:=0
 	LINKER_SCRIPT?=$(GENERATED_LD_FILE)
 	LDFLAGS+=-L$(CH32V003FUN)/../misc -lgcc
 else
-	ifeq ($(findstring CH32V10,$(TARGET_MCU)),CH32V10)
-		include $(CH32V003FUN)/ch32v10xfun.mk
-	else ifeq ($(findstring CH32V20,$(TARGET_MCU)),CH32V20)
-		include $(CH32V003FUN)/ch32v20xfun.mk
-	else ifeq ($(findstring CH32V30,$(TARGET_MCU)),CH32V30)
-		include $(CH32V003FUN)/ch32v30xfun.mk
+	MCU_PACKAGE?=1
+
+	ifeq ($(findstring CH32V10,$(TARGET_MCU)),CH32V10) # CH32V103
+		TARGET_MCU_PACKAGE?=CH32V103R8T6
+		CFLAGS_ARCH+=	-march=rv32imac \
+			-mabi=ilp32 \
+			-fmessage-length=0 \
+			-msmall-data-limit=8 \
+			-mno-save-restore \
+			-DCH32V10x=1
+
+		# MCU Flash/RAM split
+		ifeq ($(findstring R8, $(TARGET_MCU_PACKAGE)), R8)
+			MCU_PACKAGE:=1
+		else ifeq ($(findstring C8, $(TARGET_MCU_PACKAGE)), C8)
+			MCU_PACKAGE:=1
+		else ifeq ($(findstring C6, $(TARGET_MCU_PACKAGE)), C6)
+			MCU_PACKAGE:=2
+		endif
+
+		TARGET_MCU_LD:=1
+	else ifeq ($(findstring CH32V20,$(TARGET_MCU)),CH32V20) # CH32V203
+		TARGET_MCU_PACKAGE?=CH32V203F8P6
+		CFLAGS_ARCH+=	-march=rv32imac \
+			-mabi=ilp32 \
+			-fmessage-length=0 \
+			-msmall-data-limit=8 \
+			-mno-save-restore \
+			-DCH32V20x=1
+
+		# MCU Flash/RAM split
+		ifeq ($(findstring F8, $(TARGET_MCU_PACKAGE)), F8)
+			MCU_PACKAGE:=1
+		else ifeq ($(findstring G8, $(TARGET_MCU_PACKAGE)), G8)
+			MCU_PACKAGE:=1
+		else ifeq ($(findstring K8, $(TARGET_MCU_PACKAGE)), K8)
+			MCU_PACKAGE:=1
+		else ifeq ($(findstring C8, $(TARGET_MCU_PACKAGE)), C8)
+			MCU_PACKAGE:=1
+		else ifeq ($(findstring F6, $(TARGET_MCU_PACKAGE)), F6)
+			MCU_PACKAGE:=2
+		else ifeq ($(findstring G6, $(TARGET_MCU_PACKAGE)), G6)
+			MCU_PACKAGE:=2
+		else ifeq ($(findstring K6, $(TARGET_MCU_PACKAGE)), K6)
+			MCU_PACKAGE:=2
+		else ifeq ($(findstring C6, $(TARGET_MCU_PACKAGE)), C6)
+			MCU_PACKAGE:=2
+		else ifeq ($(findstring RB, $(TARGET_MCU_PACKAGE)), RB)
+			MCU_PACKAGE:=3
+		else ifeq ($(findstring GB, $(TARGET_MCU_PACKAGE)), GB)
+			MCU_PACKAGE:=3
+		else ifeq ($(findstring CB, $(TARGET_MCU_PACKAGE)), CB)
+			MCU_PACKAGE:=3
+		else ifeq ($(findstring WB, $(TARGET_MCU_PACKAGE)), WB)
+			MCU_PACKAGE:=3
+		endif
+
+		# Package
+		ifeq ($(findstring 203RB, $(TARGET_MCU_PACKAGE)), 203RB)
+			CFLAGS+=-DCH32V20x_D8
+		else ifeq ($(findstring 208, $(TARGET_MCU_PACKAGE)), 208)
+			CFLAGS+=-DCH32V20x_D8W
+		else
+			CFLAGS+=-DCH32V20x_D6
+		endif
+
+		TARGET_MCU_LD:=2
+	else ifeq ($(findstring CH32V30,$(TARGET_MCU)),CH32V30) #CH32V307
+		TARGET_MCU_PACKAGE?=CH32V307VCT6
+		MCU_PACKAGE?=1
+
+		CFLAGS_ARCH+= -march=rv32imafc \
+			-mabi=ilp32f \
+			-msmall-data-limit=8 \
+			-mno-save-restore \
+			-fmessage-length=0 \
+			-DCH32V30x=1
+
+		# MCU Flash/RAM split
+		ifeq ($(findstring RC, $(TARGET_MCU_PACKAGE)), RC)
+			MCU_PACKAGE:=1
+		else ifeq ($(findstring VC, $(TARGET_MCU_PACKAGE)), VC)
+			MCU_PACKAGE:=1
+		else ifeq ($(findstring WC, $(TARGET_MCU_PACKAGE)), WC)
+			MCU_PACKAGE:=1
+		else ifeq ($(findstring CB, $(TARGET_MCU_PACKAGE)), CB)
+			MCU_PACKAGE:=2
+		else ifeq ($(findstring FB, $(TARGET_MCU_PACKAGE)), FB)
+			MCU_PACKAGE:=2
+		else ifeq ($(findstring RB, $(TARGET_MCU_PACKAGE)), RB)
+			MCU_PACKAGE:=2
+		endif
+
+		# Package
+		ifeq ($(findstring 303, $(TARGET_MCU_PACKAGE)), 303)
+			CFLAGS+=-DCH32V30x_D8
+		else
+			CFLAGS+=-DCH32V30x_D8C
+		endif
+
+		TARGET_MCU_LD:=3
 	else
 		$(error Unknown MCU $(TARGET_MCU))
 	endif
+
+	LDFLAGS+=-lgcc
+	GENERATED_LD_FILE:=$(CH32V003FUN)/generated_$(TARGET_MCU_PACKAGE).ld
+	LINKER_SCRIPT:=$(GENERATED_LD_FILE)
 endif
 
-CFLAGS+= $(EXTRA_CFLAGS)
+CFLAGS+= \
+	$(CFLAGS_ARCH) -static-libgcc \
+	-I/usr/include/newlib \
+	-I$(CH32V003FUN)/../extralibs \
+	-I$(CH32V003FUN) \
+	-nostdlib \
+	-I. -Wall $(EXTRA_CFLAGS)
 
 LDFLAGS+=-T $(LINKER_SCRIPT) -Wl,--gc-sections
-
-ifeq ($(TARGET_MCU), CH32V003)
-
 FILES_TO_COMPILE:=$(SYSTEM_C) $(TARGET).$(TARGET_EXT) $(ADDITIONAL_C_FILES) 
 
-endif
-
 $(TARGET).bin : $(TARGET).elf
 	$(PREFIX)-size $^
 	$(PREFIX)-objdump -S $^ > $(TARGET).lst
diff --git a/ch32v003fun/ch32v10xfun.mk b/ch32v003fun/ch32v10xfun.mk
deleted file mode 100644
index 94bf13ba296e789aa9492952590fe5a7033b2c2d..0000000000000000000000000000000000000000
--- a/ch32v003fun/ch32v10xfun.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-TARGET_MCU_PACKAGE?=CH32V103R8T6
-MCU_PACKAGE?=1
-
-CFLAGS+= \
-	-g -Os -flto -ffunction-sections -fdata-sections \
-	-static-libgcc \
-	-march=rv32imac \
-	-mabi=ilp32 \
-	-msmall-data-limit=8 \
-	-mno-save-restore \
-	-fmessage-length=0 \
-	-fsigned-char \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-DCH32V10x=1 \
-	-I. -Wall
-
-# MCU Flash/RAM split
-ifeq ($(findstring R8, $(TARGET_MCU_PACKAGE)), R8)
-	MCU_PACKAGE:=1
-else ifeq ($(findstring C8, $(TARGET_MCU_PACKAGE)), C8)
-	MCU_PACKAGE:=1
-else ifeq ($(findstring C6, $(TARGET_MCU_PACKAGE)), C6)
-	MCU_PACKAGE:=2
-endif
-
-TARGET_MCU_LD:=1
-LDFLAGS+=-lgcc
-
-GENERATED_LD_FILE:=$(CH32V003FUN)/generated_$(TARGET_MCU_PACKAGE).ld
-LINKER_SCRIPT:=$(GENERATED_LD_FILE)
-FILES_TO_COMPILE:=$(SYSTEM_C) $(TARGET).$(TARGET_EXT) $(ADDITIONAL_C_FILES)
-
diff --git a/ch32v003fun/ch32v20xfun.mk b/ch32v003fun/ch32v20xfun.mk
deleted file mode 100644
index 012dcc995bb43bbd756b595f8011cbac4bc4c5e9..0000000000000000000000000000000000000000
--- a/ch32v003fun/ch32v20xfun.mk
+++ /dev/null
@@ -1,62 +0,0 @@
-TARGET_MCU_PACKAGE?=CH32V203F8P6
-MCU_PACKAGE?=1
-
-CFLAGS+= \
-	-g -Os -flto -ffunction-sections -fdata-sections \
-	-static-libgcc \
-	-march=rv32imac \
-	-mabi=ilp32 \
-	-msmall-data-limit=8 \
-	-mno-save-restore \
-	-fmessage-length=0 \
-	-fsigned-char \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-DCH32V20x=1 \
-	-I. -Wall
-
-# MCU Flash/RAM split
-ifeq ($(findstring F8, $(TARGET_MCU_PACKAGE)), F8)
-	MCU_PACKAGE:=1
-else ifeq ($(findstring G8, $(TARGET_MCU_PACKAGE)), G8)
-	MCU_PACKAGE:=1
-else ifeq ($(findstring K8, $(TARGET_MCU_PACKAGE)), K8)
-	MCU_PACKAGE:=1
-else ifeq ($(findstring C8, $(TARGET_MCU_PACKAGE)), C8)
-	MCU_PACKAGE:=1
-else ifeq ($(findstring F6, $(TARGET_MCU_PACKAGE)), F6)
-	MCU_PACKAGE:=2
-else ifeq ($(findstring G6, $(TARGET_MCU_PACKAGE)), G6)
-	MCU_PACKAGE:=2
-else ifeq ($(findstring K6, $(TARGET_MCU_PACKAGE)), K6)
-	MCU_PACKAGE:=2
-else ifeq ($(findstring C6, $(TARGET_MCU_PACKAGE)), C6)
-	MCU_PACKAGE:=2
-else ifeq ($(findstring RB, $(TARGET_MCU_PACKAGE)), RB)
-	MCU_PACKAGE:=3
-else ifeq ($(findstring GB, $(TARGET_MCU_PACKAGE)), GB)
-    MCU_PACKAGE:=3
-else ifeq ($(findstring CB, $(TARGET_MCU_PACKAGE)), CB)
-    MCU_PACKAGE:=3
-else ifeq ($(findstring WB, $(TARGET_MCU_PACKAGE)), WB)
-    MCU_PACKAGE:=3
-endif
-
-# Package
-ifeq ($(findstring 203RB, $(TARGET_MCU_PACKAGE)), 203RB)
-	CFLAGS+=-DCH32V20x_D8
-else ifeq ($(findstring 208, $(TARGET_MCU_PACKAGE)), 208)
-	CFLAGS+=-DCH32V20x_D8W
-else
-	CFLAGS+=-DCH32V20x_D6
-endif
-
-TARGET_MCU_LD:=2
-LDFLAGS+=-lgcc
-
-GENERATED_LD_FILE:=$(CH32V003FUN)/generated_$(TARGET_MCU_PACKAGE).ld
-LINKER_SCRIPT:=$(GENERATED_LD_FILE)
-FILES_TO_COMPILE:=$(SYSTEM_C) $(TARGET).$(TARGET_EXT) $(ADDITIONAL_C_FILES)
-
-
diff --git a/ch32v003fun/ch32v30xfun.mk b/ch32v003fun/ch32v30xfun.mk
deleted file mode 100644
index eeab434437716f73af44ede973594b2e187942f5..0000000000000000000000000000000000000000
--- a/ch32v003fun/ch32v30xfun.mk
+++ /dev/null
@@ -1,47 +0,0 @@
-TARGET_MCU_PACKAGE?=CH32V307VCT6
-MCU_PACKAGE?=1
-
-CFLAGS+= \
-	-g -Os -flto -ffunction-sections -fdata-sections \
-	-static-libgcc \
-	-march=rv32imafc \
-	-mabi=ilp32f \
-	-msmall-data-limit=8 \
-	-mno-save-restore \
-	-fmessage-length=0 \
-	-fsigned-char \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-DCH32V30x=1 \
-	-I. -Wall
-
-# MCU Flash/RAM split
-ifeq ($(findstring RC, $(TARGET_MCU_PACKAGE)), RC)
-	MCU_PACKAGE:=1
-else ifeq ($(findstring VC, $(TARGET_MCU_PACKAGE)), VC)
-	MCU_PACKAGE:=1
-else ifeq ($(findstring WC, $(TARGET_MCU_PACKAGE)), WC)
-	MCU_PACKAGE:=1
-else ifeq ($(findstring CB, $(TARGET_MCU_PACKAGE)), CB)
-	MCU_PACKAGE:=2
-else ifeq ($(findstring FB, $(TARGET_MCU_PACKAGE)), FB)
-	MCU_PACKAGE:=2
-else ifeq ($(findstring RB, $(TARGET_MCU_PACKAGE)), RB)
-	MCU_PACKAGE:=2
-endif
-
-# Package
-ifeq ($(findstring 303, $(TARGET_MCU_PACKAGE)), 303)
-	CFLAGS+=-DCH32V30x_D8
-else
-	CFLAGS+=-DCH32V30x_D8C
-endif
-
-TARGET_MCU_LD:=3
-LDFLAGS+=-lgcc
-
-GENERATED_LD_FILE:=$(CH32V003FUN)/generated_$(TARGET_MCU_PACKAGE).ld
-LINKER_SCRIPT:=$(GENERATED_LD_FILE)
-FILES_TO_COMPILE:=$(SYSTEM_C) $(TARGET).$(TARGET_EXT) $(ADDITIONAL_C_FILES)
-
diff --git a/examples_v20x/debugprintfdemo/Makefile b/examples_v20x/debugprintfdemo/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..555e4588a3165fc5b0c3d665712a9b961d788314
--- /dev/null
+++ b/examples_v20x/debugprintfdemo/Makefile
@@ -0,0 +1,10 @@
+all : flash
+
+TARGET:=debugprintfdemo
+TARGET_MCU:=CH32V203
+
+include ../../ch32v003fun/ch32v003fun.mk
+
+flash : cv_flash
+clean : cv_clean
+
diff --git a/examples_v20x/debugprintfdemo/debugprintfdemo.c b/examples_v20x/debugprintfdemo/debugprintfdemo.c
new file mode 100644
index 0000000000000000000000000000000000000000..c004008338ed6ee2f68892407a63f1b8c9602e47
--- /dev/null
+++ b/examples_v20x/debugprintfdemo/debugprintfdemo.c
@@ -0,0 +1,46 @@
+/* Small example showing how to use the SWIO programming pin to 
+   do printf through the debug interface */
+
+#include "ch32v003fun.h"
+#include <stdio.h>
+
+uint32_t count;
+
+int last = 0;
+void handle_debug_input( int numbytes, uint8_t * data )
+{
+	last = data[0];
+	count += numbytes;
+}
+
+int main()
+{
+	SystemInit();
+
+	// Enable GPIOs
+	RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC;
+
+	// GPIO D0 Push-Pull
+	GPIOD->CFGLR &= ~(0xf<<(4*0));
+	GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*0);
+
+	// GPIO C0 Push-Pull
+	GPIOC->CFGLR &= ~(0xf<<(4*0));
+	GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*0);
+
+	while(1)
+	{
+		GPIOD->BSHR = 1;	 // Turn on GPIOs
+		GPIOC->BSHR = 1;
+		printf( "+%lu\n", count++ );
+		Delay_Ms(100);
+		int i;
+		for( i = 0; i < 10000; i++ )
+			poll_input();
+		GPIOD->BSHR = (1<<16); // Turn off GPIODs
+		GPIOC->BSHR = (1<<16);
+		printf( "-%lu[%c]\n", count++, last );
+		Delay_Ms(100);
+	}
+}
+
diff --git a/examples_v20x/debugprintfdemo/funconfig.h b/examples_v20x/debugprintfdemo/funconfig.h
new file mode 100644
index 0000000000000000000000000000000000000000..a8a70b30cc8ba3115935c2140704b1a6ab83ebd2
--- /dev/null
+++ b/examples_v20x/debugprintfdemo/funconfig.h
@@ -0,0 +1,9 @@
+#ifndef _FUNCONFIG_H
+#define _FUNCONFIG_H
+
+// Though this should be on by default we can extra force it on.
+#define FUNCONF_USE_DEBUGPRINTF 1
+#define FUNCONF_DEBUGPRINTF_TIMEOUT (1<<31) // Wait for a very very long time.
+
+#endif
+