stm32的systemint使用
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使用
1、systeninit(),是初始化系统时钟,只需要你#define一个对应的版本ST就可以了。2、写法不一样,但是最终的结果是一样的,都是配置相同系统时钟。
3、不配置时钟也能工作。但是其中延时、模块配置都会出现问题,因为这个时候的系统时钟并不是72MHz。
回复:stm32的systemint使用
回复第 2 楼 于2011-12-05 01:49:58发表: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使用
systeminit()这个已经就写好了,只需要你定义你的MCU类型、系统时钟的频率就可以了。回复:stm32的systemint使用
主要就是配置时钟,这个设计到很多的参数。如果你是学习的话,完全可以不用,自己配置玩玩,加强学习。
页:
[1]