前面理解SystemInit函数时,发现里面调用了SetSysClock函数,那么这个函数有什么用呢?里面的代码到底又干了什么事情呢?现在就来仔细地分析这个函数,以便掌握每一个细节,了解事物的来龙去脉。并且这个函数是用户必须了解的函数,为什么这样说呢?因为这个函数要设置CPU工作的频率,也就是说这个函数里设置了CPU到底运行多快的关键。前面我们知道CPU复位之后,默认是运行内部的时钟频率,那是比较低速运行的,如果不做这一步的修改,意味着CPU永远运行不了高速,达不到高效利用STM32的CPU。
首先来看到这个函数定义,它是定义在文件system_stm32f4xx.c里,它是被安排用户目录User下面,前面也说过,在这个目录之下的文件,用户都可以修改的文件,也是用户要关心的文件。当你找到这个函数时,它是这样定义的:
static void SetSysClock(void)
这个函数与SystemInit函数的定义有点区别,不知道你发现了没有?对,在这个函数前面多了一个关键字static声明,为什么需要这个关键字呢?不用这个关键字声明行不行?要理解这个关键字,那么就得回忆一下C语言里关于static函数与普通函数的区别了,大体意思如下:
用static修饰的函数,限定在本源码文件中使用,不能被这个源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它文件调用该函数。在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通函数的定义和声明默认情况下是extern的,但静态函数只是在声明它的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
<1> 其它文件中可以定义相同名字的函数,不会发生冲突。
<2> 静态函数不能被其他文件所用。
看完这段文字之后,你也许会发现C语言里的静态函数与C++里的私有函数很像,达到的目的是一样的。在这里SetSysClock函数,由于限制此函数在文件system_stm32f4xx.c里使用,不能被别的文件里调用,所以添加了静态声明。
#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx)|| defined(STM32F469_479xx)
这一行代码,主要用来判断不同的STM32的芯片类型,在这里只适用于STM32F40X、STM32F41X、STM32F427、STM32F437、STM32F429、STM32F439、STM32F412、STM32F413、STM32F423、STM32F446、STM32F469、STM32F479等类型。在我这个工程里,是定义了这个宏STM32F40_41xxx的,如下图: