stm32f4调用内部时钟(完整代码)
·
最近做毕业设计,突然发现自己的外部时钟不准确了,更换了晶振,也更换了芯片,都没得到解决,一怒之下打算用stm32内部时钟,本来以为很麻烦,其实修改起来很简单,把方法给大家分享!亲自测试有效!
首先找到自己的时钟配置文件(.c文件)![]()
点进去,找到下面这几行代码
在它们后面粘贴如下代码:
void HSI_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)
{
__IO uint32_t HSIStartUpStatus = 0;
// 把RCC外设初始化成复位状态
RCC_DeInit();
//使能HSI, HSI=16M
RCC_HSICmd(ENABLE);
// 等待 HSI 就绪
HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
// 只有 HSI就绪之后则继续往下执行
if (HSIStartUpStatus == RCC_CR_HSIRDY)
{
// 调压器电压输出级别配置为1,以便在器件为最大频率
// 工作时使性能和功耗实现平衡
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
PWR->CR |= PWR_CR_VOS;
// HCLK = SYSCLK / 1
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// PCLK2 = HCLK / 2
RCC_PCLK2Config(RCC_HCLK_Div2);
// PCLK1 = HCLK / 4
RCC_PCLK1Config(RCC_HCLK_Div4);
// 如果要超频就得在这里下手啦
// 设置PLL来源时钟,设置VCO分频因子m,设置VCO倍频因子n,
// 设置系统时钟分频因子p,设置OTG FS,SDIO,RNG分频因子q
RCC_PLLConfig(RCC_PLLSource_HSI, m, n, p, q);
// 使能PLL
RCC_PLLCmd(ENABLE);
// 等待 PLL稳定
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/*-----------------------------------------------------*/
//开启 OVER-RIDE模式,以能达到更高频率(F429才有该功能)
// PWR->CR |= PWR_CR_ODEN;
// while((PWR->CSR & PWR_CSR_ODRDY) == 0)
// {
// }
// PWR->CR |= PWR_CR_ODSWEN;
// while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
// {
// }
// 配置FLASH预取指,指令缓存,数据缓存和等待状态
FLASH->ACR = FLASH_ACR_PRFTEN
| FLASH_ACR_ICEN
|FLASH_ACR_DCEN
|FLASH_ACR_LATENCY_5WS;
/*-----------------------------------------------------*/
// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// 读取时钟切换状态位,确保PLLCLK被选为系统时钟
while (RCC_GetSYSCLKSource() != 0x08)
{
}
}
else
{ // HSI启动出错处理
while (1)
{
}
}
}
再找到时钟配置对应的 .h 文件 ![]()
在里面添加一句进行声明:
void HSI_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q) ;
然后在main文件里面如下位置加上配置的数值,这个数值正好是168MHZ,和stm32407的主频相同
int main(void)
{
HSI_SetSysClock(16, 336, 2, 7);
}
然后我们就完成了调用stm32内部时钟的任务,后面不管是点灯还是生成PWM波都验证了确实是168MHZ 的频率
ps:很多人说内部时钟会有影响,但是我目前没有发现,外部晶振有问题的小伙伴可以放心使用内部时钟~~
更多推荐
所有评论(0)