RT-Thead移植时缺少SystemCoreClockUpdate函数
一、问题
在移植 RT-Thead 时,需要获取mcu当前的 HCLK 时钟频率来设置滴答时钟,而我使用的库函数中刚好缺少SystemCoreClockUpdate函数。
我之前在RT-Thread移植到stm32中是直接忽视SystemCoreClockUpdate函数的调用直接给SystemCoreClock赋值为72000000,如下图所示:
对于不熟悉时钟系统的小伙伴,在遇到使用的系统时钟不是72MHz时,产生的错误可能无法解决,所以我决定把SystemCoreClockUpdate函数重写一下,解决之前遗留的问题。
二、SystemCoreClockUpdate函数
-
SystemCoreClockUpdate()作用:是用来更新SystemCoreClock 变量,在每次配置系统时钟后,都需要使用SystemCoreClockUpdate()更新SystemCoreClock 变量,确保配置滴答时钟时正确。
-
M3系列的mcu默认情况下:SystemCoreClock = 72000000(72MHz)
-
SystemCoreClockUpdate函数实现:主要是通过确定系统的时钟源以及相应的分频系数计算出系统的HCLK频率
三、SystemCoreClockUpdate程序
void SystemCoreClockUpdate (void) { uint32_t tmp = 0, pllmull = 0, pllsource = 0, pllxtpre = 0; /* 获取SYSCLK源 */ tmp = RCC->CFGR & RCC_CFGR_SWS; switch (tmp) { case 0x00: /* HSI用作系统时钟 */ SystemCoreClock = HSI_Value; break; case 0x04: /* HSE用作系统时钟 */ SystemCoreClock = HSI_Value; break; case 0x08: /* PLL用作系统时钟 */ /* 获取PLL时钟源、PLL倍频系数、HSE分频系数 */ pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; pllxtpre = RCC->CFGR & RCC_CFGR_PLLXTPRE ; // 将倍频系数复制到pllmull,便于计算 pllmull = pllmull >> 18; if (pllmull <= 0x0D) { pllmull += 2; } else { /* PLL倍增系数=PLL输入时钟*16 */ pllmull = 16; } if (pllsource == 0x00) { /* HSI震荡时钟经过2分频后作为PLL输入时钟源 */ SystemCoreClock = (HSI_Value >> 1) * pllmull; } else { /* HSE作为PLL时钟输入 */ /* HSE作为PLL时钟输入时,HSE分频系数是1还是2 */ if (pllxtpre == 0x00) { SystemCoreClock = HSI_Value * pllmull; } else { SystemCoreClock = (HSI_Value >> 1) * pllmull; } } break; default: SystemCoreClock = HSI_Value; break; } /* 计算HCLK时钟频率 */ /* 获取AHB分频系数 */ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; /* HCLK时钟频率 */ SystemCoreClock >>= tmp; }
-
这里的SystemCoreClockUpdate 函数是按照我自己的理解来编写的,和其他库文件中提供的函数有一些区别。有不对的地方忘各位指出。
-
需要在system_stm32f10x.c文件中定义下面两个变量,如下所示:
uint32_t SystemCoreClock = SystemFrequency; __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; 完成后在将SystemCoreClockUpdate函数添加至文件中,如下图所示:
-
这里的程序我就不一行一行的分析的,如果有不明白的可以看我之前的笔记“STM32时钟系统配置程序源码深入分析”
本文来自博客园,作者:浇筑菜鸟,转载请注明原文链接:https://www.cnblogs.com/jzcn/p/16355741.html
如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意! cn_jiaozhu@qq.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律