diff --git a/ch32v003fun/ch32v003fun.mk b/ch32v003fun/ch32v003fun.mk
index 9cadeaa7cf834c4f000330cc8017d16ee02ee0fd..6803839b3508a5f093bb26e330f178536909b241 100644
--- a/ch32v003fun/ch32v003fun.mk
+++ b/ch32v003fun/ch32v003fun.mk
@@ -4,7 +4,7 @@ PREFIX:=riscv64-unknown-elf
 CH32V003FUN:=../../ch32v003fun
 MINICHLINK:=../../minichlink
 
-CFLAGS:= \
+CFLAGS+= \
 	-g -Os -flto -ffunction-sections \
 	-static-libgcc \
 	-march=rv32ec \
@@ -14,11 +14,11 @@ CFLAGS:= \
 	-nostdlib \
 	-I. -Wall
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+LDFLAGS+=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
 
 SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
 
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).c
+$(TARGET).elf : $(SYSTEM_C) $(TARGET).c $(ADDITIONAL_C_FILES)
 	$(PREFIX)-gcc -o $@ $^ $(CFLAGS) $(LDFLAGS)
 
 $(TARGET).bin : $(TARGET).elf
diff --git a/examples/GPIO/Makefile b/examples/GPIO/Makefile
index 15a92ee8541c73eff2eee710a57b721a6b032c6b..c7ee56af8f0e1a752e2d4d563b88c50cd0424887 100644
--- a/examples/GPIO/Makefile
+++ b/examples/GPIO/Makefile
@@ -1,43 +1,11 @@
 TARGET:=GPIO
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-EVT:=../../ch32v003evt
-
-MINICHLINK:=../../minichlink
-CH32V003FUN:=../../ch32v003fun
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DTINYVECTOR -Wall
+CFLAGS+=-DTINYVECTOR
+ADDITIONAL_C_FILES+=wiring.c
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).c wiring.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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/GPIO_analogRead/Makefile b/examples/GPIO_analogRead/Makefile
index c655dc1fa4c9a43364dafc5d98363fae1c15c418..ff995e67083d41ad07499576da97746201271b1f 100644
--- a/examples/GPIO_analogRead/Makefile
+++ b/examples/GPIO_analogRead/Makefile
@@ -1,43 +1,11 @@
 TARGET:=GPIO_analogRead
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-EVT:=../../ch32v003evt
-
-MINICHLINK:=../../minichlink
-CH32V003FUN:=../../ch32v003fun
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DTINYVECTOR -Wall
+CFLAGS+=-DTINYVECTOR
+ADDITIONAL_C_FILES+=wiring.c
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).c wiring.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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/MCOtest/Makefile b/examples/MCOtest/Makefile
index 2625e618eb8f72b48506a3ba12031c03cec2ac58..2cdcdbfd17e0c0c2fe66ea47c189d5ed61aff536 100644
--- a/examples/MCOtest/Makefile
+++ b/examples/MCOtest/Makefile
@@ -1,51 +1,10 @@
 TARGET:=MCOtest
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-EVT:=../../ch32v003evt
-
-MINICHLINK:=../../minichlink
-
-ifeq ($(OS),Windows_NT)
-# On Windows, all the major RISC-V GCC installs are missing the -ec libgcc.
-LIB_GCC=../../misc/libgcc.a
-else
-LIB_GCC=-lgcc
-endif
-
-CH32V003FUN:=../../ch32v003fun
+CFLAGS+=-DTINYVECTOR -DSTDOUT_UART
 
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc $(LIB_GCC) \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DSTDOUT_UART -DTINYVECTOR -Wall
+include ../../ch32v003fun/ch32v003fun.mk
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections
-
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/adc_dma_opamp/Makefile b/examples/adc_dma_opamp/Makefile
index ac00c743ffd45a07a1f1f1361a0ee32df0419e1b..acbb935a099a3cc0df772edda761e88cf6f7aeed 100644
--- a/examples/adc_dma_opamp/Makefile
+++ b/examples/adc_dma_opamp/Makefile
@@ -1,41 +1,9 @@
 TARGET:=adc_dma_opamp
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DSTDOUT_UART -Wall
+include ../../ch32v003fun/ch32v003fun.mk
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
-
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
+all : flash
+flash : cv_flash
+clean : cv_clean
 
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
 
