打印
[应用相关]

STM32时钟使用要点

[复制链接]
939|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
energy1|  楼主 | 2015-2-7 22:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 energy1 于 2015-2-7 22:41 编辑

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中断。

沙发
energy1|  楼主 | 2015-2-7 22:39 | 只看该作者
2、SysTick工作原理
   Cortex-M3的内核中包含一个SysTick时钟。SysTick 为一个24位递减计数器,SysTick设定初值并使能后, 每经过1个系统时钟周期,计数值就减1。计数到0时, SysTick计数器自动重装初值并继续计数,同时内部的 COUNTFLAG标志会置位,触发中断(如果中断使能)。

使用特权

评论回复
板凳
energy1|  楼主 | 2015-2-7 22:40 | 只看该作者
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,则输出的波形会失真。

使用特权

评论回复
地板
energy1|  楼主 | 2015-2-7 22:40 | 只看该作者
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);
      …… // 用户添加紧急处理代码处
    }

使用特权

评论回复
5
energy1|  楼主 | 2015-2-7 22:40 | 只看该作者
5、STM32上不使用外部晶振,OSC_IN和OSC_OUT的接法  
   1)、对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。
   2)、对于少于100脚的产品,有2种接法:
     2.1)、OSC_IN和OSC_OUT分别通过10K电阻接地。
           此方法可提高EMC性能。
     2.2)、分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。
           此方法可以减小功耗并(相对上面2.1),并节省2个外部电阻。

使用特权

评论回复
6
搞IT的| | 2015-2-8 19:57 | 只看该作者
顶一个,学习了。。

使用特权

评论回复
7
sting_yang| | 2015-2-9 10:10 | 只看该作者
写的不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

422

帖子

10

粉丝