HC32F460 USB时钟配置

一、基础知识及寄存器介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、代码修改

在usb_bsp.c中修改代码
修改后代码:


```c
/**
 * @brief  USB clock initial
 * @param  None
 * @retval None
 */
static void UsbClockIni(void)
{
    stc_clock_pllx_init_t stcUpllInit;

    (void)CLK_PLLxStructInit(&stcUpllInit);
    stcUpllInit.u8PLLState = CLK_PLLX_ON;
    stcUpllInit.PLLCFGR = 0UL;
    stcUpllInit.PLLCFGR_f.PLLM = (3UL  - 1UL);
    stcUpllInit.PLLCFGR_f.PLLN = (84UL - 1UL);
    stcUpllInit.PLLCFGR_f.PLLR = (7UL  - 1UL);
    stcUpllInit.PLLCFGR_f.PLLQ = (7UL - 1UL);
    stcUpllInit.PLLCFGR_f.PLLP = (7UL - 1UL); //48M
    (void)CLK_PLLxInit(&stcUpllInit);

    /* Set USB clock source */
    CLK_SetUSBClockSrc(CLK_USBCLK_PLLXP);
}
代码解析,
USB时钟频率需要调整到48M

> 修改前:8M/2*84/7 = 48M 
> 修改后:12M/3*84/7 = 48M

### HC32F460 微控制器 PLL 时钟配置方法 HC32F460 是一款基于 ARM Cortex-M 的高性能微控制器,其内部集成了多个可编程锁相环(PLL),用于生成系统所需的高频时钟信号。以下是关于如何配置 HC32F460 的 MPLL 和其他相关模块的具体方法。 #### 配置外部晶振频率 在 `system_hc32f46x.h` 文件中定义外部高速晶体振荡器的频率值。如果使用的是 16 MHz 外部晶振,则可以这样设置: ```c #define XTAL_VALUE ((uint32_t)16000000) /*!< External high speed OSC freq. */ #if !defined(XTAL_VALUE) #define XTAL_VALUE ((uint32_t)8000000) /*!< Default to 8MHz if not defined */ #endif ``` 此部分代码通过宏定义指定外部晶振的实际工作频率[^2]。 #### 初始化 MPLL 参数结构体 为了实现特定的目标时钟频率(例如 200 MHz),需要合理计算并设定 MPLL 的分频因子和倍频因子。以下是一个典型的 MPLL 配置过程: ```c stc_mpll_init_t stcMpllInit; MEM_ZERO_STRUCT(stcMpllInit); /* MPLL configuration formula: (XTAL / pllmDiv * plln / PllpDiv = Target Frequency) */ stcMpllInit.PLLCFGR_f.PLLM = 3UL - 1UL; /* Input divider, XTAL divided by this value */ stcMpllInit.PLLCFGR_f.PLLN = 100UL - 1UL; /* Multiplier factor */ stcMpllInit.PLLCFGR_f.PLLP = 2UL - 1UL; /* Output divider for main system clock */ stcMpllInit.PLLCFGR_f.PLLQ = 2UL - 1UL; /* Divider for other clocks like USB OTG FS */ stcMpllInit.PLLCFGR_f.PLLR = 2UL - 1UL; /* Additional output divider */ CLK_SetPllSource(ClkPllSrcXTAL); /* Select external crystal oscillator as the source */ CLK_MpllConfig(&stcMpllInit); CLK_EnableMpll(true); /* Enable MPLL after configuring it */ ``` 这段代码展示了如何利用结构体变量来存储 MPLL 各项参数,并调用库函数完成实际硬件寄存器写入操作[^1]^。 #### 设置 PLL 输入源 选择合适的 PLL 输入源对于稳定性和精度至关重要。通常情况下,默认采用外部晶振作为输入源。下面是从引用材料提取的相关 API 使用说明: ```c void CLK_SetPllSource(en_clk_pll_source_t enPllSrc) { DDL_ASSERT(IS_PLL_SOURCE(enPllSrc)); ENABLE_CLOCK_REG_WRITE(); M4_SYSREG->CMU_PLLCFGR_f.PLLSRC = enPllSrc; /* Set PLL source according to parameter */ DISABLE_CLOCK_REG_WRITE(); } ``` 该函数允许开发者灵活切换不同的时钟源,比如内部 RC 或者外部晶振等选项[^3]。 #### 获取当前所有时钟状态 最后,在调试阶段或者运行期间可能还需要动态监测各个子系统的实时时钟数值。为此提供了一个辅助工具函数如下所示: ```c void get_all_clock(void) { stc_clk_freq_t stcClkFreq; stc_pll_clk_freq_t stcPllClkFreq; MEM_ZERO_STRUCT(stcClkFreq); MEM_ZERO_STRUCT(stcPllClkFreq); CLK_GetClockFreq(&stcClkFreq); /* Retrieve general purpose frequencies */ CLK_GetPllClockFreq(&stcPllClkFreq); /* Get detailed information about each PLL outputs */ } ``` 以上就是针对 HC32F460 芯片进行精确而高效的 PLL 时钟树定制化设计的主要流程概述[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值