copied over and modified for use my CH59x soft I2C. CH32X GPIO does not have an open drain mode, so I have to implement this with RMW to the mode register. After doing this and adding missing functions needed for existing code, LED writes and EEPROM reads and writes. using the AWU for system timing so the clock speed can change. existing issues: - changing clock speed divider in soft i2c routines causes the system to crash - ADC seems to be reading, but result isn't being used
155 lines
4.7 KiB
C
155 lines
4.7 KiB
C
/********************************** (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);
|
|
}
|