STM32F10x芯片时钟控制总结
(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设置未变*/
……
STM32F10x时钟控 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)