From b1e4f6dbfbf0e3c77f0699a3e3cef529d08f9682 Mon Sep 17 00:00:00 2001
From: Alexander Mandera <alexander@mandera.eu>
Date: Thu, 29 Jun 2023 00:49:28 +0200
Subject: [PATCH] Try to fix SystemInit, change pin for blink example

---
 ch32v003fun/ch32v003fun.c   | 11 ++++++++--
 ch32v003fun/ch32v003fun.h   | 42 ++++++++++++++++++++++---------------
 examples_v30x/blink/blink.c | 10 ++++-----
 3 files changed, 39 insertions(+), 24 deletions(-)

diff --git a/ch32v003fun/ch32v003fun.c b/ch32v003fun/ch32v003fun.c
index d07d4ca..fc4e178 100644
--- a/ch32v003fun/ch32v003fun.c
+++ b/ch32v003fun/ch32v003fun.c
@@ -1380,6 +1380,9 @@ void SystemInit()
 #endif
 
 #if defined(FUNCONF_USE_HSI) && FUNCONF_USE_HSI
+	#if defined(CH32V30x)
+		EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;
+	#endif
 	#if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL
 		RCC->CFGR0 = BASE_CFGR0;
 		RCC->CTLR  = RCC_HSION | RCC_PLLON | ((FUNCONF_HSITRIM) << 3); // Use HSI, but enable PLL.
@@ -1395,11 +1398,15 @@ void SystemInit()
 	// Values lifted from the EVT.  There is little to no documentation on what this does.
 	while(!(RCC->CTLR&RCC_HSERDY));
 
-	#if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL
+	#if defined(CH32V003)
 		RCC->CFGR0 = BASE_CFGR0 | RCC_SW_HSE;
+	#else
+		RCC->CFGR0 = BASE_CFGR0 | RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE;
+	#endif
+
+	#if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL
 		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.
 	#endif
 #endif
diff --git a/ch32v003fun/ch32v003fun.h b/ch32v003fun/ch32v003fun.h
index c97ec0c..2212859 100644
--- a/ch32v003fun/ch32v003fun.h
+++ b/ch32v003fun/ch32v003fun.h
@@ -86,7 +86,7 @@
 			#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)
+		#elif defined(CH32V30x)
 			#define FUNCONF_PLL_MULTIPLIER 18	// Default: 8 * 18 = 144 MHz
 		#else // CH32V003
 			#define FUNCONF_PLL_MULTIPLIER 2	// Default: 24 * 2 = 48 MHz
@@ -12157,6 +12157,11 @@ void DefaultIRQHandler( void ) __attribute__((section(".text.vector_handler")))
 
 #endif
 
+#define str(token) #token
+#define xstr(token) str(token)
+
+#pragma message("CH32V003FUN: " xstr(FUNCONF_PLL_MULTIPLIER) " Multiplier")
+
 // Determination of PLL multiplication factor for non-V003 chips
 #if defined(CH32V10x) || defined(CH32V20x) || defined(CH32V30x)
 	#if !defined(FUNCONF_SYSTEM_CORE_CLOCK)
@@ -12200,35 +12205,35 @@ void DefaultIRQHandler( void ) __attribute__((section(".text.vector_handler")))
 			#endif
 		#else
 			#if FUNCONF_PLL_MULTIPLIER == 3
-				#define PLL_MULTIPLICATION RCC_PLLMULL3
+				#define PLL_MULTIPLICATION RCC_PLLMULL3_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 4
-				#define PLL_MULTIPLICATION RCC_PLLMULL4
+				#define PLL_MULTIPLICATION RCC_PLLMULL4_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 5
-				#define PLL_MULTIPLICATION RCC_PLLMULL5
+				#define PLL_MULTIPLICATION RCC_PLLMULL5_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 6
-				#define PLL_MULTIPLICATION RCC_PLLMULL6
-			#elif FUNCONF_PLL_MULTIPLIER == 6.5
-				#define PLL_MULTIPLICATION RCC_PLLMULL6_5
+				#define PLL_MULTIPLICATION RCC_PLLMULL6_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 7
-				#define PLL_MULTIPLICATION RCC_PLLMULL7
+				#define PLL_MULTIPLICATION RCC_PLLMULL7_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 8
-				#define PLL_MULTIPLICATION RCC_PLLMULL8
+				#define PLL_MULTIPLICATION RCC_PLLMULL8_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 9
-				#define PLL_MULTIPLICATION RCC_PLLMULL9
+				#define PLL_MULTIPLICATION RCC_PLLMULL9_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 10
-				#define PLL_MULTIPLICATION RCC_PLLMULL10
+				#define PLL_MULTIPLICATION RCC_PLLMULL10_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 11
-				#define PLL_MULTIPLICATION RCC_PLLMULL11
+				#define PLL_MULTIPLICATION RCC_PLLMULL11_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 12
-				#define PLL_MULTIPLICATION RCC_PLLMULL12
+				#define PLL_MULTIPLICATION RCC_PLLMULL12_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 13
-				#define PLL_MULTIPLICATION RCC_PLLMULL13
+				#define PLL_MULTIPLICATION RCC_PLLMULL13_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 14
-				#define PLL_MULTIPLICATION RCC_PLLMULL14
+				#define PLL_MULTIPLICATION RCC_PLLMULL14_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 15
-				#define PLL_MULTIPLICATION RCC_PLLMULL15
+				#define PLL_MULTIPLICATION RCC_PLLMULL15_EXTEN
 			#elif FUNCONF_PLL_MULTIPLIER == 16
-				#define PLL_MULTIPLICATION RCC_PLLMULL16
+				#define PLL_MULTIPLICATION RCC_PLLMULL16_EXTEN
+			#elif FUNCONF_PLL_MULTIPLIER == 18
+				#define PLL_MULTIPLICATION RCC_PLLMULL18_EXTEN
 			#else
 				#error "Invalid PLL multiplier"
 			#endif
@@ -12236,6 +12241,9 @@ void DefaultIRQHandler( void ) __attribute__((section(".text.vector_handler")))
 	#endif
 #endif
 
+#pragma message("CH32V003FUN: " xstr(FUNCONF_SYSTEM_CORE_CLOCK) " Clock")
+
+
 #ifndef __ASSEMBLER__
 
 void DelaySysTick( uint32_t n );
diff --git a/examples_v30x/blink/blink.c b/examples_v30x/blink/blink.c
index 7ac84c2..2e5d239 100644
--- a/examples_v30x/blink/blink.c
+++ b/examples_v30x/blink/blink.c
@@ -9,15 +9,15 @@ int main()
 	//RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC;
 	RCC->APB2PCENR |= RCC_APB2Periph_GPIOA;
 
-	// GPIO A15 Push-Pull
-	GPIOA->CFGHR &= ~((uint32_t)0x0F<<(4*7));
-	GPIOA->CFGHR |= (uint32_t)(GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*7);
+	// GPIO A3 Push-Pull
+	GPIOA->CFGLR &= ~((uint32_t)0x0F<<(4*3));
+	GPIOA->CFGLR |= (uint32_t)(GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*3);
 
 	while(1)
 	{
-		GPIOA->BSHR = (1<<15);	 // Turn on GPIO
+		GPIOA->BSHR = (1<<3);	 // Turn on GPIO
 		Delay_Ms( 1000 );
-		GPIOA->BSHR = (1<<(16+15)); // Turn off GPIO
+		GPIOA->BSHR = (1<<(16+3)); // Turn off GPIO
 		Delay_Ms( 1000 );
 	}
 }
-- 
GitLab