对system_stm32f4xx的理解
上一篇博客解释了stm32的启动文件,在启动文件中,在进入__mainC库函数之前,进入了SystemInit函数,如下图所示。
那,今天我们就来探究一下这个函数的功能是什么,这个函数在这个文件system_stm32f4xx.c中,所以我们今天所要讲解的内容就是system_stm32f4xx.c文件。
首先,我们先来看下这个文件的思维导图。
This file provides two functions and one global variable to be called from user application:
- SystemInit(): Setups the system clock (System clock source, PLL Multiplierand Divider factors, AHB/APBx prescalers and Flash setting depending on the configuration made in the clock xls tool.
This function is called at startup just after reset and before branch to main program. This call is made insidethe “startup_stm32f4xx.s” file.
SystemCoreClock variable: Contains the core clock (HCLK), it can be used by the user application to setup the SysTick timer or configure other parameters.SystemCoreClockUpdate():Updates the variable SystemCoreClock and must be called whenever the core clock is changedduring program execution.//这个函数是在系统运行的时侯计算系统时钟频率 After each device reset the HSI (16 MHz) is used as system clock source. Then SystemInit() function is called, in “startup_stm32f4xx.s” file, to configure the system clock before to branch to main program.If the system clock source selected by user fails to startup, the SystemInit()function will do nothing and HSI still used as system clock source. User can add some code to deal with this issue inside the SetSysClock() function.
The default value of HSE crystal is set to 25MHz, refer to “HSE_VALUE” define in “stm32f4xx.h” file. When HSE is used as system clock source, through PLL, and you are using different crystal you have to adapt the HSE value to your own configuration.
上面的英文就是对这个文件的描述,相信大家都能看得懂。
因为我的单片机型号是F4系列的,所以我只截下F4的图片。
上面的图中有一个错误,HSE Frequency是8 000 000hz。
这幅图的意思就是如果你的项目中需要用到SRAM或SDRAM,那么你就显示箭头所指向的那行。
HSE不旁路,向量表的的偏移地址为0x00,如果你想要将向量表的地址从flash移到sram,你就显示那一行。这里需要注意的地方就是向量表的偏移地址必须是0x200的整数倍。具体为什么,你可以去查资料,这里就不再赘述。
接下来的这些就是PLL的配置参数,很简单。
这幅图就是根据不同型号的芯片,给系统内核时钟赋相应的值。
这里的SystemCoreClock是全局变量,在函数SystemCoreClockUpdate里面调用了。
接下来讲解的就是该文件最核心的内容了。我将会按照最开始的思维导图来讲解。这个函数的功能描述是:
Setup the microcontroller systemInitialize the Embedded Flash Interface, the PLL and update the SystemFrequency variable
函数的功能主要是在配置系统时钟之前,先对RCC进行了操作,将RCC时钟配置成默认的状态, 如果你用到了FSMC,就会调用到
SystemInit_ExtMemCtl()函数,接着就是去设置系统时钟,将时钟树配置好来,然侯配置向量表的位置。
我推荐大家在阅读这个函数的时候,配着芯片参考手册的中RCC章节中的时钟树看,这样思路会很清晰,一目了然。
这幅图就是对SystemCoreClockUpdate函数的描述,内容就不粘贴出来了,主要就是系统在运行的过程中,如果你想知道系统的时钟频率,那么你就可以调用这个函数。
这个是对SetSysClock函数的描述,主要的功能就是配置PLL为系统时钟源,然后再对APB1,APB2进行操作,当这个函数执行完以后,整个系统的心脏就开始起跳了,如果你需要使用到哪个外设,你就将相应的位置一,从这个时候开始,芯片就开始正常运行了。函数执行完了之后,就会回到SystemInit函数,执行完向量表位置的配置后,就进入main函数执行你写的代码,进入了C的世界。
接下来就是建立外部存储控制器,(用到TFTLCD或其他的SRAM的时候需要用到)。
该函数使能了外部存储控制器所需要的I/O口,以及对这些I/O口进行了配置,配置为了复用FSMC模式,目的就是与外部存储器进行连接
配置并且使能了Bank1_SRAM2存储块。关于FSMC的知识这里就不再赘述,之后的博客中会详细提及。
以上就是对system_stm32f4xx.c文件的理解,这个文件所对应的头文件中的内容几乎没有什么内容。
就是将对函数和全局变量进行了声明,没有太多的内容。