【STM32】【寄存器】寄存器位读写方式配置系统时钟
使用寄存器位的读写直接配置系统时钟
uint8_t sys_clock_set(uint32_t FrequencyDivide) /*PLLMUL的分频系数*/
{
uint32_t retry = 0; //该参数用来延时
uint8_t retval = 0;
RCC->CR |= 0x00010000; /* 外部高速时钟使能HSEON */
/*结合下面的0x8000,达到执行8000次程序步的时长,变相的实现延时,如果retry执行了0xFFF0次,则报错*/
while (retry < 0XFFF0)
{
__nop();
/* 设置8000个程序步的延时,避免版本BUG */
if (RCC->CR & (1 << 17) && retry > 0X8000) //这里RCC_CR的第17位是HSERDY,可以检测HSE外部时钟有没有开启成功
{
break;
}
retry++; /* 等待HSE RDY */
}
/*如果retry执行了0xFFF0次,则报错*/
if (retry >= 0XFFF0)
{
retval = 1; /* HSE无法就绪 */
}
else /*继续配置系统时钟*/
{
RCC->CFGR = 0X00000400; /* PCLK1(APB1)设置2分频; PCLK2(APB2)不分频; HCLK(AHB)不分频; */
/*设置RCC_CFGR寄存器中第18位到21位PLLMUL的分频为plln*/
FrequencyDivide -= 2; /* 抵消2个单位(因为配置值是从0010开始的, 也就是从2开始) */
RCC->CFGR |= FrequencyDivide << 18; /* 设置PLL值 2~16 */
RCC->CFGR |= 1 << 16; /* 选择HSE作为PLL的输入时钟源 */
/* FLASH_ACR寄存器的描述详见: <<STM32F10xx闪存编程手册>> */
FLASH->ACR = 1 << 4; /* PRFTBE = 1 开启预取缓冲区 */
FLASH->ACR |= 2 << 0; /* LATENCY[2:0] = 2 FLASH两个等待周期 */
RCC->CR |= 1 << 24; /* PLLON = 1, 使能PLL时钟 */
while (!(RCC->CR >> 25)); /* 等待PLL值稳定,25位为PLLRDY的值 */
RCC->CFGR |= 2 << 0; /* SW[1:0] = 2, 选择系统时钟源SYSCLK为PLL输出 */
while (((RCC->CFGR >> 2) & 0X03) != 2); /* 等待PLL作为系统时钟设置成功 */
}
return retval;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战