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晶振仿真测试
|