diff --git a/examples/adc_dma_opamp/adc_dma_opamp.c b/examples/adc_dma_opamp/adc_dma_opamp.c
index 0e7889ca256df8b39cd7aa968635c04a004f1dc0..cb3d6a3b50b87dd3922f669080f090ba4e21dd4f 100644
--- a/examples/adc_dma_opamp/adc_dma_opamp.c
+++ b/examples/adc_dma_opamp/adc_dma_opamp.c
@@ -51,9 +51,9 @@ int main()
 	printf("looping...\n\r");
 	while(1)
 	{
-		GPIOC->BSHR = (1<<1);	 // Turn on GPIOs
+		GPIOC->BSHR = 1<<1;	 // Turn on GPIOs
 		Delay_Ms( 100 );
-		GPIOC->BSHR = (1<<1+16); // Turn off GPIODs
+		GPIOC->BSHR = 1<<(1+16); // Turn off GPIODs
 		Delay_Ms( 100 );
 		printf( "%4d %4d ", adc_buffer[0], adc_buffer[1]);
 		printf( "%4d %4d\n\r", adc_buffer[2], adc_buffer[3]);
diff --git a/examples/adc_polled/Makefile b/examples/adc_polled/Makefile
index ae735e683a7a7507587c7fcd91da3ce9f35088e7..0a4ea74980b737226422795be13e88cdb8f62611 100644
--- a/examples/adc_polled/Makefile
+++ b/examples/adc_polled/Makefile
@@ -1,41 +1,9 @@
 TARGET:=adc_polled
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DSTDOUT_UART -Wall
+include ../../ch32v003fun/ch32v003fun.mk
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
-
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
+all : flash
+flash : cv_flash
+clean : cv_clean
 
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
 
diff --git a/examples/blink/Makefile b/examples/blink/Makefile
index 4acaf267305e5c2c9e077040e92a05bea9a21b7e..63f7ff0d6546009ea3592fbe7ffc93a099c4ec6b 100644
--- a/examples/blink/Makefile
+++ b/examples/blink/Makefile
@@ -1,43 +1,9 @@
 TARGET:=blink
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-EVT:=../../ch32v003evt
-
-MINICHLINK:=../../minichlink
-CH32V003FUN:=../../ch32v003fun
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DTINYVECTOR -Wall
+include ../../ch32v003fun/ch32v003fun.mk
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
-
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
+all : flash
+flash : cv_flash
+clean : cv_clean
 
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
 
diff --git a/examples/blink/blink.bin b/examples/blink/blink.bin
index f4a7fa56e5eb064927ec95f85687b82ff2dc8db8..b0cf5a4fa20b888e4185c78fd1a5230786bc2059 100755
Binary files a/examples/blink/blink.bin and b/examples/blink/blink.bin differ
diff --git a/examples/bootload/Makefile b/examples/bootload/Makefile
index 7d681ec3852dcc0169c82839231df5ee5690550e..47ff5e054142a9735a36d0aac879ec149f0ecb28 100644
--- a/examples/bootload/Makefile
+++ b/examples/bootload/Makefile
@@ -1,43 +1,8 @@
 TARGET:=bootload
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-EVT:=../../ch32v003evt
-
-MINICHLINK:=../../minichlink
-CH32V003FUN:=../../ch32v003fun
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DCUSTOM_INTERRUPT_VECTOR
+include ../../ch32v003fun/ch32v003fun.mk
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun-bootloader.ld -Wl,--gc-sections -L../../misc -lgcc
-
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -h -U -w $< bootloader -B
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/debugprintfdemo/Makefile b/examples/debugprintfdemo/Makefile
index 01ae2f3754bfe67d3415ad6486d6bd7b61a83e7a..0e3fda68083465e8e241cbc9f15295257bb69104 100644
--- a/examples/debugprintfdemo/Makefile
+++ b/examples/debugprintfdemo/Makefile
@@ -1,46 +1,8 @@
 TARGET:=debugprintfdemo
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -Wall
-
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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 $< flash -b
-
-monitor : flash
-	$(MINICHLINK)/minichlink -T
-	
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/external_crystal/Makefile b/examples/external_crystal/Makefile
index 9ee7fc53f6559bc9ac71bf64c542ceed543cbfb0..a4a4b8dde6be39adbdc72873667d1d37f51ec1f6 100644
--- a/examples/external_crystal/Makefile
+++ b/examples/external_crystal/Makefile
@@ -1,43 +1,8 @@
 TARGET:=external_crystal
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-EVT:=../../ch32v003evt
-
-MINICHLINK:=../../minichlink
-CH32V003FUN:=../../ch32v003fun
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DTINYVECTOR -Wall
+include ../../ch32v003fun/ch32v003fun.mk
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
-
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/i2c_oled/Makefile b/examples/i2c_oled/Makefile
index da354686c13ef4bf598c161b2b4bbe803b2d99ae..2da3d040f9198403a7e306626b2d171c0c9373a7 100644
--- a/examples/i2c_oled/Makefile
+++ b/examples/i2c_oled/Makefile
@@ -1,41 +1,8 @@
 TARGET:=i2c_oled
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DSTDOUT_UART -Wall
-
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/optionbytes/Makefile b/examples/optionbytes/Makefile
index 1c2032c957c8082e16b953675dffbf0e337e62e9..fca3e40bdb68a5e920ab6ca6e26faeda7daa5e84 100644
--- a/examples/optionbytes/Makefile
+++ b/examples/optionbytes/Makefile
@@ -1,47 +1,10 @@
 TARGET:=optionbytes
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-EVT:=../../ch32v003evt
-
-MINICHLINK:=../../minichlink
-CH32V003FUN:=../../ch32v003fun
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DTINYVECTOR
-
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+CFLAGS+=-DTINYVECTOR
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
+include ../../ch32v003fun/ch32v003fun.mk
 
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-monitor : flash
-	$(MINICHLINK)/minichlink -T
-
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/run_from_ram/Makefile b/examples/run_from_ram/Makefile
index dd492af6c6231e3cfad208770d8bde0b96f96a7c..55db45e79ddf58b06a766e9c54a9d77f9fd4dd56 100644
--- a/examples/run_from_ram/Makefile
+++ b/examples/run_from_ram/Makefile
@@ -1,43 +1,10 @@
 TARGET:=run_from_ram
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-EVT:=../../ch32v003evt
-
-MINICHLINK:=../../minichlink
-CH32V003FUN:=../../ch32v003fun
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DTINYVECTOR -Wall
+CFLAGS+=-DTINYVECTOR
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/sandbox/Makefile b/examples/sandbox/Makefile
index e45f9822f64a9e7cb5bdcf2b7cff5eea59b4cd7c..13888334a4b45f7b0dcba5290227eced951d50bf 100644
--- a/examples/sandbox/Makefile
+++ b/examples/sandbox/Makefile
@@ -1,45 +1,8 @@
 TARGET:=sandbox
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -Wall
-
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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 $< flash -b
-
-monitor : flash
-	$(MINICHLINK)/minichlink -T
-	
+all : flash
+flash : cv_flash
+clean : cv_clean
 
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
diff --git a/examples/self_modify_code/Makefile b/examples/self_modify_code/Makefile
index abafa8a2c73fa7c91248a8beeb393994cec39a59..80c711c36e615c7c2618b51784f02e7c312ec70c 100644
--- a/examples/self_modify_code/Makefile
+++ b/examples/self_modify_code/Makefile
@@ -1,46 +1,8 @@
 TARGET:=self_modify_code
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -Wall
-
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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 $< flash -b
-
-monitor : flash
-	$(MINICHLINK)/minichlink -T
-	
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/spi_dac/Makefile b/examples/spi_dac/Makefile
index 0978583b8bd06cec951a805c6aa6dc4ca5e58d32..109146ea58aa15694cb0213829b9ccb8cf43ddf9 100644
--- a/examples/spi_dac/Makefile
+++ b/examples/spi_dac/Makefile
@@ -1,48 +1,8 @@
 TARGET:=spi_dac
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-ifeq ($(OS),Windows_NT)
-# On Windows, all the major RISC-V GCC installs are missing the -ec libgcc.
-LIB_GCC=../../misc/libgcc.a
-else
-LIB_GCC=-lgcc
-endif
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc $(LIB_GCC) \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DSTDOUT_UART -Wall
+include ../../ch32v003fun/ch32v003fun.mk
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections
-
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/systick_irq/Makefile b/examples/systick_irq/Makefile
index d8910e1af3c5bb2b1b2190683ccf197d01863650..c9c13def5aa9978795a523d8d019e17d54c3f4e3 100644
--- a/examples/systick_irq/Makefile
+++ b/examples/systick_irq/Makefile
@@ -1,41 +1,8 @@
 TARGET:=systick_irq
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DSTDOUT_UART -Wall
-
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/systick_irq_millis/Makefile b/examples/systick_irq_millis/Makefile
index 266cce9d08ec1b7132c81b4d3256f5218df1f44b..e2050f99840757d86a3defbca9effb5c2db38d24 100644
--- a/examples/systick_irq_millis/Makefile
+++ b/examples/systick_irq_millis/Makefile
@@ -1,41 +1,10 @@
 TARGET:=systick_irq_millis
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DSTDOUT_UART -Wall
+CFLAGS+=-DSTDOUT_UART
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/tim1_pwm/Makefile b/examples/tim1_pwm/Makefile
index 0aecad001ed074adb358ccef9c4252b83cc0fe11..eb2260d357364820cf4de8fcdb21fbdede7645c9 100644
--- a/examples/tim1_pwm/Makefile
+++ b/examples/tim1_pwm/Makefile
@@ -1,41 +1,10 @@
 TARGET:=tim1_pwm
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DSTDOUT_UART -Wall
+CFLAGS+=-DSTDOUT_UART
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/uartdemo/Makefile b/examples/uartdemo/Makefile
index 25b0efadffd3d5015fba6059a3a8c7a9437de357..d77dc2153005732a22f8adb9b3656c65ff9a01fd 100644
--- a/examples/uartdemo/Makefile
+++ b/examples/uartdemo/Makefile
@@ -1,41 +1,10 @@
 TARGET:=uartdemo
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -DSTDOUT_UART -Wall
+CFLAGS+=-DSTDOUT_UART
 
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+include ../../ch32v003fun/ch32v003fun.mk
 
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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
-	$(MINICHLINK)/minichlink -w $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+all : flash
+flash : cv_flash
+clean : cv_clean
 
diff --git a/examples/ws2812bdemo/Makefile b/examples/ws2812bdemo/Makefile
index c6af022ccd8361416768fe0a4f27e0fa2214cfaf..3c823287b90bca972df8988b6aebd343baaa16b5 100644
--- a/examples/ws2812bdemo/Makefile
+++ b/examples/ws2812bdemo/Makefile
@@ -1,40 +1,7 @@
-TARGET:=ws2812bdemo
+TARGET:= ws2812bdemo
 
-all : flash
-
-PREFIX:=riscv64-unknown-elf
-
-CH32V003FUN:=../../ch32v003fun
-MINICHLINK:=../../minichlink
-
-CFLAGS:= \
-	-g -Os -flto -ffunction-sections \
-	-static-libgcc \
-	-march=rv32ec \
-	-mabi=ilp32e \
-	-I/usr/include/newlib \
-	-I$(CH32V003FUN) \
-	-nostdlib \
-	-I. -Wall
-
-LDFLAGS:=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
-
-SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
-
-$(TARGET).elf : $(SYSTEM_C) $(TARGET).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 $< flash -b
-
-clean :
-	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+include ../../ch32v003fun/ch32v003fun.mk
 
+all : flash
+flash : cv_flash
+clean : cv_clean