1280 lines
42 KiB
C
1280 lines
42 KiB
C
/*!
|
|
* \file xc_drv_clock.c
|
|
*
|
|
* \brief Target xinchip clock driver implementation
|
|
*
|
|
* \copyright Revised BSD License, see section \ref LICENSE.
|
|
*
|
|
* \code
|
|
*
|
|
* _ __ _ ________ _
|
|
* | |/ /(_)___ / ____/ /_ (_)___
|
|
* | // / __ \/ / / __ \/ / __ \
|
|
* / |/ / / / / /___/ / / / / /_/ /
|
|
* /_/|_/_/_/ /_/\____/_/ /_/_/ .___/
|
|
* /_/
|
|
* (C) 2022-2025 XinChip
|
|
*
|
|
* \endcode
|
|
*
|
|
* \author ( XinChip ) Alex-J
|
|
*
|
|
* \author ( XinChip )
|
|
*/
|
|
|
|
/*-----------------------------------------------------------------------------------
|
|
INCLUDE HEADE FILES
|
|
------------------------------------------------------------------------------------*/
|
|
#include "xc_drv_clock.h"
|
|
#include "xc_romaddr_define.h"
|
|
#if XC_CHECK(XC_CLOCK_ENABLED)
|
|
/*------------------------------------------------------------------------------------
|
|
Local Variables
|
|
-------------------------------------------------------------------------------------*/
|
|
|
|
/*------------------------------------------------------------------------------------
|
|
Global Variables
|
|
-------------------------------------------------------------------------------------*/
|
|
CLOCK_InitCfg_t clock_cb;
|
|
|
|
/*------------------------------------------------------------------------------------
|
|
Func Prototype
|
|
-------------------------------------------------------------------------------------*/
|
|
|
|
/*------------------------------------------------------------------------------------
|
|
Functions
|
|
-------------------------------------------------------------------------------------*/
|
|
|
|
|
|
#ifdef XC62XX_RFANA2_BIT13_SET
|
|
void rf_ana2_bit13_enable(void)
|
|
{
|
|
cpr_bt_clk_ctl__bt_clk_en__setf(ENABLE);
|
|
rf_ana2_bit13_setf(0x01);
|
|
}
|
|
|
|
void rf_ana2_bit13_disable(void)
|
|
{
|
|
cpr_bt_clk_ctl__bt_clk_en__setf(ENABLE);
|
|
rf_ana2_bit13_setf(0x00);
|
|
}
|
|
#endif // XC62XX_RFANA2_BIT13_SET
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_bbpll_common_cfg
|
|
* @details Common Settings for frequency doubling
|
|
* @param[in] void
|
|
* @param[in] void
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_bbpll_common_cfg(void)
|
|
{
|
|
#if defined(LORA_CLOCK_PLL_CONFIG)
|
|
xc_lora_clock_bbpll_common_cfg();
|
|
#else
|
|
cpr_bt_clk_ctl__bt_clk_en__setf(ENABLE);
|
|
cpr_ctlapbclken_grctl__bt_pclk_en__setf(ENABLE);
|
|
bt_rf_pm_reg__bt_en_pm__setf(ENABLE);
|
|
cprao_aon_coreldo_en_set(ENABLE);
|
|
|
|
#ifdef XC62XX_RFANA2_BIT13_SET
|
|
rf_ana2_bit13_enable();
|
|
#endif // XC62XX_RFANA2_BIT13_SET
|
|
|
|
#endif // LORA_CLOCK_PLL_CONFIG
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_bbpll_freq_cfg
|
|
* @details Initializes the frequency doubling clock
|
|
* @param[in] hfclk_src :Source clock
|
|
* @param[in] loopdiv :clock multiplier factor
|
|
* @param[in] clk_div :Frequency division coefficient
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_bbpll_freq_cfg(CLOCK_HFCLK_Src_Typedef hfclk_src, uint16_t loopdiv,
|
|
uint8_t clk_div)
|
|
{
|
|
#if !defined(NO_SUPPORT_HFCLK_RC_16M)
|
|
if (CLOCK_HFCLK_SRC_RC == hfclk_src)
|
|
{
|
|
cprao_aon_rf_aonreg__da_ldo_en__setf(0);
|
|
/* delay than 10us */
|
|
delay_us(AON_RF_AONREG_DA_LDO_EN_DELAY);
|
|
cprao_aon_rf_aonreg__da_ldo_en__setf(1);
|
|
rf_ana27__bbpll_16m_sel__setf(ENABLE);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
rf_ana27__bbpll_16m_sel__setf(DISABLE);
|
|
}
|
|
|
|
/* 2 div, must be opened */
|
|
rf_ana27__bbpll_core_96m_en__setf(ENABLE);
|
|
#if !defined(XC62XX_CLOCK_CONFIG)
|
|
#else
|
|
rf_ana25_bit11_12_setf(3);/* Enhance the driving capability of bbpll */
|
|
#endif
|
|
rf_ana26__bbpll_loopdiv__setf(loopdiv);
|
|
rf_ana26__clk_bbpll_en__setf(ENABLE);
|
|
rf_ana26__clk_bbpll_rstn__setf(ENABLE);
|
|
rf_ana26__bbpll_en__setf(ENABLE);
|
|
rf_ana26__bbpll_core_64m_en__setf(ENABLE);
|
|
|
|
switch (loopdiv)
|
|
{
|
|
case LOOPDIV_BBPLL_RES_LEVEL_0:
|
|
rf_ana26__bbpll_res__setf(0);
|
|
break;
|
|
|
|
case LOOPDIV_BBPLL_RES_LEVEL_1:
|
|
rf_ana26__bbpll_res__setf(1);
|
|
break;
|
|
|
|
case LOOPDIV_BBPLL_RES_LEVEL_2:
|
|
rf_ana26__bbpll_res__setf(2);
|
|
break;
|
|
|
|
case LOOPDIV_BBPLL_RES_LEVEL_3:
|
|
rf_ana26__bbpll_res__setf(3);
|
|
break;
|
|
|
|
case LOOPDIV_BBPLL_RES_LEVEL_4:
|
|
rf_ana26__bbpll_res__setf(4);
|
|
break;
|
|
|
|
case LOOPDIV_BBPLL_RES_LEVEL_5:
|
|
rf_ana26__bbpll_res__setf(4);
|
|
break;
|
|
|
|
case LOOPDIV_BBPLL_RES_LEVEL_6:
|
|
rf_ana26__bbpll_res__setf(5);
|
|
break;
|
|
|
|
default:
|
|
rf_ana26__bbpll_res__setf(0);
|
|
break;
|
|
}
|
|
|
|
cpr_rf_reg4__bbpll_clk_div__setf(clk_div);
|
|
cpr_rf_reg4__bbpll_clk_en__setf(ENABLE);
|
|
}
|
|
|
|
|
|
#if !defined(NO_SUPPORT_HFCLK_RC_16M)
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_rc16m
|
|
* @details The clock is set to RC16M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_rc16m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_RC16M);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_16M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_16M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_rc16m_bbpll_32m
|
|
* @details RC16M clock overclocked to 32M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_rc16m_bbpll_32m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x08, 0x01);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_32M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_32M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_rc16m_bbpll_48m
|
|
* @details RC16M clock overclocked to 48M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_rc16m_bbpll_48m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x0C, 0x01);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_48M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_48M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_rc16m_bbpll_64m
|
|
* @details RC16M clock overclocked to 64M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_rc16m_bbpll_64m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x08, 0x01);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_64M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_64M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
#if !defined(NO_SUPPORT_HFCLK_BBPLL_96M)
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_rc16m_bbpll_96m
|
|
* @details RC16M clock overclocked to 96M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_rc16m_bbpll_96m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x0C, 0x01);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_96M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_96M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#if defined(HFCLK_SRC_XTAL_IS_32M)
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc32m_bbpll_16m
|
|
* @details osc32M Clock overclocked to 64M and hflck is 16M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc32m_bbpll_16m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x04, 0x03);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_16M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_16M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc32m_div_16m
|
|
* @details osc32M Clock divided into 16M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc32m_div_16m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
//M0_FCLK
|
|
cpr_m0_fclk_ctl__m0_fclk_div_p__setf(0x1);
|
|
cpr_m0_fclk_ctl__m0_fclk_direct_sw__setf(0x1);
|
|
//CTL_PCLK
|
|
cpr_ctl_pclk_grctl__ctl_pclk_gr__setf(0x8);
|
|
cpr_ctl_pclk_grctl__ctl_pclk_gr_upd__setf(0x1);
|
|
|
|
cprao_aon_bbldo_adj_set(0x3c);
|
|
/* The value needs to be configured to 7,
|
|
otherwise the current drop will be slower during sleep
|
|
and the clock accuracy of the rc32k will be affected.
|
|
*/
|
|
cprao_aon_lpoldo_adj_set(0x7);
|
|
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_16M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_16M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc32m_bbpll_24m
|
|
* @details osc32M Clock overclocked to 96M and hflck is 24M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc32m_bbpll_24m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x06, 0x03);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_24M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_24M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc32m
|
|
* @details The clock is set to osc32M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc32m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_OSC32M);
|
|
#ifdef XC62XX_RFANA2_BIT13_SET
|
|
rf_ana2_bit13_disable();
|
|
#endif // XC62XX_RFANA2_BIT13_SET
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_32M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_32M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
#if (CONFIG_HFCLK_IS_OSC32M_PLL_32M)
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc32m_bbpll_32m
|
|
* @details osc32M Clock overclocked to 64M and hflck is 32M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc32m_bbpll_32m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x04, 0x01);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_32M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_32M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc32m_bbpll_48m
|
|
* @details osc32M Clock overclocked to 48M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc32m_bbpll_48m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x06, 0x01);
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_48M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_48M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc32m_bbpll_64m
|
|
* @details osc32M Clock overclocked to 64M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc32m_bbpll_64m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x04, 0x01);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_64M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_64M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
#if !defined(NO_SUPPORT_HFCLK_BBPLL_96M)
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc32m_bbpll_96m
|
|
* @details osc32M Clock overclocked to 96M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc32m_bbpll_96m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x06, 0x01);
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_96M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_96M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
#endif
|
|
#elif defined(HFCLK_SRC_XTAL_IS_24M)
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc24m_bbpll_16m
|
|
* @details osc24M Clock overclocked to 48M and hflck is 16M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc24m_bbpll_16m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x4, 0x02);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_16M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_16M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc24m
|
|
* @details The clock is set to osc24M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc24m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_OSC32M);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_24M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_24M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
#if (CONFIG_HFCLK_IS_OSC24M_PLL_24M)
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc24m_bbpll_24m
|
|
* @details osc24M Clock overclocked to 48M and hflck is 24M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc24m_bbpll_24m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x04, 0x01);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_24M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_24M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc24m_bbpll_32m
|
|
* @details osc24M Clock overclocked to 96M and hflck is 32M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc24m_bbpll_32m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x08, 0x02);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_32M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_32M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc24m_bbpll_48m
|
|
* @details osc24M Clock overclocked to 48M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc24m_bbpll_48m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x04, 0x01);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_48M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_48M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc24m_bbpll_64m
|
|
* @details osc24M Clock overclocked to 192M and hflck is 64M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc24m_bbpll_64m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x10, 0x02);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL_DIV);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_64M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_64M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
|
|
#if !defined(NO_SUPPORT_HFCLK_BBPLL_96M)
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_set_osc24m_bbpll_96m
|
|
* @details osc24M Clock overclocked to 96M
|
|
* @param[in] CLOCK_InitCfg_t *cb
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_set_osc24m_bbpll_96m(CLOCK_InitCfg_t *cb)
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(cb->hfclk_src, 0x08, 0x01);
|
|
|
|
cpr_rf_reg3__mclk_src_sel__setf(CLOCK_SRC_BBPLL);
|
|
cb->hfclk_in = CLOCK_HFCLK_IN_96M;
|
|
cb->systick_unit = SYSTICK_UNIT_IN_96M;
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_hfclk_set
|
|
* @details Configure the system hfclock
|
|
* @param[in] Hfclk_InitCfg_t *hfclk_cfg
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_hfclk_set(Hfclk_InitCfg_t hfclk_cfg)
|
|
{
|
|
if ((hfclk_cfg.mclk_src == CLOCK_SRC_BBPLL) || (hfclk_cfg.mclk_src == CLOCK_SRC_BBPLL_DIV))
|
|
{
|
|
xc_clock_bbpll_common_cfg();
|
|
xc_clock_bbpll_freq_cfg(hfclk_cfg.cb->hfclk_src, hfclk_cfg.bbpll_loopdiv, hfclk_cfg.bbpll_clkdiv);
|
|
}
|
|
cpr_rf_reg3__mclk_src_sel__setf(hfclk_cfg.mclk_src);
|
|
delay_us(BBPLL_LOCK_DELAY);
|
|
xc_pwr_vol_set();
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_hfclk_set
|
|
* @details High speed clock setting, Will modify all peripheral clock.
|
|
* @param[in] CLOCK_HFCLK_Src_Typedef hfclk_src
|
|
* @param[in] CLOCK_HFCLK_In_Typedef hfclk_in
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_hfclk_set(CLOCK_HFCLK_Src_Typedef hfclk_src,
|
|
CLOCK_HFCLK_In_Typedef hfclk_in)
|
|
{
|
|
Hfclk_InitCfg_t hfclk_param;
|
|
hfclk_param.cb = &clock_cb;
|
|
hfclk_param.cb->hfclk_src = hfclk_src;
|
|
hfclk_param.cb->hfclk_in = hfclk_in;
|
|
hfclk_param.cb->systick_unit = (Systick_Unit_Typedef)(hfclk_in / 1000000);
|
|
|
|
switch (hfclk_src) {
|
|
#if !defined(NO_SUPPORT_HFCLK_RC_16M)
|
|
case CLOCK_HFCLK_SRC_RC: {
|
|
if (CLOCK_HFCLK_IN_16M == hfclk_in) {
|
|
hfclk_param.mclk_src = CLOCK_SRC_RC16M;
|
|
} else if (CLOCK_HFCLK_IN_32M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x08;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
} else if (CLOCK_HFCLK_IN_48M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x0C;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
} else if (CLOCK_HFCLK_IN_64M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x08;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL;
|
|
}
|
|
#if !defined(NO_SUPPORT_HFCLK_BBPLL_96M)
|
|
else if (CLOCK_HFCLK_IN_96M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x0C;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL;
|
|
}
|
|
#endif
|
|
} break;
|
|
#endif
|
|
|
|
case CLOCK_HFCLK_SRC_XTAL: {
|
|
#if defined(HFCLK_SRC_XTAL_IS_32M)
|
|
if (CLOCK_HFCLK_IN_16M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x04;
|
|
hfclk_param.bbpll_clkdiv = 0x03;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
} else if (CLOCK_HFCLK_IN_24M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x06;
|
|
hfclk_param.bbpll_clkdiv = 0x03;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
}else if (CLOCK_HFCLK_IN_32M == hfclk_in) {
|
|
#if (CONFIG_HFCLK_IS_OSC32M_PLL_32M)
|
|
hfclk_param.bbpll_loopdiv = 0x04;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
#else
|
|
hfclk_param.mclk_src = CLOCK_SRC_OSC;
|
|
#endif
|
|
} else if (CLOCK_HFCLK_IN_48M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x06;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
} else if (CLOCK_HFCLK_IN_64M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x04;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL;
|
|
}
|
|
#if !defined(NO_SUPPORT_HFCLK_BBPLL_96M)
|
|
else if (CLOCK_HFCLK_IN_96M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x06;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL;
|
|
}
|
|
#endif
|
|
#elif defined(HFCLK_SRC_XTAL_IS_24M)
|
|
if (CLOCK_HFCLK_IN_16M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x04;
|
|
hfclk_param.bbpll_clkdiv = 0x02;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
} else if (CLOCK_HFCLK_IN_24M == hfclk_in) {
|
|
#if (CONFIG_HFCLK_IS_OSC24M_PLL_24M)
|
|
hfclk_param.bbpll_loopdiv = 0x04;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
#else
|
|
hfclk_param.mclk_src = CLOCK_SRC_OSC;
|
|
#endif
|
|
} else if (CLOCK_HFCLK_IN_32M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x08;
|
|
hfclk_param.bbpll_clkdiv = 0x02;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
} else if (CLOCK_HFCLK_IN_48M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x04;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL;
|
|
} else if (CLOCK_HFCLK_IN_64M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x10;
|
|
hfclk_param.bbpll_clkdiv = 0x02;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL_DIV;
|
|
}
|
|
#if !defined(NO_SUPPORT_HFCLK_BBPLL_96M)
|
|
else if (CLOCK_HFCLK_IN_96M == hfclk_in) {
|
|
hfclk_param.bbpll_loopdiv = 0x08;
|
|
hfclk_param.bbpll_clkdiv = 0x01;
|
|
hfclk_param.mclk_src = CLOCK_SRC_BBPLL;
|
|
}
|
|
#endif
|
|
#endif
|
|
} break;
|
|
}
|
|
xc_hfclk_set(hfclk_param);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_lfclk_set
|
|
* @details Low speed clock setting
|
|
* @param[in] CLOCK_LFCLK_Src_Typedef lfclk_src
|
|
* @param[in] CLOCK_LFCLK_In_Typedef lfclk_in
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_lfclk_set(CLOCK_LFCLK_Src_Typedef lfclk_src,
|
|
CLOCK_LFCLK_In_Typedef lfclk_in)
|
|
{
|
|
clock_cb.lfclk_src = lfclk_src;
|
|
clock_cb.lfclk_in = lfclk_in;
|
|
|
|
#if !defined(NO_SUPPORT_LFCLK_XTAL_32768)
|
|
if (lfclk_src == CLOCK_LFCLK_SRC_XTAL)
|
|
{
|
|
GPIO_InitCfg_t gpio_cfg = {0};
|
|
|
|
gpio_cfg.Mux = GPIO_Mux0;
|
|
gpio_cfg.FunSel = GPIO_Dx;
|
|
gpio_cfg.Dir = GPIO_DIR_INPUT;
|
|
gpio_cfg.Pull = GPIO_NOPULL;
|
|
gpio_cfg.Int = NOT_INT;
|
|
gpio_cfg.Pin = 20;
|
|
xc_gpio_init(&gpio_cfg);
|
|
gpio_cfg.Pin = 21;
|
|
xc_gpio_init(&gpio_cfg);
|
|
|
|
cprao_aon_xtl32k_val__xtl32k_v__setf(0x01);
|
|
cprao_aon_xtl32k_val__xtl32k_en__setf(ENABLE);
|
|
cprao_aon_ctl_clk32k__osc32k_sel__setf(2);
|
|
}
|
|
else if (lfclk_src == CLOCK_LFCLK_SRC_RC)
|
|
{
|
|
}
|
|
#endif
|
|
}
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_init_cfg
|
|
* @details Configure the clock initially
|
|
* @param[in] CLOCK_InitCfg_t *clock_cfg
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_clock_init_cfg(CLOCK_InitCfg_t *clock_cfg)
|
|
{
|
|
xc_clock_hfclk_set(clock_cfg->hfclk_src, clock_cfg->hfclk_in);
|
|
xc_clock_lfclk_set(clock_cfg->lfclk_src, clock_cfg->lfclk_in);
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_hfclk_in_get
|
|
* @details Gets the current high speed clock ( system clock )
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval clock_cb.hfclk_in
|
|
****************************************************************************************
|
|
*/
|
|
CLOCK_HFCLK_In_Typedef xc_clock_hfclk_in_get(void) { return clock_cb.hfclk_in; }
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_lfclk_in_get
|
|
* @details Gets the current low speed clock ( Low power clock )
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval clock_cb.lfclk_in
|
|
****************************************************************************************
|
|
*/
|
|
CLOCK_LFCLK_In_Typedef xc_clock_lfclk_in_get(void) { return clock_cb.lfclk_in; }
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_hfclk_src_get
|
|
* @details Obtain the current high-speed source clock
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval clock_cb.hfclk_src
|
|
****************************************************************************************
|
|
*/
|
|
CLOCK_HFCLK_Src_Typedef xc_clock_hfclk_src_get(void) { return clock_cb.hfclk_src; }
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_clock_lfclk_src_get
|
|
* @details Obtain the current low-speed source clock
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval clock_cb.lfclk_src
|
|
****************************************************************************************
|
|
*/
|
|
CLOCK_LFCLK_Src_Typedef xc_clock_lfclk_src_get(void) { return clock_cb.lfclk_src; }
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_systick_unit_get
|
|
* @details Obtain the current systick unit
|
|
* @param[in]
|
|
* @param[out] void
|
|
* @retval clock_cb.lfclk_src
|
|
****************************************************************************************
|
|
*/
|
|
Systick_Unit_Typedef xc_systick_unit_get(void) { return clock_cb.systick_unit; }
|
|
|
|
#if defined(LORA_CLOCK_PLL_CONFIG)
|
|
void xc_lora_clock_bbpll_common_cfg()
|
|
{
|
|
cpr_rf_reg1__rf24g_rstn_reg__setf(DISABLE);
|
|
cpr_rf_reg1__rf24g_rstn_reg__setf(ENABLE);
|
|
// cpr_rf_reg1__rf24g_mclk_div__setf(1);
|
|
cpr_rf_reg1__rf24g_hclk_en__setf(ENABLE);
|
|
cpr_rf_reg1__rf24g_mclk_en__setf(ENABLE);
|
|
cprao_aon_coreldo_en_set(ENABLE);
|
|
}
|
|
#endif // defined(LORA_CLOCK_PLL_CONFIG)
|
|
|
|
#if !defined(NO_SUPPORT_ROM_FMC_SPI)
|
|
__RAM_CODE void fmc_status_wait_idle_rom(void)
|
|
{
|
|
typedef void (*rom_function)(void);
|
|
rom_function xc_fmc_status_wait_idle_rom = (rom_function)(XC_FMC_STATUS_WAIT_IDLE);
|
|
xc_fmc_status_wait_idle_rom();
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_write_nbyte_rom(uint8_t *txdata, uint16_t size)
|
|
{
|
|
typedef void (*rom_function)(uint8_t *rom_txdata, uint16_t rom_size);
|
|
rom_function xc_fmc_spi_write_nbyte_rom = (rom_function)(XC_FMC_SPI_WRITE_NBYTE);
|
|
xc_fmc_spi_write_nbyte_rom(txdata, size);
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_read_nbyte_rom(uint8_t *rxdata, uint16_t size)
|
|
{
|
|
typedef void (*rom_function)(uint8_t *rom_rxdata, uint16_t rom_size);
|
|
rom_function xc_fmc_spi_read_nbyte_rom = (rom_function)(XC_FMC_SPI_READ_NBYTE);
|
|
xc_fmc_spi_read_nbyte_rom(rxdata, size);
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_enable_rom(uint8_t dfs)
|
|
{
|
|
typedef void (*rom_function)(uint8_t rom_dfs);
|
|
rom_function xc_fmc_spi_enable_rom = (rom_function)(XC_FMC_SPI_ENABLE);
|
|
xc_fmc_spi_enable_rom(dfs);
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_disable_rom(void)
|
|
{
|
|
typedef void (*rom_function)(void);
|
|
rom_function xc_fmc_spi_disable_rom = (rom_function)(XC_FMC_SPI_DISABLE);
|
|
xc_fmc_spi_disable_rom();
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_init_oprt_rom(void)
|
|
{
|
|
typedef void (*rom_function)(void);
|
|
rom_function xc_fmc_spi_init_oprt_rom = (rom_function)(XC_FMC_SPI_INIT_OPRT);
|
|
xc_fmc_spi_init_oprt_rom();
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_flash_power_down_rom(void)
|
|
{
|
|
typedef void (*rom_function)(void);
|
|
rom_function xc_fmc_spi_flash_power_down_rom = (rom_function)(XC_FMC_SPI_FLASH_POWER_DOWN);
|
|
xc_fmc_spi_flash_power_down_rom();
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_flash_wake_up_rom(void)
|
|
{
|
|
typedef void (*rom_function)(void);
|
|
rom_function xc_fmc_spi_flash_wake_up_rom = (rom_function)(xc_fmc_SPI_FLASH_WAKE_UP);
|
|
xc_fmc_spi_flash_wake_up_rom();
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_flash_erase_sector_rom(uint32_t addr)
|
|
{
|
|
typedef void (*rom_function)(uint32_t rom_addr);
|
|
rom_function xc_fmc_spi_flash_erase_sector_rom = (rom_function)(XC_FMC_SPI_FLASH_ERASE_SECTOR);
|
|
xc_fmc_spi_flash_erase_sector_rom(addr);
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_flash_erase_page_rom(uint32_t addr)
|
|
{
|
|
typedef void (*rom_function)(uint32_t rom_addr);
|
|
rom_function xc_fmc_spi_flash_erase_page_rom = (rom_function)(XC_FMC_SPI_FLASH_ERASE_PAGE);
|
|
xc_fmc_spi_flash_erase_page_rom(addr);
|
|
}
|
|
|
|
#ifndef FAST_SPI
|
|
__RAM_CODE void fmc_spi_flash_write_page_rom(uint32_t addr, uint8_t *data, uint16_t size)
|
|
{
|
|
typedef void (*rom_function)(uint32_t rom_addr, uint8_t *rom_data, uint16_t rom_size);
|
|
rom_function xc_fmc_spi_flash_write_page_rom = (rom_function)(XC_FMC_SPI_FLASH_WRITE_PAGE);
|
|
xc_fmc_spi_flash_write_page_rom(addr, data, size);
|
|
}
|
|
#else
|
|
__RAM_CODE void fmc_spi_flash_write_page_rom(uint32_t addr, uint8_t *data, uint16_t size)
|
|
{
|
|
typedef void (*rom_function)(uint32_t rom_addr, uint8_t *rom_data, uint16_t rom_size);
|
|
rom_function xc_fmc_spi_flash_write_page_rom = (rom_function)(XC_FMC_FAST_SPI_FLASH_WRITE_PAGE);
|
|
xc_fmc_spi_flash_write_page_rom(addr, data, size);
|
|
}
|
|
#endif
|
|
|
|
__RAM_CODE void fmc_spi_otp_read_page_rom(uint32_t addr, uint8_t *data, uint16_t size)
|
|
{
|
|
typedef void (*rom_function)(uint32_t rom_addr, uint8_t *rom_data, uint16_t rom_size);
|
|
rom_function xc_fmc_spi_otp_read_page_rom = (rom_function)(XC_FMC_SPI_OTP_READ_PAGE);
|
|
xc_fmc_spi_otp_read_page_rom(addr, data, size);
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_flash_read_page_rom(uint32_t addr, uint8_t *data, uint16_t size)
|
|
{
|
|
typedef void (*rom_function)(uint32_t rom_addr, uint8_t *rom_data, uint16_t rom_size);
|
|
rom_function xc_fmc_spi_flash_read_page_rom = (rom_function)(XC_FMC_SPI_FLASH_READ_PAGE);
|
|
xc_fmc_spi_flash_read_page_rom(addr, data, size);
|
|
}
|
|
|
|
__RAM_CODE uint8_t fmc_spi_flash_write_rom(uint32_t addr, uint8_t *buff, uint16_t size)
|
|
{
|
|
typedef uint8_t (*rom_function)(uint32_t rom_addr, uint8_t *rom_buff, uint16_t rom_size);
|
|
rom_function xc_fmc_spi_flash_write_rom = (rom_function)(XC_FMC_SPI_FLASH_WRITE);
|
|
xc_fmc_spi_flash_write_rom(addr, buff, size);
|
|
return 0;
|
|
}
|
|
|
|
__RAM_CODE uint8_t fmc_spi_flash_read_rom(uint32_t addr, uint8_t *buff, uint16_t size)
|
|
{
|
|
typedef uint8_t (*rom_function)(uint32_t rom_addr, uint8_t *rom_buff, uint16_t rom_size);
|
|
rom_function xc_fmc_spi_flash_read_rom = (rom_function)(XC_FMC_SPI_FLASH_READ);
|
|
xc_fmc_spi_flash_read_rom(addr, buff, size);
|
|
return 0;
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_flash_ruid_rom(uint8_t *ruid)
|
|
{
|
|
typedef void (*rom_function)(uint8_t *rom_ruid);
|
|
rom_function xc_fmc_spi_flash_ruid_rom = (rom_function)(XC_FMC_SPI_FLASH_RUID);
|
|
xc_fmc_spi_flash_ruid_rom(ruid);
|
|
}
|
|
|
|
__RAM_CODE void fmc_spi_flash_rdid_rom(uint8_t *rdid)
|
|
{
|
|
typedef void (*rom_function)(uint8_t *rom_rdid);
|
|
rom_function xc_fmc_spi_flash_rdid_rom = (rom_function)(XC_FMC_SPI_FLASH_RDID);
|
|
xc_fmc_spi_flash_rdid_rom(rdid);
|
|
}
|
|
#endif // NO_SUPPORT_ROM_FMC_SPI
|
|
|
|
#if defined(XC62XX_ADC_CALI_PARA)
|
|
extern uint16_t extract32_16(uint32_t val);
|
|
bool adc_2v4_calibrate_read(uint16_t * adc_calibrate)
|
|
{
|
|
uint16_t high ;
|
|
uint16_t low;
|
|
uint32_t spi_buff[32];
|
|
GLOBAL_INT_DISABLE();
|
|
xc_fmc_spi_init_oprt();
|
|
xc_fmc_spi_flash_wake_up();
|
|
xc_fmc_spi_otp_read_page(OTP_PROGRAM_PAGE_1,(uint8_t *)spi_buff,16);
|
|
|
|
high = spi_buff[0] >> 16;
|
|
low = spi_buff[0] & 0xFFFF;
|
|
high = (high << 8) | (high >> 8);
|
|
low = (low << 8) | (low >> 8);
|
|
|
|
GLOBAL_INT_RESTORE();
|
|
if(high == ((~low)&0x0000ffff))
|
|
{
|
|
*adc_calibrate = extract32_16(spi_buff[0] << 16);
|
|
DEBUG("%s,%d\n",__func__,__LINE__);
|
|
return true;
|
|
}else
|
|
{
|
|
DEBUG("%s,%d\n",__func__,__LINE__);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void adc_channel_gpio_config(ADC_ChannelTypeDef_t Channel)
|
|
{
|
|
if (Channel >= ADC_CH_NUM)
|
|
return;
|
|
|
|
GPIO_InitCfg_t GPIO_InitCfg;
|
|
|
|
GPIO_InitCfg.Mux = GPIO_Mux0;
|
|
GPIO_InitCfg.FunSel = GPIO_Dx;
|
|
GPIO_InitCfg.Dir = GPIO_DIR_INPUT;
|
|
GPIO_InitCfg.Pull = GPIO_NOPULL;
|
|
GPIO_InitCfg.Int = NOT_INT;
|
|
|
|
switch (Channel) {
|
|
case ADC_CH0_PIN10:
|
|
GPIO_InitCfg.Pin = GPIO_10;
|
|
break;
|
|
case ADC_CH1_PIN9:
|
|
GPIO_InitCfg.Pin = GPIO_9;
|
|
break;
|
|
case ADC_CH2_PIN19:
|
|
GPIO_InitCfg.Pin = GPIO_19;
|
|
break;
|
|
case ADC_CH3_PIN18:
|
|
GPIO_InitCfg.Pin = GPIO_18;
|
|
break;
|
|
case ADC_CH4_PIN0:
|
|
GPIO_InitCfg.Pin = GPIO_0;
|
|
break;
|
|
case ADC_CH5_PIN1:
|
|
GPIO_InitCfg.Pin = GPIO_1;
|
|
break;
|
|
case ADC_CH6_PIN4:
|
|
GPIO_InitCfg.Pin = GPIO_4;
|
|
break;
|
|
case ADC_CH7_PIN5:
|
|
GPIO_InitCfg.Pin = GPIO_5;
|
|
break;
|
|
case ADC_CH8_PIN2:
|
|
GPIO_InitCfg.Pin = GPIO_2;
|
|
break;
|
|
case ADC_CH9_PIN3:
|
|
GPIO_InitCfg.Pin = GPIO_3;
|
|
break;
|
|
case ADC_CH10_PIN6:
|
|
GPIO_InitCfg.Pin = GPIO_6;
|
|
break;
|
|
case ADC_CH11_PIN7:
|
|
GPIO_InitCfg.Pin = GPIO_7;
|
|
break;
|
|
case ADC_CH13_TEMP:
|
|
cpr_opa_ctrl_reg__en_temp_sensor__setf(ENABLE);
|
|
return;
|
|
default:
|
|
return;
|
|
}
|
|
xc_gpio_init(&GPIO_InitCfg);
|
|
}
|
|
#endif // XC62XX_ADC_CALI_PARA
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_system_param_check
|
|
* @details Check the configuration of bbpldo, bor, rf and wdt parameters.
|
|
* @param[in] void
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_system_param_check(void)
|
|
{
|
|
uint32_t hf_clk = xc_clock_hfclk_in_get();
|
|
uint8_t expected_bbldo;
|
|
uint8_t bbldo_adj = cprao_aon_bbldo_adj_get() & 0xf;
|
|
uint8_t lpoldo_adj = cprao_aon_lpoldo_adj_get() & 0xf;
|
|
uint32_t temp_ana2 = ANA2_REG;
|
|
uint32_t temp_ana17 = ANA17_REG;
|
|
uint32_t temp_ana24 = ANA24_REG;
|
|
|
|
uint8_t errors = 0;
|
|
|
|
/* rf param check */
|
|
if (((temp_ana17 >> 8) & 0xff) != 0xee) {
|
|
printf("Err:ana17[8:15] must be 0xee\n");
|
|
errors |= 0x01;
|
|
}
|
|
if (((temp_ana24 >> 3) & 0x7) != 0x5) {
|
|
printf("Err:ana24[3:5] must be 0x5\n");
|
|
errors |= 0x02;
|
|
}
|
|
|
|
#if defined(XC62XX)
|
|
if ((temp_ana2 & 0xE1E0) != 0xe0c0) {
|
|
printf("Err:ana2[5:8] must be 0x6,ana2[13:15] must be 0x7\n");
|
|
errors |= 0x01;
|
|
}
|
|
#endif
|
|
|
|
/* wdt param check */
|
|
if (cpr_lp_ctl__wdt_tclk_en__getf() == DISABLE) {
|
|
printf("Err:wdt disabled, must be enabled\n");
|
|
errors |= 0x04;
|
|
}
|
|
if (cpr_lp_ctl__wdt_pclk_sel__getf() != WDT_WORK_32K) {
|
|
printf("Err:wdt clk is not 32K, must be 32K\n");
|
|
errors |= 0x08;
|
|
}
|
|
|
|
/* bor param check */
|
|
#if (defined(BOR_VERSION_IS_V2) || defined(XC62XX))
|
|
if ((cprao_aon_bor_ctr_reg0__bor_rstn_mask__getf() != 0) ||
|
|
(cprao_aon_bor_ctr_reg0__bor_intr_mask__getf() != 1) ||
|
|
(cprao_aon_bor_ctr_reg0__en_bor__getf() != 1))
|
|
{
|
|
printf("Err:bor cfg err\n");
|
|
errors |= 0x10;
|
|
}
|
|
#else
|
|
if ((cprao_aon_bor_ctr_reg0__bor_rstn_mask__getf() != 1) ||
|
|
(cprao_aon_bor_ctr_reg0__bor_intr_mask__getf() != 0) ||
|
|
(cprao_aon_bor_ctr_reg0__en_bor__getf() != 1))
|
|
{
|
|
printf("Err:bor cfg err\n");
|
|
errors |= 0x10;
|
|
}
|
|
if (!(NVIC->ISER[0] & (1UL << (uint8_t)MPU_IRQn)))
|
|
{
|
|
printf("Err:MPU interrupt is not enabled, must be enabled\n");
|
|
errors |= 0x10;
|
|
}
|
|
#endif
|
|
|
|
/* bblpo param check */
|
|
if (hf_clk <= 32000000) {
|
|
expected_bbldo = 0xc;
|
|
} else if (hf_clk <= 64000000) {
|
|
expected_bbldo = 0xd;
|
|
} else {
|
|
expected_bbldo = 0xf;
|
|
}
|
|
|
|
if (bbldo_adj != expected_bbldo) {
|
|
printf("Err:bbldo!=0x%x\n", expected_bbldo);
|
|
errors |= 0x20;
|
|
}
|
|
|
|
/* lpoldo param check */
|
|
if (lpoldo_adj != 0x7) {
|
|
printf("Err:lpoldo must be 0x7\n");
|
|
errors |= 0x40;
|
|
}
|
|
|
|
if (errors == 0) {
|
|
printf("system param check: OK\n");
|
|
}
|
|
}
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief xc_system_param_check_rf24g
|
|
* @details Check the configuration of bbpldo, bor, rf and wdt parameters in the 2.4G SDK.
|
|
* @param[in] void
|
|
* @param[out] void
|
|
* @retval void
|
|
****************************************************************************************
|
|
*/
|
|
void xc_system_param_check_rf24g(void)
|
|
{
|
|
uint32_t hf_clk = xc_clock_hfclk_in_get();
|
|
uint8_t bbldo_adj = cprao_aon_bbldo_adj_get() & 0xf;
|
|
uint8_t lpoldo_adj = cprao_aon_lpoldo_adj_get() & 0xf;
|
|
uint32_t temp_ana2 = ANA2_REG;
|
|
uint32_t temp_ana17 = ANA17_REG;
|
|
uint32_t temp_ana24 = ANA24_REG;
|
|
|
|
uint8_t errors = 0;
|
|
|
|
/* rf param check */
|
|
if (((temp_ana17 >> 8) & 0xff) != 0xee) {
|
|
printf("Err:ana17[8:15] must be 0xee\n");
|
|
errors |= 0x01;
|
|
}
|
|
if (((temp_ana24 >> 3) & 0x7) != 0x5) {
|
|
printf("Err:ana24[3:5] must be 0x5\n");
|
|
errors |= 0x02;
|
|
}
|
|
#if defined(XC62XX)
|
|
if ((temp_ana2 & 0xE1E0) != 0xe0c0) {
|
|
printf("Err:ana2[5:8] must be 0x6,ana2[13:15] must be 0x7\n");
|
|
errors |= 0x01;
|
|
}
|
|
#endif
|
|
|
|
/* wdt param check */
|
|
if (cpr_lp_ctl__wdt_tclk_en__getf() == DISABLE) {
|
|
printf("Err:wdt disabled, must be enabled\n");
|
|
errors |= 0x04;
|
|
}
|
|
if (cpr_lp_ctl__wdt_pclk_sel__getf() != WDT_WORK_32K) {
|
|
printf("Err:wdt clk is not 32K, must be 32K\n");
|
|
errors |= 0x08;
|
|
}
|
|
|
|
/* bor param check */
|
|
#if (defined(BOR_VERSION_IS_V2) || defined(XC62XX))
|
|
if ((cprao_aon_bor_ctr_reg0__bor_rstn_mask__getf() != 0) ||
|
|
(cprao_aon_bor_ctr_reg0__bor_intr_mask__getf() != 1) ||
|
|
(cprao_aon_bor_ctr_reg0__en_bor__getf() != 1))
|
|
{
|
|
printf("Err:bor cfg err\n");
|
|
errors |= 0x10;
|
|
}
|
|
#else
|
|
if ((cprao_aon_bor_ctr_reg0__bor_rstn_mask__getf() != 1) ||
|
|
(cprao_aon_bor_ctr_reg0__bor_intr_mask__getf() != 0) ||
|
|
(cprao_aon_bor_ctr_reg0__en_bor__getf() != 1))
|
|
{
|
|
printf("Err:bor cfg err\n");
|
|
errors |= 0x10;
|
|
}
|
|
if (!(NVIC->ISER[0] & (1UL << (uint8_t)MPU_IRQn)))
|
|
{
|
|
printf("Err:MPU interrupt is not enabled, must be enabled\n");
|
|
errors |= 0x10;
|
|
}
|
|
#endif
|
|
|
|
/* bblpo param check */
|
|
if ((bbldo_adj != 0x0e) && (bbldo_adj != 0x0f) ) {
|
|
printf("Err:bbldo must be 0x0e or 0x0f\n");
|
|
errors |= 0x20;
|
|
}
|
|
|
|
/* lpoldo param check */
|
|
if (lpoldo_adj != 0x7) {
|
|
printf("Err:lpoldo must be 0x7\n");
|
|
errors |= 0x40;
|
|
}
|
|
|
|
if (errors == 0) {
|
|
printf("system param check: OK\n");
|
|
}
|
|
}
|
|
|
|
#endif // XC_CHECK(XC_CLOCK_ENABLED)
|