Files
hc32f460_boot/hdl/hdl_clk.c
T

133 lines
4.1 KiB
C
Raw Normal View History

2026-04-23 13:49:53 +08:00
#include "hdl_clk.h"
/********************************************************************************************************
* @鍑芥暟鍚? hdl_xtal_init
* @鎻忚堪 澶栭儴鏅舵尟鍒濆鍖?
* @鍙傛暟 鏃?
* @杩斿洖鍊? 鏃?
* @娉ㄦ剰 鏃?
2026-04-23 13:49:53 +08:00
********************************************************************************************************/
#if USING_XTAL
static void hdl_xtal_init(void)
{
stc_clock_xtal_init_t stcXtalInit;
/* XTAL 寮曡剼閰嶇疆 */
2026-04-23 13:49:53 +08:00
GPIO_AnalogCmd(GPIO_PORT_H, GPIO_PIN_00 | GPIO_PIN_01, ENABLE);
(void)CLK_XtalStructInit(&stcXtalInit);
/* 閰嶇疆XTAL鍜屽惎鐢╔TAL */
2026-04-23 13:49:53 +08:00
stcXtalInit.u8State = CLK_XTAL_ON;
stcXtalInit.u8Mode = CLK_XTAL_MD_OSC;
stcXtalInit.u8Drv = CLK_XTAL_DRV_ULOW;
stcXtalInit.u8StableTime = CLK_XTAL_STB_2MS;
(void)CLK_XtalInit(&stcXtalInit);
}
#endif
/********************************************************************************************************
* @鍑芥暟鍚? hdl_pll_init
* @鎻忚堪 閿佺浉鐜€嶉鍒濆鍖?
* @鍙傛暟 鏃?
* @杩斿洖鍊? 鏃?
* @娉ㄦ剰 鏃?
2026-04-23 13:49:53 +08:00
********************************************************************************************************/
static void hdl_pll_init(void)
{
stc_clock_pll_init_t stcMPLLInit;
(void)CLK_PLLStructInit(&stcMPLLInit);
/* MPLL 閰嶇疆 */
2026-04-23 13:49:53 +08:00
/* 16MHz/M*N = 16/2*50/2 = 200MHz */
stcMPLLInit.PLLCFGR = 0UL;
stcMPLLInit.PLLCFGR_f.PLLM = (2UL - 1UL);
stcMPLLInit.PLLCFGR_f.PLLN = (50UL - 1UL);
stcMPLLInit.PLLCFGR_f.PLLP = (2UL - 1UL);
stcMPLLInit.PLLCFGR_f.PLLQ = (2UL - 1UL);
stcMPLLInit.PLLCFGR_f.PLLR = (2UL - 1UL);
stcMPLLInit.u8PLLState = CLK_PLL_ON;
stcMPLLInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_HRC; /* HRC = 16MHz */
(void)CLK_PLLInit(&stcMPLLInit);
}
/********************************************************************************************************
* @鍑芥暟鍚? hdl_clk_init
* @鎻忚堪 鏃堕挓鍒濆鍖?
* @鍙傛暟 鏃?
* @杩斿洖鍊? 鏃?
* @娉ㄦ剰 鏃?
2026-04-23 13:49:53 +08:00
********************************************************************************************************/
void hdl_clk_init(void)
{
/* 瑙i櫎鍐欎繚鎶?*/
2026-04-23 13:49:53 +08:00
LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
/* 璁剧疆鏃堕挓鍒嗛 */
2026-04-23 13:49:53 +08:00
CLK_SetClockDiv(CLK_BUS_CLK_ALL, (CLK_HCLK_DIV1 | CLK_EXCLK_DIV2 | CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | \
CLK_PCLK2_DIV4 | CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2));
/* SRAM鍒濆鍖栧寘鎷/鍐欑瓑寰呭懆鏈熻缃?*/
2026-04-23 13:49:53 +08:00
SRAM_SetWaitCycle(SRAM_SRAM_ALL, SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1);
SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0);
/* 闂瓨璇诲彇绛夊緟鍛ㄦ湡璁剧疆 */
2026-04-23 13:49:53 +08:00
EFM_SetWaitCycle(EFM_WAIT_CYCLE5);
/* XTAL 鍒濆鍖?*/
2026-04-23 13:49:53 +08:00
// hdl_xtal_init();
/* XTAL32 鍒濆鍖?*/
2026-04-23 13:49:53 +08:00
/* MPLL 鍒濆鍖?*/
2026-04-23 13:49:53 +08:00
hdl_pll_init();
/* enable LRC */
/* enable HRC */
/* 3 cycles for 126MHz ~ 200MHz */
GPIO_SetReadWaitCycle(GPIO_RD_WAIT3);
/* 鍒囨崲椹卞姩鑳藉姏 */
2026-04-23 13:49:53 +08:00
PWC_HighSpeedToHighPerformance();
EFM_DataCacheResetCmd(ENABLE);
EFM_DataCacheResetCmd(DISABLE);
/* Enable cache */
EFM_CacheCmd(ENABLE);
/* 浣胯兘鍐欎繚鎶?*/
2026-04-23 13:49:53 +08:00
LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_GPIO | LL_PERIPH_SRAM);
/* 璁剧疆绯荤粺鏃堕挓婧?*/
2026-04-23 13:49:53 +08:00
CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
/* 浣胯兘systick */
2026-04-23 13:49:53 +08:00
(void)SysTick_Init(1000U);
}
void hdl_delay_us(uint16_t us)
{
for(int i=0;i<us;i++)
{
for(int j=0;j<35;j++)
{
__NOP();
}
}
}
void hdl_delay_ms(uint16_t ms)
{
for(int i=0;i<ms;i++)
{
for(int j=0;j<13000;j++)
{
__NOP();
}
}
}