diff --git a/ch32v003fun/ch32v003fun.c b/ch32v003fun/ch32v003fun.c
index d9d66747718121bf4e5b8f48350da66915d93663..d07d4ca83375cd097b7ebd3d1da44face046a5d5 100644
--- a/ch32v003fun/ch32v003fun.c
+++ b/ch32v003fun/ch32v003fun.c
@@ -966,8 +966,9 @@ void InterruptVectorDefault()
 	asm volatile( "\n\
 	.align	1 \n\
 	.option norvc; \n\
-	.word   Init \n\
-	.word   0 \n\
+	.word   Init \n"
+#if !defined(FUNCONF_TINYVECTOR) || !FUNCONF_TINYVECTOR
+"	.word   0 \n\
 	.word   NMI_Handler                /* NMI */ \n\
 	.word   HardFault_Handler          /* Hard Fault */ \n\
 	.word   0 \n"
@@ -1105,6 +1106,7 @@ void InterruptVectorDefault()
     .word   DMA2_Channel10_IRQHandler  /* DMA2 Channel 10 */ \n\
     .word   DMA2_Channel11_IRQHandler  /* DMA2 Channel 11 */ \n"
 #endif
+#endif
 "	.option rvc; \n");
 
 }
@@ -1355,65 +1357,6 @@ void DelaySysTick( uint32_t n )
 #endif
 }
 
-#if defined(CH32V10x) || defined(CH32V20x) || defined(CH32V30x)
-
-inline uint32_t GetPllClock(uint32_t clock) {
-#if !defined(FUNCONF_SYSTEM_CORE_CLOCK)
-	return 0;
-#else
-#if defined(FUNCONF_USE_HSI) && FUNCONF_USE_HSI
-	uint32_t ratio = FUNCONF_SYSTEM_CORE_CLOCK / HSI_VALUE;
-#else
-	uint32_t ratio = FUNCONF_SYSTEM_CORE_CLOCK / HSE_VALUE;
-#endif
-#if defined(CH32V10x) || defined(CH32V20x) || defined(CH32V30x_D8)
-	switch(ratio) {
-		case 1: return 0;
-		case 2: return RCC_PLLMULL2;
-		case 3: return RCC_PLLMULL3;
-		case 4: return RCC_PLLMULL4;
-		case 5: return RCC_PLLMULL5;
-		case 6: return RCC_PLLMULL6;
-		case 7: return RCC_PLLMULL7;
-		case 8: return RCC_PLLMULL8;
-		case 9: return RCC_PLLMULL9;
-		case 10: return RCC_PLLMULL10;
-		case 11: return RCC_PLLMULL11;
-		case 12: return RCC_PLLMULL12;
-		case 13: return RCC_PLLMULL13;
-		case 14: return RCC_PLLMULL14;
-		case 15: return RCC_PLLMULL15;
-		case 16: return RCC_PLLMULL16;
-#if defined(CH32V20x)
-		case 18: return RCC_PLLMULL18;
-#endif
-		default: return 0;
-	}
-#else
-	switch(ratio) {
-		case 1: return 0;
-		case 3: return RCC_PLLMULL3_EXTEN;
-		case 4: return RCC_PLLMULL4_EXTEN;
-		case 5: return RCC_PLLMULL5_EXTEN;
-		case 6: return RCC_PLLMULL6_EXTEN;
-		case 7: return RCC_PLLMULL7_EXTEN;
-		case 8: return RCC_PLLMULL8_EXTEN;
-		case 9: return RCC_PLLMULL9_EXTEN;
-		case 10: return RCC_PLLMULL10_EXTEN;
-		case 11: return RCC_PLLMULL11_EXTEN;
-		case 12: return RCC_PLLMULL12_EXTEN;
-		case 13: return RCC_PLLMULL13_EXTEN;
-		case 14: return RCC_PLLMULL14_EXTEN;
-		case 15: return RCC_PLLMULL15_EXTEN;
-		case 16: return RCC_PLLMULL16_EXTEN;
-		default: return 0;
-	}
-#endif
-#endif
-}
-
-#endif
-
 void SystemInit()
 {
 #if FUNCONF_HSE_BYPASS
@@ -1423,13 +1366,17 @@ void SystemInit()
 #endif
 
 #if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL
-#if defined(CH32V003)
-	#define BASE_CFGR0 RCC_HPRE_DIV1 | RCC_PLLSRC_HSI_Mul2    // HCLK = SYSCLK = APB1 And, enable PLL
-#else
-	#define BASE_CFGR0 RCC_HPRE_DIV1 | RCC_PPRE2_DIV1 | RCC_PPRE1_DIV2 | GetPllClock(FUNCONF_SYSTEM_CORE_CLOCK)
-#endif
+	#if defined(CH32V003)
+		#define BASE_CFGR0 RCC_HPRE_DIV1 | RCC_PLLSRC_HSI_Mul2    // HCLK = SYSCLK = APB1 And, enable PLL
+	#else
+		#define BASE_CFGR0 RCC_HPRE_DIV1 | RCC_PPRE2_DIV1 | RCC_PPRE1_DIV2 | PLL_MULTIPLICATION
+	#endif
 #else
-	#define BASE_CFGR0 RCC_HPRE_DIV1      // HCLK = SYSCLK = APB1 And, no pll.
+	#if defined(CH32V003)
+		#define BASE_CFGR0 RCC_HPRE_DIV1     					  // HCLK = SYSCLK = APB1 And, no pll.
+	#else
+		#define BASE_CFGR0 RCC_HPRE_DIV1 | RCC_PPRE2_DIV1 | RCC_PPRE1_DIV1
+	#endif
 #endif
 
 #if defined(FUNCONF_USE_HSI) && FUNCONF_USE_HSI
@@ -1450,21 +1397,44 @@ void SystemInit()
 
 	#if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL
 		RCC->CFGR0 = BASE_CFGR0 | RCC_SW_HSE;
-		RCC->CTLR  = RCC_HSEON | RCC_PLLON | HSEBYP;                    // Turn off HSI.
+		RCC->CTLR  = RCC_HSEON | RCC_PLLON | HSEBYP;               // Turn off HSI.
 	#else
 		RCC->CFGR0 = BASE_CFGR0 | RCC_SW_HSE;
-		RCC->CTLR  = RCC_HSEON | HSEBYP;                                // Turn off PLL and HSI.
+		RCC->CTLR  = RCC_HSEON | HSEBYP;                           // Turn off PLL and HSI.
 	#endif
 #endif
 
-#if defined(CH32V003) || defined(CH32V10x)
-#if FUNCONF_SYSTEM_CORE_CLOCK > 25000000
-	FLASH->ACTLR = FLASH_ACTLR_LATENCY_1;                   //+1 Cycle Latency
-#else
-	FLASH->ACTLR = FLASH_ACTLR_LATENCY_0;                   // +0 Cycle Latency
+	// CH32V10x flash prefetch buffer
+#if defined(CH32V10x)
+	// Enable Prefetch Buffer
+	FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
 #endif
+
+	// CH32V003 flash latency
+#if defined(CH32V003)
+	#if FUNCONF_SYSTEM_CORE_CLOCK > 25000000
+		FLASH->ACTLR = FLASH_ACTLR_LATENCY_1;               // +1 Cycle Latency
+	#else
+		FLASH->ACTLR = FLASH_ACTLR_LATENCY_0;               // +0 Cycle Latency
+	#endif
 #endif
 
+	// CH32V10x flash latency
+#if defined(CH32V10x)
+	#if defined(FUNCONF_USE_HSE) && FUNCONF_USE_HSE
+		#if !defined(FUNCONF_USE_PLL) || !FUNCONF_USE_PLL
+			FLASH->ACTLR = FLASH_ACTLR_LATENCY_0;           // +0 Cycle Latency
+		#else
+			#if FUNCONF_SYSTEM_CORE_CLOCK < 56000000
+				FLASH->ACTLR = FLASH_ACTLR_LATENCY_1;       // +1 Cycle Latency
+			#else
+				FLASH->ACTLR = FLASH_ACTLR_LATENCY_2;       // +2 Cycle Latency
+			#endif
+		#endif
+	#else
+		FLASH->ACTLR = FLASH_ACTLR_LATENCY_1;       		// +1 Cycle Latency
+	#endif
+#endif
 
 	RCC->INTR  = 0x009F0000;                               // Clear PLL, CSSC, HSE, HSI and LSI ready flags.
 
diff --git a/ch32v003fun/ch32v003fun.h b/ch32v003fun/ch32v003fun.h
index eba531c6c5f6d1ed269752969589296f2c6ff8fe..e450b326c7cf9d5215124d3033ca5c8f20238018 100644
--- a/ch32v003fun/ch32v003fun.h
+++ b/ch32v003fun/ch32v003fun.h
@@ -82,7 +82,15 @@
 
 #if !defined( FUNCONF_PLL_MULTIPLIER )
 	#if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL
-		#define FUNCONF_PLL_MULTIPLIER 2
+		#if defined(CH32V10x)
+			#define FUNCONF_PLL_MULTIPLIER 10	// Default: 8 * 10 = 80 MHz
+		#elif defined(CH32V20x)
+			#define FUNCONF_PLL_MULTIPLIER 18	// Default: 8 * 18 = 144 MHz
+		#elif defined(CH32V20x)
+			#define FUNCONF_PLL_MULTIPLIER 18	// Default: 8 * 18 = 144 MHz
+		#else // CH32V003
+			#define FUNCONF_PLL_MULTIPLIER 2	// Default: 24 * 2 = 48 MHz
+		#endif
 	#else
 		#define FUNCONF_PLL_MULTIPLIER 1
 	#endif
@@ -12156,7 +12164,84 @@ void DefaultIRQHandler( void ) __attribute__((section(".text.vector_handler")))
 
 #endif
 
-
+// Determination of PLL multiplication factor for non-V003 chips
+#if defined(CH32V10x) || defined(CH32V20x) || defined(CH32V30x)
+	#if !defined(FUNCONF_SYSTEM_CORE_CLOCK)
+		#define PLL_MULTIPLICATION ((uint32_t)0)
+	#else
+		#if defined(CH32V10x) || defined(CH32V20x) || defined(CH32V30x_D8)
+			#if FUNCONF_PLL_MULTIPLIER == 2
+				#define PLL_MULTIPLICATION RCC_PLLMULL2
+			#elif FUNCONF_PLL_MULTIPLIER == 3
+				#define PLL_MULTIPLICATION RCC_PLLMULL3
+			#elif FUNCONF_PLL_MULTIPLIER == 4
+				#define PLL_MULTIPLICATION RCC_PLLMULL4
+			#elif FUNCONF_PLL_MULTIPLIER == 5
+				#define PLL_MULTIPLICATION RCC_PLLMULL5
+			#elif FUNCONF_PLL_MULTIPLIER == 6
+				#define PLL_MULTIPLICATION RCC_PLLMULL6
+			#elif FUNCONF_PLL_MULTIPLIER == 7
+				#define PLL_MULTIPLICATION RCC_PLLMULL7
+			#elif FUNCONF_PLL_MULTIPLIER == 8
+				#define PLL_MULTIPLICATION RCC_PLLMULL8
+			#elif FUNCONF_PLL_MULTIPLIER == 9
+				#define PLL_MULTIPLICATION RCC_PLLMULL9
+			#elif FUNCONF_PLL_MULTIPLIER == 10
+				#define PLL_MULTIPLICATION RCC_PLLMULL10
+			#elif FUNCONF_PLL_MULTIPLIER == 11
+				#define PLL_MULTIPLICATION RCC_PLLMULL11
+			#elif FUNCONF_PLL_MULTIPLIER == 12
+				#define PLL_MULTIPLICATION RCC_PLLMULL12
+			#elif FUNCONF_PLL_MULTIPLIER == 13
+				#define PLL_MULTIPLICATION RCC_PLLMULL13
+			#elif FUNCONF_PLL_MULTIPLIER == 14
+				#define PLL_MULTIPLICATION RCC_PLLMULL14
+			#elif FUNCONF_PLL_MULTIPLIER == 15
+				#define PLL_MULTIPLICATION RCC_PLLMULL15
+			#elif FUNCONF_PLL_MULTIPLIER == 16
+				#define PLL_MULTIPLICATION RCC_PLLMULL16
+			#elif defined(CH32V20x) && FUNCONF_PLL_MULTIPLIER == 18
+				#define PLL_MULTIPLICATION RCC_PLLMULL18
+			#else
+				#error "Invalid PLL multiplier"
+			#endif
+		#else
+			#if FUNCONF_PLL_MULTIPLIER == 3
+				#define PLL_MULTIPLICATION RCC_PLLMULL3
+			#elif FUNCONF_PLL_MULTIPLIER == 4
+				#define PLL_MULTIPLICATION RCC_PLLMULL4
+			#elif FUNCONF_PLL_MULTIPLIER == 5
+				#define PLL_MULTIPLICATION RCC_PLLMULL5
+			#elif FUNCONF_PLL_MULTIPLIER == 6
+				#define PLL_MULTIPLICATION RCC_PLLMULL6
+			#elif FUNCONF_PLL_MULTIPLIER == 6.5
+				#define PLL_MULTIPLICATION RCC_PLLMULL6_5
+			#elif FUNCONF_PLL_MULTIPLIER == 7
+				#define PLL_MULTIPLICATION RCC_PLLMULL7
+			#elif FUNCONF_PLL_MULTIPLIER == 8
+				#define PLL_MULTIPLICATION RCC_PLLMULL8
+			#elif FUNCONF_PLL_MULTIPLIER == 9
+				#define PLL_MULTIPLICATION RCC_PLLMULL9
+			#elif FUNCONF_PLL_MULTIPLIER == 10
+				#define PLL_MULTIPLICATION RCC_PLLMULL10
+			#elif FUNCONF_PLL_MULTIPLIER == 11
+				#define PLL_MULTIPLICATION RCC_PLLMULL11
+			#elif FUNCONF_PLL_MULTIPLIER == 12
+				#define PLL_MULTIPLICATION RCC_PLLMULL12
+			#elif FUNCONF_PLL_MULTIPLIER == 13
+				#define PLL_MULTIPLICATION RCC_PLLMULL13
+			#elif FUNCONF_PLL_MULTIPLIER == 14
+				#define PLL_MULTIPLICATION RCC_PLLMULL14
+			#elif FUNCONF_PLL_MULTIPLIER == 15
+				#define PLL_MULTIPLICATION RCC_PLLMULL15
+			#elif FUNCONF_PLL_MULTIPLIER == 16
+				#define PLL_MULTIPLICATION RCC_PLLMULL16
+			#else
+				#error "Invalid PLL multiplier"
+			#endif
+		#endif
+	#endif
+#endif
 
 #ifndef __ASSEMBLER__