当前位置 : 主页 > 编程语言 > 其它开发 >

RT-Thead移植时缺少SystemCoreClockUpdate函数

来源:互联网 收集:自由互联 发布时间:2022-06-09
一、问题 在移植 RT-Thead 时,需要获取mcu当前的 HCLK 时钟频率来设置滴答时钟,而我使用的库函数中刚好缺少SystemCoreClockUpdate函数。 我之前在RT-Thread移植到stm32中是直接忽视SystemCoreClo
一、问题

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

如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意! computer_wx@foxmail.com
上一篇:C++类内缺省函数
下一篇:没有了
网友评论