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__