时钟切换

本文探讨了STM32微控制器中两种时钟切换方法:自动切换与手动切换,并通过LED闪烁实验验证手动切换的效果。同时介绍了如何利用CCO配置将时钟信号输出至GPIO引脚进行观察。

1. 有2种时钟切换方法,自动切换和手动切换。

2. 手动切换,程序在内部高速时钟下,控制led灯闪烁,当切换为低速时钟后,灯的闪烁速度应该变慢。理想情况下应该是这样的,但是没有切换过来。

  GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Mode_Out_PP_High_Slow);
  
  for (i = 0; i < 10; i++)
  {
    GPIO_ToggleBits(LED_GPIO_PORT, LED_GPIO_PINS);
    delayMs(100);
  }


  CLK_LSICmd (ENABLE);
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);
  while(CLK_GetFlagStatus(CLK_FLAG_LSIRDY) == RESET);//RESET 没有准备好  SET准备好了
  CLK_SYSCLKSourceSwitchCmd(ENABLE);


  
  if (CLK_GetSYSCLKSource() == CLK_SYSCLKSource_LSI) 
  {
    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//不分频  
    for (i = 0; i < 10; i++)
    {
      GPIO_ToggleBits(LED_GPIO_PORT, LED_GPIO_PINS);
      delayMs(100);
    }
  }

3. 时钟的输出,利用CCO把时钟信号输出到引脚上,再用示波器观察。


int main( void )
{
  int i;
  GPIO_Init(GPIOC, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Fast);
  CLK_CCOConfig(CLK_CCOSource_HSI, CLK_CCODiv_1);
  //CLK_CCOConfig(CLK_CCOSource_HSI, CLK_CCODiv_16);
  
  while(1);


  return 0;
}


在FPGA设计中,时钟切换是一项关键技术,用于实现动态时钟源选择和时钟域之间的安全转换。时钟切换技术主要关注如何避免由于异步信号引入的**亚稳态(metastability)问题**,同时确保系统在不同频率或相位的时钟之间平稳切换。 ### FPGA中时钟切换的实现方法 1. **使用同步电路进行时钟切换** 为了避免异步信号导致的亚稳态,通常在时钟切换逻辑中引入同步器电路。同步器通过多级触发器对异步信号进行采样,从而降低亚稳态传播的风险。例如,在时钟选择信号(SELECT)或反馈信号来自不同时钟域的情况下,同步器可以有效抑制亚稳态[^2]。 一个典型的同步器结构如下: ```verilog module synchronizer ( input async_signal, input clk, output reg sync_signal ); reg [1:0] meta; always @(posedge clk) begin meta[0] <= async_signal; meta[1] <= meta[0]; sync_signal <= meta[1]; end endmodule ``` 2. **基于多路复用器(MUX)的时钟切换结构** FPGA中常用的时钟切换结构是使用多路复用器选择不同的时钟源。为了确保切换过程的稳定性,通常会在MUX控制信号路径上加入同步逻辑,以防止由于控制信号异步变化导致时钟切换过程中出现毛刺或竞争条件。 3. **时钟切换策略与状态机控制** 在复杂系统中,可以通过有限状态机(FSM)控制时钟切换流程,确保切换操作在特定条件下进行(如在时钟低电平期间切换),从而进一步降低毛刺和亚稳态风险。状态机可以检测当前时钟状态,并在合适的时机触发切换。 4. **使用FPGA原语(如BUFGMUX)** Xilinx等厂商提供的FPGA器件中,包含专门用于时钟切换的原语,如`BUFGMUX`。该原语支持两个时钟源之间的无缝切换,并具有内置的同步机制,适用于高可靠性场景。 ```verilog BUFGMUX my_mux ( .O(clk_out), // Clock output .I0(clk_primary), // Primary clock input .I1(clk_secondary), // Secondary clock input .S(sel_signal) // Select signal (synchronized) ); ``` 5. **时钟域交叉(CDC)处理** 当切换的两个时钟源属于不同时钟域时,除了时钟切换本身,还需处理跨时钟域的数据同步问题。通常采用异步FIFO、双触发同步器或多级握手协议来确保数据在不同域之间安全传输。 ### 设计注意事项 - **时钟源稳定性**:确保切换时钟源在切换前已稳定运行。 - **同步控制信号**:MUX的控制信号必须经过同步处理,以避免亚稳态。 - **时序约束**:在时序分析中需考虑时钟切换路径的延迟和建立/保持时间。 - **功耗优化**:非激活的时钟路径应关闭以减少动态功耗,尤其是在低功耗设计中。 ### 应用场景 - 动态频率调整(如节能模式) - 冗余时钟切换(提高系统可靠性) - 多时钟域系统中的时钟管理 - 高速接口时钟切换(如PCIe、DDR控制器)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值