打印
[APM32F4]

APM32F407时钟配置详解与晶振修改

[复制链接]
1136|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a976209770|  楼主 | 2023-6-30 23:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
APM32F407与APM32F103系列时钟配置略有不同,在基于103系列上添加了一些407的时钟配置,刚从103切换到407时略有不同,在修改不同晶振时修改的地方也不同,apm32f407库里默认为8M晶振,若要改为25M,需要修改以下地方以下为基于apm32f407sdk的时钟配置详解:
__IO uint32_t i;  // 定义一个用于循环计数的变量i,__IO表示这个变量是易变的,可能会在被中断服务程序修改。

RCM->CTRL_B.HSEEN = BIT_SET;  // 启用高速外部(HSE)时钟。

// 等待HSE时钟就绪或超时
for (i = 0; i < HSE_STARTUP_TIMEOUT; i++)  // 循环等待HSE时钟就绪,或者超时
{
    if (RCM->CTRL_B.HSERDY**)  // 检查HSE时钟是否已经就绪
    {
        break;  // 如果HSE时钟已经就绪,跳出循环
    }
}

if (RCM->CTRL_B.HSERDY**)  // 如果HSE时钟已经就绪
{
    /** Select regulator voltage output Scale 1 mode */
    RCM->APB1CLKEN_B.PMUEN = BIT_SET;  // 启用电源管理单元(PMU)时钟
    PMU->CTRL_B.VOSSEL = BIT_SET;  // 选择电压调节器输出模式为Scale 1

    /** HCLK = SYSCLK / 1*/
    RCM->CFG_B.AHBPSC = 0x0000;  // 设置AHB总线时钟(HCLK)等于系统时钟(SYSCLK)

    /** PCLK2 = HCLK / 2*/
    RCM->CFG_B.APB2PSC = 0x04;  // 设置APB2总线时钟等于HCLK的一半

    /** PCLK1 = HCLK / 4*/
    RCM->CFG_B.APB1PSC = 0x05;  // 设置APB1总线时钟等于HCLK的四分之一

    /** Configure the main PLL */
    RCM->PLL1CFG = PLL_B | (PLL_A << 6) | (((PLL_C >> 1) -1) << 16) |(PLL_D << 24);  // 配置主PLL的分频和倍频系数
    RCM->PLL1CFG_B.PLL1CLKS = 0x01;  // 设置主PLL的时钟源为HSE

    /** Enable the main PLL */
    RCM->CTRL_B.PLL1EN = BIT_SET;  // 启用主PLL

    /** Wait till the main PLL is ready */
    while (RCM->CTRL_B.PLL1RDY** == 0)  // 等待主PLL就绪
    {
    }

    /** Configure Flash prefetch, Instruction cache, Data cache and wait state */
    FMC->ACCTRL = 0x05 | BIT8 | BIT9 | BIT10;  // 配置Flash预取指令、指令缓存、数据缓存和等待状态

    /** Select the main PLL as system clock source */
    RCM->CFG_B.SCLKSEL = RESET;  // 重置系统时钟源选择位
    RCM->CFG_B.SCLKSEL = 0x02;  // 选择主PLL作为系统时钟源

    /** Wait till the main PLL is used as system clock source */
    while ((RCM->CFG_B.SCLKSWSTS) != 0x02)  // 等待主PLL被选为系统时钟源
    {
    }
}
else
{
    /** If HSE fails to start-up, the application will have wrong clock configuration. */
    // 如果HSE启动失败,应用程序的时钟配置将是错误的。
}

对应的PLL定义如下:


/** PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_B) * PLL_A */
#define PLL_B      8

/** USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLL_D */
#define PLL_D      7

#define PLL_A      336
/** SYSCLK = PLL_VCO / PLL_C */
#define PLL_C      2

对应晶振定义如下
#define HSE_VALUE                   ((uint32_t)8000000)

根据时钟树可得,需要把#define PLL_B      8改为25,并且修改
#define HSE_VALUE                   ((uint32_t)8000000)为
#define HSE_VALUE                   ((uint32_t)25000000)
经测试后可以正常使用25M晶振仿真测试

使用特权

评论回复
沙发
yangxiaor520| | 2023-7-1 11:11 | 只看该作者
还是用常规频率通用性更强。

使用特权

评论回复
板凳
dspmana| | 2023-7-5 15:33 | 只看该作者
APM32F407 支持外部晶体振荡器或外部时钟输入源作为系统时钟源。

使用特权

评论回复
地板
modesty3jonah| | 2023-7-6 12:03 | 只看该作者
APM32F407 的外设总线分为两个 APB 总线,APB1 和 APB2。在时钟配置中需要合理设置 APB 分频系数以提供给外设合适的时钟频率。

使用特权

评论回复
5
qiufengsd| | 2023-7-6 12:08 | 只看该作者
如果需要使用外部晶振作为时钟源,确保正确连接并配置相应的参数。

使用特权

评论回复
6
kmzuaz| | 2023-7-6 12:13 | 只看该作者
阅读 APM32F407 的数据手册、参考文档和相关应用笔记

使用特权

评论回复
7
chenci2013| | 2023-7-6 15:37 | 只看该作者
在进行时钟配置时,要考虑系统的低功耗模式需求。

使用特权

评论回复
8
gygp| | 2023-7-6 15:45 | 只看该作者
合理配置时钟源和相应的时钟模块,以便在低功耗模式下能够降低功耗并保持必要的功能。

使用特权

评论回复
9
iyoum| | 2023-7-6 16:18 | 只看该作者
根据应用需求选择合适的时钟源,可以是 HSE(外部晶振或时钟输入源)或 HSI(内部高速时钟)。

使用特权

评论回复
10
mollylawrence| | 2023-7-6 16:37 | 只看该作者
时钟配置是一个关键且复杂的任务,可能会对系统的功能和性能产生重大影响。

使用特权

评论回复
11
minzisc| | 2023-7-6 16:51 | 只看该作者
内部集成了一个高频振荡器,可作为系统时钟源。

使用特权

评论回复
12
wilhelmina2| | 2023-7-6 16:58 | 只看该作者
可通过设置晶振频率和 PLL 倍频系数来配置 HSE 时钟。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

34

帖子

0

粉丝