HC32 启动初始化配置

这篇博客介绍了HC32芯片库函数中ddl_config.h的配置,特别是DDL_ICG_ENABLE对芯片正常运行的重要性。在使用DLL库时,必须开启ICG功能。当DDL_ICG_ENABLE设置为DDL_OFF时,程序可能无法运行。解决方案是直接在配置文件中将其更改为DDL_ON,或者在main.c中添加配置代码。初始化配置数据会被加载到特定地址,全1的预留区域确保芯片正常工作。

HC32 启动初始化配置

配置ddl_config.h

官方提供的库函数中有ddl_config.h文件,改文件是管理库函数是否加载配置文件。部分内容如下:

/*******************************************************************************
 * Global pre-processor symbols/macros ('#define')
 ******************************************************************************/
/* Chip module on-off define */
#define DDL_ON                                      (1U)
#define DDL_OFF                                     (0U)

/**
 * @brief This is the list of modules to be used in the Device Driver Library.
 * Select the modules you need to use to DDL_ON.
 * @note DDL_ICG_ENABLE must be turned on(DDL_ON) to ensure that the chip works
 * properly.
 * @note DDL_UTILITY_ENABLE must be turned on(DDL_ON) if using Device Driver
 * Library.
 * @note DDL_PRINT_ENABLE must be turned on(DDL_ON) if using printf function.
 */
#define DDL_ICG_ENABLE                              (DDL_ON)
#define DDL_UTILITY_ENABLE                          (DDL_ON)
#define DDL_PRINT_ENABLE                            (DDL_OFF)
……省略……

在使用到相关的库函数时将对应的地方配置为DLL_ON。

初始化配置( ICG)

芯片复位解除后,硬件电路会读取 FLASH 地址0x00000400H ~0x0000045FH 把数据加载到初始化配置寄存器。地址 0x00000410H~0x0000045FH 为预约功能,请写入全 1 保证芯片正常动作。
在添加官方提供的DLL库后,相关的配置在hc32f4a0_icg.c 文件中可以看到相关的配置。

/**
 * @brief ICG parameters configuration
 */
 /* The ICG area is filled with F by default, HRC = 16MHZ,
    Please modify this value as required */
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
const uint32_t u32ICG[] __attribute__((section(".ARM.__at_0x400"))) =
#elif defined (__GNUC__) && !defined (__CC_ARM)
const uint32_t u32ICG[] __attribute__((section(".icg_sec"))) =
#elif defined (__CC_ARM)
const uint32_t u32ICG[] __attribute__((at(0x400))) =
#elif defined (__ICCARM__)
#pragma location = 0x400
__root static const uint32_t u32ICG[] =
#else
#error "unsupported compiler!!"
#endif
{
    /* ICG 0~3 */
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    /* Reserved 0~3 */
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    /* Reserved 4~7 */
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    /* Reserved 8~11 */
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    /* Reserved 12~15 */
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    /* Reserved 16~19 */
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
    0xFFFFFFFFUL,
};

如果在库函数配置文件中 #define DDL_ICG_ENABLE (DDL_OFF)时,编译后的程序下载到板子上也不会运行。解决办法有两种:

  • 在配置文件中直接打开 #define DDL_ICG_ENABLE (DDL_ON)
  • 在main.c 的文件中添加上面的配置代码,在编译时,程序最后会将相关内容链接到400H地址。
<think> 根据用户的问题,用户希望查找HC32F460的时钟初始化代码。结合提供的引用资料,需要从启动过程、时钟配置和Systick定时器初始化等部分提取相关信息。 引用[^1]提到启动过程分三步:读取地址0x400内容、复位和系统时钟配置、进入main函数。引用[^2][^3]详细说明时钟系统结构,包括MPLL/UPLL配置和时钟源选择。引用[^4]展示了Systick初始化的代码片段,其中涉及HCLK_VALUE的使用。 重点分析引用[^3]的代码片段,它包含时钟源切换的关键函数CLK_SetSysClkSource(),该函数通过设置CMU_CKSWR寄存器选择MPLL作为系统时钟源。另外,引用[^4]的SysTick_Config()函数需要HCLK_VALUE作为参数,说明HCLK频率需要在时钟初始化中确定。 典型时钟初始化流程应包含: 1. 选择时钟源(内部/外部高速时钟) 2. 配置PLL倍频参数 3. 设置系统时钟分频因子 4. 切换系统时钟源到PLL输出 5. 外设时钟使能 由于引用未提供完整代码,根据标准库结构推断,用户可能需要参考官方库文件的system_hc32f46x.c和hc32f46x_clk.c中的时钟配置函数,特别是SystemInit()和CLK_Init()的实现。 需要提醒用户注意:HCLK_VALUE应与实际配置的系统时钟一致,否则会影响Systick等外设定时精度。 </think> 根据参考资料,HC32F460的时钟初始化代码主要涉及系统时钟源选择、PLL配置和时钟切换。核心流程如下(参考官方库实现): ### 1. 系统时钟源配置 ```c /* 选择外部高速时钟(4-24MHz)或内部高速时钟 */ CLK_SetXtalStabTime(CLK_XTALSTB_2MS); // 外部晶振稳定时间 CLK_HclkConfig(CLK_SYSCLK_DIV1); // HCLK分频系数 CLK_PclkConfig(CLK_HCLK_DIV1); // PCLK分频系数 ``` ### 2. PLL倍频器配置(关键步骤) ```c stc_clk_pll_cfg_t pllCfg; pllCfg.pllState = CLK_PLL_ON; pllCfg.pllFreq = CLK_PLL_OUTPUT_200M; // 目标频率(如200MHz) pllCfg.pllSrc = CLK_PLL_SRC_XTAL; // PLL时钟源选择 pllCfg.pllP = CLK_PLL_OUTPUT_DIV2; // P分频 pllCfg.pllQ = CLK_PLL_OUTPUT_DIV4; pllCfg.pllR = CLK_PLL_OUTPUT_DIV2; // R分频(系统时钟用) CLK_PLLConfig(&pllCfg); // 应用PLL配置[^2][^3] ``` ### 3. 切换系统时钟源到PLL ```c /* 等待PLL锁定 */ while(Set != CLK_GetPLLStatus(CLK_PLL_MPLL)) {} /* 切换系统时钟源 */ CLK_SetSysClkSource(CLKSysSrcMPLL); // 设置CMU_CKSWR寄存器[^3] ``` ### 4. SysTick定时器初始化(可选) ```c /* 基于HCLK配置1ms中断 */ SysTick_Config(HCLK_VALUE / 1000); // HCLK_VALUE为系统频率[^4] ``` ### 关键说明: 1. **时钟源选择**:通过`CLK_PLL_SRC_XTAL`/`CLK_PLL_SRC_HRC`选择外部晶振或内部RC 2. **频率计算**:PLL输出频率需满足:$$ f_{out} = \frac{f_{in} \times M}{P \times Q} $$ - $M$为倍频因子(在`pllFreq`中隐含) - $P/Q/R$为分频系数[^2] 3. **寄存器操作**:`CMU_CKSWR`寄存器控制时钟源切换,需解除写保护[^3] 4. **HCLK_VALUE**:该宏在`system_hc32f46x.h`中定义,与实际配置同步 > 完整代码参考官方库:`hc32f46x_clk.c`中的`CLK_Init()`函数实现时钟树配置,`system_hc32f46x.c`中的`SystemInit()`包含启动初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值