void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //SystemInit(); //完全可以使用此函数配置,但是为了学习咱先不用 RCC_DeInit(); //复位RCC模块的寄存器,复位成缺省值 RCC_HSEConfig(RCC_HSE_ON); //开启HSE时钟,咱是用HSE的时钟作为PLL的时钟源 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //获取HSE启动状态 if(HSEStartUpStatus == SUCCESS) //如果HSE启动成功 { FLASH_PrefetchBufferCmd(ENABLE); //开启FLASH的预取功能 FLASH_SetLatency(FLASH_Latency_2); //FLASH延迟2个周期(这里我也不明白,先用吧) RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置HCLK,PCLK2,PCLK1,PLL RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); RCC_PLLCmd(ENABLE); //启动PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET) {} //等待PLL启动完成 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 while(RCC_GetSYSCLKSource() !=0x80) //检查是否将HSE 9倍频后作为系统时钟 {} } } 设置时钟流程: 1.将RCC寄存器重新设置为默认值 RCC_DeInit 2.打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON); 3.等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp(); 4.设置AHB时钟 RCC_HCLKConfig; 5.设置高速APB2时钟 RCC_PCLK2Config; 6.设置低速速APB1时钟 RCC_PCLK1Config 7.设置PLL RCC_PLLConfig 8.打开PLL RCC_PLLCmd(ENABLE); 9.等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) 10.设置系统时钟 RCC_SYSCLKConfig 11.判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08) 12.打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd() 1.使用systeninit()和不使用有什么区别? 2.使用systeninit()和设置时钟流程的1-12步骤有什么区别? 3.我写程序不用systeminit().也不适用设置时钟流程的1-12步骤,只使用第12步,程序也能运行,请问有什么不同? |
RE:stm32的systemint使用
2、写法不一样,但是最终的结果是一样的,都是配置相同系统时钟。
3、不配置时钟也能工作。但是其中延时、模块配置都会出现问题,因为这个时候的系统时钟并不是72MHz。
回复:stm32的systemint使用
1、systeninit(),是初始化系统时钟,只需要你#define一个对应的版本ST就可以了。
2、写法不一样,但是最终的结果是一样的,都是配置相同系统时钟。
3、不配置时钟也能工作。但是其中延时、模块配置都会出现问题,因为这个时候的系统时钟并不是72MHz。
如果是一样的,那用systeminit(),只要 #define SYSCLK_FREQ_72MHz 72000000使能,就可以了?比1-12步骤简单,那还要写12步?
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz 24000000 */
/* #define SYSCLK_FREQ_36MHz 36000000 */
/* #define SYSCLK_FREQ_48MHz 48000000 */
/* #define SYSCLK_FREQ_56MHz 56000000 */
#define SYSCLK_FREQ_72MHz 72000000
#ifdef SYSCLK_FREQ_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_24MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_48MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_56MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_72MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */
#else /*!< HSI Selected as System Clock source */
uint32_t SystemCoreClock = HSI_VALUE; /*!< System Clock Frequency (Core Clock) */
#endif
RE:stm32的systemint使用
回复:stm32的systemint使用