简介: stm32f407探索者开发板(十一)——SystemInit时钟系统初始化剖析 一、回顾SYSCLK主要是用PLLCLK作为时钟源二、SystemInitsysteminit是在main函数调用之前进行的void SystemInit(void) { /* FPU settings ---*/ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB->CPACR |= ((3UL <<...
SystemInit函数通常在启动文件(如startup_stm32xxx.s)中被自动调用,调用时机处于复位之后、main函数之前。在常规的开发实践中,开发人员不用直接调用SystemInit函数。但如果项目对系统时钟设置有特殊需求,例如需要采用非默认的时钟源或调整时钟频率,那么开发人员可能需要在用户代码中对SystemInit函数中的相关部分进行重新配置。
这个函数体比较长,但仔细看会发现这个函数就是在配置CR,CFGR,ACR(设置FLASH)寄存器的某些位(使能,判断是否就绪,设置相应位,设置FLASH,设置AHB,APB预分频系数,设置HCLK,PCLK等等外设时钟,设置PLL锁相环倍频系数最终确定系统时钟),结合官方注释和官方寄存器的说明很容易理解。 至此,SystemInit函数就能大概理解了。但是还有...
系统初始化执行System_Init是刚开始自动配置时钟的,以STM32F1系列的启动文件为例,系统开始先执行System_Init配置时钟,这个函数的结果有两种,第一,配置成功,使用HSE外部高速晶振作为时钟源,通过PLL锁相环倍频至72MHz为系统提供时钟;第二,配置失败,失败的结果就是,时钟使用HSI内部低速8MHz晶振作为系统内部时钟,失败的很...
voidSystemInit(void){/* FPU settings 浮点运算的配置,此处不讲解---*/#if(__FPU_PRESENT==1)&&(__FPU_USED==1)SCB->CPACR|=((3UL<<10*2)|(3UL<<11*2));/* set CP10 and CP11 Full Access */#endif/* Reset the RCC clock configuration to the default reset state ---*//* Set H...
SystemInit() 在调用 SetSysClock()之前RCC寄存器的值如下(都是一些与运算,或运算,在此就不赘述了): RCC->CR = 0x0000 0083; RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;至于这些寄存器都代表着什么意思,详见芯片资料RCC寄存器,该文重点不在此处; ...
在“startup_stm32f429xx.s”文件中,系统复位后会首先调用SystemInit函数 1 ; Reset handler 2 Reset_Handler PROC 3 EXPORT Reset_Handler [WEAK] 4 IMPORT SystemInit 5 IMPORT __main 6 7 LDR R0, =SystemInit 8 BLX R0 9 LDR R0, =__main ...
这个函数出现在main()函数的第一行,可以看出它的重要性。以前关于SystemInit()这个函数从来没有关心过,只知道这是进行系统初始化的一个函数。今天决定仔细看看,重新开始STM32的学习。这个函数在system_f10x.c中,此C文件主要就是干具体硬件配置相关的工作。
stap_stm32f10x_cl.s(启动文件) → SystemInit() → SetSysClock () → SetSysClockTo72() 初始化时钟用到的RCC寄存器复位值: RCC_CR = 0x0000 xx83; RCC_CFGR = 0x0000 0000;RCC_CIR = 0x0000 0000; RCC_CFGR2 = 0x0000 0000; SystemInit() ...
SystemInit() 在调用 SetSysClock()之前RCC寄存器的值如下(都是一些与运算,或运算,在此就不赘述了): RCC->CR = 0x0000 0083;内、外部高速时钟的选择使能、就绪标志 RCC->CIR = 0x00FF0000;LSI、LSE、HIS、HSE、PLL就绪中断标志 RCC->CFGR2 = 0x00000000;系统时钟源切换及状态 ...