diff --git a/ch32v003fun/ch32v003fun.mk b/ch32v003fun/ch32v003fun.mk
index 67d4334a08bfc40e56690bc31b3e238fa5c85c9f..ab273c366f2ee6c061aecbe87f81059f4bfef81a 100644
--- a/ch32v003fun/ch32v003fun.mk
+++ b/ch32v003fun/ch32v003fun.mk
@@ -15,8 +15,11 @@ CFLAGS+= \
 	-nostdlib \
 	-I. -Wall
 
-LDFLAGS+=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L$(CH32V003FUN)/../misc -lgcc
+LINKER_SCRIPT?=$(CH32V003FUN)/ch32v003fun.ld
 
+LDFLAGS+=-T $(LINKER_SCRIPT) -Wl,--gc-sections -L$(CH32V003FUN)/../misc -lgcc
+
+WRITE_SECTION?=flash
 SYSTEM_C?=$(CH32V003FUN)/ch32v003fun.c
 TARGET_EXT?=c
 
@@ -53,9 +56,11 @@ clangd :
 clangd_clean :
 	rm -f compile_commands.json
 
+FLASH_COMMAND?=$(MINICHLINK)/minichlink -w $< $(WRITE_SECTION) -b
+
 cv_flash : $(TARGET).bin
 	make -C $(MINICHLINK) all
-	$(MINICHLINK)/minichlink -w $< flash -b
+	$(FLASH_COMMAND)
 
 cv_clean :
 	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex || true
diff --git a/examples/blink/blink.bin b/examples/blink/blink.bin
index eb40bbd2f9458454bc76c9c2604a2d1fa3e077a5..9d2f625331af46afe752e4c674ea3ca6a67b5f49 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 dc85199fa0bbfef6e06393db5dc3213810bc88e5..b9b810c429d4f063e22a81da2c367d2a3abbddf2 100644
--- a/examples/bootload/Makefile
+++ b/examples/bootload/Makefile
@@ -1,6 +1,9 @@
 all : flash
 
 TARGET:=bootload
+LINKER_SCRIPT:=../../ch32v003fun/ch32v003fun-bootloader.ld
+WRITE_SECTION:=bootloader
+FLASH_COMMAND:=../../minichlink/minichlink -a -U -w $(TARGET).bin $(WRITE_SECTION) -B
 
 include ../../ch32v003fun/ch32v003fun.mk
 
diff --git a/examples/bootload/bootload.c b/examples/bootload/bootload.c
index a5975940f73027cf267f591b70fca7ff582b05f0..a3c781e69ef5bee6ff64dc581728f39343c5d5c1 100644
--- a/examples/bootload/bootload.c
+++ b/examples/bootload/bootload.c
@@ -14,8 +14,10 @@ void InterruptVector()
 {
 	asm volatile( "\n\
 	.align  2\n\
+	.option   push;\n\
 	.option   norvc;\n\
-	j handle_reset");
+	j handle_reset\n\
+	.option pop");
 }
 
 uint32_t count;
@@ -40,7 +42,7 @@ int main()
 
 	// GPIO C0 Push-Pull, 10MHz Output
 	GPIOC->CFGLR &= ~(0xf<<(4*0));
-	GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4);
+	GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*0);
 
 	static const uint32_t marker[] = { 0xaaaaaaaa };
 	count = marker[0];
diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c
index d14c0393f72a9d0d21c335b7b2e8d62dcbe8bc54..4bcae53678cb9d3b4f4c1e04d6ad414e55d35614 100644
--- a/minichlink/minichlink.c
+++ b/minichlink/minichlink.c
@@ -462,6 +462,11 @@ keep_going:
 				else
 				{
 					FILE * f = fopen( fname, "rb" );
+					if( !f )
+					{
+						fprintf( stderr, "Error: Could not open %s\n", fname );
+						return -55;
+					}
 					fseek( f, 0, SEEK_END );
 					len = ftell( f );
 					fseek( f, 0, SEEK_SET );