微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32F10x芯片时钟控制总结

STM32F10x芯片时钟控制总结

时间:11-11 来源:互联网 点击:

(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_0);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

while(0x04 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

void SetSysClockTo20(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_0);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_5);

RCC_PLLCmd(ENABLE);

while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY))

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(0x08 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

void SetSysClockTo36(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_1);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);

while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY))

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(0x08 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

void SetSysClockTo48(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_1);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);

RCC_PLLCmd(ENABLE);

while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY))

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(0x08 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

void SetSysClockTo72(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_2);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);

while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY))

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(0x08 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

6、系统时钟安全系统CSS

在实际应用中,经常出现由于晶体振荡器在运行中失去作用,造成微处理器的时钟源丢失,从而出现死机的现象,导致系统出错。为避免发声这种严重错误,STM32F10X系列芯片提供了一个时钟安全系统CCS机制。如下图:

时钟安全系统被激活后,时钟监控器将实时监控外部高速振荡器;如果HSE时钟发生故障,外部振荡器自动被关闭,产生时钟安全中断,此中断被连接到Cortex-M3的NVIC中断;与此同时CSS将内部RC振荡器(HSI)切换为STM32的系统时钟源。

注意:一旦CSS被激活,当HSE时钟出现故障产生CSS中断,同时自动产生NMI,NMI将不断执行,直到CSS中断挂起位被清除。因此在NMI的处理程序中,必须通过设置时钟中断寄存器RCC_CIR中的CSSC位(软件置1清除)来清除CSS中断。(其实RCC的其他各时钟源的就绪中断标志,也都需要通过软件置1来清除,只是CSS是NMI中断(不可屏蔽中断),其他中断需要设置相应位允许中断,并要在NVIC中打开RCC的中断通道)

7、系统时钟安全系统CSS应用

启动时钟安全系统CCS:

RCC_ClockSecuritySystemCmd(ENABLE);

编写NMI中断处理函数:

void NMI_Handler(void)

{

if(RESET != RCC_GetITStatus(RCC_IT_CSS))

{/* HSE、PLL已经被禁止,但PLL设置未变*/

……

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top