/********************************** (C) COPYRIGHT ******************************* * File Name : system_ch32x035.c * Author : WCH * Version : V1.0.0 * Date : 2023/04/06 * Description : CH32X035 Device Peripheral Access Layer System Source File. ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ #include "ch32x035.h" #include "global.h" /* * Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after * reset the HSI is used as SYSCLK source). */ /* Clock Definitions */ /* #ifdef SYSCLK_FREQ_8MHz_HSI uint32_t SystemCoreClock = SYSCLK_FREQ_8MHz_HSI; // System Clock Frequency (Core Clock) #elif defined SYSCLK_FREQ_12MHz_HSI uint32_t SystemCoreClock = SYSCLK_FREQ_12MHz_HSI; // System Clock Frequency (Core Clock) #elif defined SYSCLK_FREQ_16MHz_HSI uint32_t SystemCoreClock = SYSCLK_FREQ_16MHz_HSI; // System Clock Frequency (Core Clock) #elif defined SYSCLK_FREQ_24MHz_HSI uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz_HSI; // System Clock Frequency (Core Clock) #else uint32_t SystemCoreClock = HSI_VALUE; // System Clock Frequency (Core Clock) #endif */ uint32_t SystemCoreClock; __I uint8_t AHBPrescTable[16] = {1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}; /* system_private_function_proto_types */ void SetSysClock(uint32_t clock); /* #ifdef SYSCLK_FREQ_8MHz_HSI static void SetSysClockTo8_HSI( void ); #elif defined SYSCLK_FREQ_12MHz_HSI static void SetSysClockTo12_HSI( void ); #elif defined SYSCLK_FREQ_16MHz_HSI static void SetSysClockTo16_HSI( void ); #elif defined SYSCLK_FREQ_24MHz_HSI static void SetSysClockTo24_HSI( void ); #elif defined SYSCLK_FREQ_48MHz_HSI static void SetSysClockTo48_HSI( void ); #endif */ static void SetSysClockToX_HSI(uint32_t div, uint32_t latency); /********************************************************************* * @fn SystemInit * * @brief Setup the microcontroller system Initialize the Embedded Flash Interface, * update the SystemCoreClock variable. * * @return none */ void SystemInit (void) { RCC->CTLR |= (uint32_t)0x00000001; RCC->CFGR0 |= (uint32_t)0x00000050; RCC->CFGR0 &= (uint32_t)0xF8FFFF5F; SetSysClock(SYSCLK_FREQ_NORMAL); } /********************************************************************* * @fn SystemCoreClockUpdate * * @brief Update SystemCoreClock variable according to Clock Register Values. * * @return none */ void SystemCoreClockUpdate (void) { uint32_t tmp = 0; SystemCoreClock = HSI_VALUE; tmp = AHBPrescTable[((RCC->CFGR0 & RCC_HPRE) >> 4)]; if(((RCC->CFGR0 & RCC_HPRE) >> 4) < 8) { SystemCoreClock /= tmp; } else { SystemCoreClock >>= tmp; } } /********************************************************************* * @fn SetSysClock * * @brief Configures the System clock frequency, HCLK prescalers. * * @return none */ void SetSysClock(uint32_t clock) { switch (clock) { case SYSCLK_FREQ_48MHz_HSI: { SetSysClockToX_HSI(RCC_HPRE_DIV1, FLASH_ACTLR_LATENCY_2); break; } case SYSCLK_FREQ_24MHz_HSI: { SetSysClockToX_HSI(RCC_HPRE_DIV2, FLASH_ACTLR_LATENCY_1); break; } case SYSCLK_FREQ_16MHz_HSI: { SetSysClockToX_HSI(RCC_HPRE_DIV3, FLASH_ACTLR_LATENCY_1); break; } case SYSCLK_FREQ_12MHz_HSI: { SetSysClockToX_HSI(RCC_HPRE_DIV4, FLASH_ACTLR_LATENCY_0); break; } default: { SetSysClockToX_HSI(RCC_HPRE_DIV6, FLASH_ACTLR_LATENCY_0); clock = 8000000; break; } } SystemCoreClock = clock; /* #ifdef SYSCLK_FREQ_8MHz_HSI SetSysClockTo8_HSI(); #elif defined SYSCLK_FREQ_12MHz_HSI SetSysClockTo12_HSI(); #elif defined SYSCLK_FREQ_16MHz_HSI SetSysClockTo16_HSI(); #elif defined SYSCLK_FREQ_24MHz_HSI SetSysClockTo24_HSI(); #elif defined SYSCLK_FREQ_48MHz_HSI SetSysClockTo48_HSI(); #endif */ } static void SetSysClockToX_HSI(uint32_t div, uint32_t latency) { uint32_t actlr; uint32_t cfgr0; /* Flash 2 wait state */ actlr = FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY); FLASH->ACTLR = (uint32_t)actlr | FLASH_ACTLR_LATENCY_2; /* HCLK = SYSCLK = APB1 */ cfgr0 = RCC->CFGR0 &= (uint32_t)0xFFFFFF0F; RCC->CFGR0 = (uint32_t)cfgr0 | (div & 0xf0); /* Flash set wait state */ FLASH->ACTLR = (uint32_t)actlr | (latency & 0x03); }