/************************************************************************************************/
/**
* @file               common.c
* @author             MCU Ecosystem Development Team
* @brief              通用函数或本外设相关的配置实现函数。
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

/*------------------------------------------includes--------------------------------------------*/
#include "common.h"

/*--------------------------------------------define--------------------------------------------*/
#define I2C_BAUD_RATE           (100000U)       /* 通信速率100K */
#define TIM_PRESCALER_VALUE     (0x00U)
#define TIM_PERIOD_VALUE        (uint32_t)(SystemCoreClock/(2*I2C_BAUD_RATE*(1<<TIM_PRESCALER_VALUE)))

/*-------------------------------------------functions------------------------------------------*/
/**
* @brief  系统时钟配置
* @retval 无
*/
void system_clock_config(void)
{
    /* 设置Flash读访问等待时间 */
    std_flash_set_latency(FLASH_LATENCY_1CLK);

    /* 使能RCH */
    std_rcc_rch_enable();
    while(std_rcc_get_rch_ready() != RCC_CSR1_RCHRDY);

    /* 设置系统时钟源为RCH */
    std_rcc_set_sysclk_source(RCC_SYSCLK_SRC_RCH);
    while(std_rcc_get_sysclk_source() != RCC_SYSCLK_SRC_STATUS_RCH);

    /* 设置AHB分频因子 */
    std_rcc_set_ahbdiv(RCC_HCLK_DIV1);
    /* 设置APB分频因子 */
    std_rcc_set_apbdiv(RCC_PCLK_DIV1);

    SystemCoreClock = RCH_VALUE;
}

/**
* @brief  GPIO初始化
* @retval 无
*/
void gpio_init(void)
{
    std_gpio_init_t gpio_config = {0};
    
    /* 使能I2C GPIO时钟 */
    std_rcc_gpio_clk_enable(I2C_PIN_PORT_CLK);
    
    /* 初始化I2C GPIO */
    gpio_config.pin = (I2C_SCL_PIN | I2C_SDA_PIN);
    gpio_config.mode = GPIO_MODE_OUTPUT;
    gpio_config.output_type = GPIO_OUTPUT_OPENDRAIN;
    gpio_config.pull = GPIO_PULLUP;
    std_gpio_init(I2C_PIN_PORT, &gpio_config);
    
    /* 设置SCL SDA默认输出高电平 */
    std_gpio_set_pin(I2C_PIN_PORT, (I2C_SCL_PIN | I2C_SDA_PIN));
}

/**
* @brief  I2C_SIM_TIM初始化
* @retval 无
*/
void i2c_sim_tim_init(void)
{
    std_tim_basic_init_t i2c_sim_tim_init_struct = {0};
    
    /* I2C_SIM_TIM时钟使能 */
    std_rcc_apb2_clk_enable(I2C_SIM_TIM_CLK);
    
    /* 配置I2C_SIM_TIM计数器参数 */
    i2c_sim_tim_init_struct.prescaler = TIM_PRESCALER_VALUE;
    i2c_sim_tim_init_struct.period = TIM_PERIOD_VALUE;
    i2c_sim_tim_init_struct.clock_div = TIM_CLOCK_DTS_DIV1;
    std_tim_init(I2C_SIM_TIM, &i2c_sim_tim_init_struct);
    
    /* 清除更新事件标志 */
    I2C_SIM_TIM_CLR_FLAG();
    
    /* I2C_SIM_TIM中断配置 */
    std_tim_interrupt_enable(I2C_SIM_TIM, TIM_INTERRUPT_UPDATE);
    NVIC_SetPriority(I2C_SIM_TIM_IRQn, NVIC_PRIO_0);
    NVIC_EnableIRQ(I2C_SIM_TIM_IRQn);
}

/**
* @brief  异常处理
* @retval 无
*/
void error_process(void)
{
    /* 用户添加异常处理流程 */
    
    while(1)
    {
    }
}
