========================== Reset/Clock Control =======================
1、时钟安全体系(CSS)
时钟安全体系被激活后,时钟监控器将实时监控外部高速振荡器;假如HSE时钟发生毛病,外部振荡器主动被封闭,发生时钟安全中止,该中止被连接到Cortex-M3的NMI的中止;一起CSS将内部RC振荡器切换为STM32的体系时钟源(关于STM32F103,时钟失效事情还将被送到高档定时器TIM1的刹车输入端,用以完成电机维护操控)。
操作流程:
1)、发动时钟安全体系CSS: RCC_ClockSecuritySystemCmd(ENABLE); (NMI中止是不行屏蔽的!)
2)外部振荡器失效时,发生NMI中止,对应的中止程序:
void NMIException(void)
{
if (RCC_GetITStatus(RCC_IT_CSS) != RESET)
{ // HSE、PLL已被制止(可是PLL设置未变)
…… // 客户增加相应的体系维护代码处
// 下面为HSE康复后的预设置代码
RCC_HSEConfig(RCC_HSE_ON); // 使能HSE
RCC_ITConfig(RCC_IT_HSERDY, ENABLE); // 使能HSE安排妥当中止
RCC_ITConfig(RCC_IT_PLLRDY, ENABLE); // 使能PLL安排妥当中止
RCC_ClearITPendingBit(RCC_IT_CSS); // 铲除时钟安全体系中止的挂起位
// 至此,一旦HSE时钟康复,将发生HSERDY中止,在RCC中止处理程序里, 体系时钟能够设置到曾经的状况
}
}
3)、在RCC的中止处理程序中,再对HSE和PLL进行相应的处理。
留意:一旦CSS被激活,当HSE时钟呈现毛病时将发生CSS中止,一起主动发生 NMI。NMI将被不断履行,直到CSS中止挂起位被铲除。因而,在NMI的处理程序中 有必要经过设置时钟中止寄存器(RCC_CIR)里的CSSC位来铲除CSS中止。
2、SysTick作业原理
Cortex-M3的内核中包括一个SysTick时钟。SysTick 为一个24位递减计数器,SysTick设定初值并使能后, 每经过1个体系时钟周期,计数值就减1。计数到0时, SysTick计数器主动重装初值并持续计数,一起内部的 COUNTFLAG标志会置位,触发中止(假如中止使能)。
3、内部时钟输出PA.8(MCO)
STM32的PA.8引脚具有复用功用——时钟输出(MCO), 该功用能将STM32内部的时钟经过PA.8输出.
操作流程:
1)、设置PA.8为复用Push-Pull形式。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
2)、挑选输出时钟源。
时钟的挑选由时钟装备寄存器(RCC_CFGR)中的MCO[2:0]位操控。
RCC_MCOConfig(RCC_MCO);
参数RCC_MCO为要输出的内部时钟:
RCC_MCO_NoClock — 无时钟输出
RCC_MCO_SYSCLK — 输出体系时钟(SysCLK)
RCC_MCO_HSI — 输出内部高速8MHz的RC振荡器的时钟(HSI)
RCC_MCO_HSE — 输出高速外部时钟信号(HSE)
RCC_MCO_PLLCLK_Div2 — 输出PLL倍频后的二分频时钟(PLLCLK/2)
注:因为STM32 GPIO输出管脚的最大呼应频率为50MHz,假如输出频率超越50MHz,则输出的波形会失真。
4、可编程电压监测器(PVD)
STM32内部自带PVD功用,用于对MCU供电电压VDD进行监控。经过电源操控寄存器中的PLS[2:0]位能够用来设定监控电压的阀值,经过对外部电压进行比较来监控电源。当条件触发,需求体系进入特别维护状况,履行紧迫封闭使命:对体系的一些数据保存起来,一起对外设进行相应的维护操作。
操作流程:
1)、体系发动后发动PVD,并敞开相应的中止。
PWR_PVDLevelConfig(PWR_PVDLevel_2V8); // 设定监控阀值
PWR_PVDCmd(ENABLE); // 使能PVD
EXTI_StructInit(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line16; // PVD连接到中止线16上
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //运用中止形式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Raising;//电压低于阀值时发生中止
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中止线
EXTI_Init(&EXTI_InitStructure); // 初始
EXTI_InitStructure.EXTI_Trigger的赋值可选项:
EXTI_Trigger_Rising—表明电压从高下降到低于设定阀值时发生中止;
EXTI_Trigger_Falling—表明电压从低上升到高于设定阀值时发生中止;
EXTI_Trigger_Rising_Falling—表明电压上升或下降跳过设定阀值时都发生中止。
2)、当作业电压低于设定阀值时,将发生PVD中止,在中止程序中进行相应的处理:
void PVD_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line16);
…… // 用户增加紧迫处理代码处
}