您的位置:首页 > 其它

RT-Thead移植时缺少SystemCoreClockUpdate函数

2022-06-08 15:09 1926 查看

一、问题

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

对于不熟悉时钟系统的小伙伴,在遇到使用的系统时钟不是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时钟系统配置程序源码深入分析

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: