在RT-Thread移植过程中,如何处理缺少SystemCoreClockUpdate函数的问题?

2026-04-28 16:422阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计641个文字,预计阅读时间需要3分钟。

在RT-Thread移植过程中,如何处理缺少SystemCoreClockUpdate函数的问题?

一、问题+在移植RT-Thead+STM32时,需要获取MCU当前的HCLK时钟频率来设置中断回答时钟,而我使用的库函数中恰好缺少SystemCoreClockUpdate函数。+ 我之前在RT-Thread移植到STM32中时,直接忽视了SystemCoreClock的配置。

一、问题

在移植 RT-Thead 时,需要获取mcu当前的 HCLK 时钟频率来设置滴答时钟,而我使用的库函数中刚好缺少SystemCoreClockUpdate函数。
我之前在RT-Thread移植到stm32中是直接忽视SystemCoreClockUpdate函数的调用直接给SystemCoreClock赋值为72000000,如下图所示:

在RT-Thread移植过程中,如何处理缺少SystemCoreClockUpdate函数的问题?

对于不熟悉时钟系统的小伙伴,在遇到使用的系统时钟不是72MHz时,产生的错误可能无法解决,所以我决定把SystemCoreClockUpdate函数重写一下,解决之前遗留的问题。

二、SystemCoreClockUpdate函数
  1. SystemCoreClockUpdate()作用:是用来更新SystemCoreClock 变量,在每次配置系统时钟后,都需要使用SystemCoreClockUpdate()更新SystemCoreClock 变量,确保配置滴答时钟时正确。

  2. M3系列的mcu默认情况下:SystemCoreClock = 72000000(72MHz)

  3. 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时钟系统配置程序源码深入分析”

如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意! computer_wx@foxmail.com

本文共计641个文字,预计阅读时间需要3分钟。

在RT-Thread移植过程中,如何处理缺少SystemCoreClockUpdate函数的问题?

一、问题+在移植RT-Thead+STM32时,需要获取MCU当前的HCLK时钟频率来设置中断回答时钟,而我使用的库函数中恰好缺少SystemCoreClockUpdate函数。+ 我之前在RT-Thread移植到STM32中时,直接忽视了SystemCoreClock的配置。

一、问题

在移植 RT-Thead 时,需要获取mcu当前的 HCLK 时钟频率来设置滴答时钟,而我使用的库函数中刚好缺少SystemCoreClockUpdate函数。
我之前在RT-Thread移植到stm32中是直接忽视SystemCoreClockUpdate函数的调用直接给SystemCoreClock赋值为72000000,如下图所示:

在RT-Thread移植过程中,如何处理缺少SystemCoreClockUpdate函数的问题?

对于不熟悉时钟系统的小伙伴,在遇到使用的系统时钟不是72MHz时,产生的错误可能无法解决,所以我决定把SystemCoreClockUpdate函数重写一下,解决之前遗留的问题。

二、SystemCoreClockUpdate函数
  1. SystemCoreClockUpdate()作用:是用来更新SystemCoreClock 变量,在每次配置系统时钟后,都需要使用SystemCoreClockUpdate()更新SystemCoreClock 变量,确保配置滴答时钟时正确。

  2. M3系列的mcu默认情况下:SystemCoreClock = 72000000(72MHz)

  3. 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时钟系统配置程序源码深入分析”

如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意! computer_wx@foxmail.com