基本时钟配置

What

  上一节中提到了延时函数,延时函数的基本原理就是CPU每执行一条语句需要一定固定的时间,而提供这个时间基准的就是单片机的时钟信号。
  时钟信号来源于一定的时钟源,它们是时钟源经过被选择和分频产生的。时钟源由一定的硬件电路产生,例如晶振和其他各种振荡器。时钟源类似于人体的心脏、汽车的发动机。
  而在G2553中共有3种时钟源和3种时钟信号
基本时钟模块参考图
G2553的时钟源:

  • LFXT1CLK: 低速/高速晶振源,通常接32.768khz;
  • DCOCLK: 内部晶振,由RC 震荡回路构成;
  • VLOCLK: 片内超低功耗、12KHz 的低频振荡器。

G2553的3种系统时钟信号:

  • ACLK,辅助时钟,通常由LFXT1CLK 或VLO 作为时钟源,可1、2、4、8 分频,可做外设时钟;一般是由32.768KHz 晶体直接产生的低频时钟,也可以是片内超低功耗12KHz 的内部振荡器VLOCK,用于产生节拍时基,或和定时器配合间歇唤醒CPU。
  • MCLK(Main CLK): 主时钟单元,通常由LFXT1CLK、VLO或DCO 作为时钟源,可1、2、4、8 分频,用于CPU 和系统;是专门为CPU 运行提供时钟,MCLK 配置的越高,CPU 执行速度就越快。MCLK 一般都设在1MHz 以上发挥CPU 性能。
  • SMCLK, 子系统时钟,通常由LFXT1CLK、VLO 或DCO 作为时钟源,可1、2、4、8 分频,可做外设时钟;单片机内部某些设备需要高速时钟(如定时器、ADC 等),SMCLK 为这些需要高速工作的设备提供时钟源,并且SMCLK 是独立于MCLK 的;当关闭主时钟MCLK让CPU 停止工作时,子系统时钟SMCLK 仍然可以开启,从而让外设继续工作。

需要注意:

  • 内部的振荡器DCO 和VLO 提供的时钟频率不是很精确,随外部环境变化较大;
  • 使用超低功耗低频振荡器VLO 可以很大程度地降低系统功耗;
  • 系统上电后默认使用的是DCO 时钟。
  • PUC(Power-Up Clear) 后MSPG430G2253 默认的MCLK 和SMCLK 为1.1MHz 左右的DCOCLK。

How

  DCO是数字振荡控制器,因此DCO的频率可以通过软件程序赋值相应寄存器来控制,所以基本时钟配置所涉及到的范围大概为:DCO时钟源的频率配置;各时钟信号选择何种时钟源;需要做怎样的分频。

DCO频率配置

DCO频率控制数据表DCO控制寄存器
基础时钟系统控制寄存器1对G2553来说,单片机在生产时其内部就已经预置好了一定时钟频率的配置,用户只需要根据数据表的寄存器配置要求配置即可更加方便快捷地得到相应常用的频率。
DCO预置频率配置

其他基本配置

对于其他基本时钟寄存器配置及功能可见用户指南280~284页。

举例
#include <msp430.h>

void Delay_ms(unsigned cnt)
{
  unsigned int i,j;
  for(j=0;j<cnt;j++)
  {
    i=1000/6;
    while(i--);
  }
}
int main(void)
{
  WDTCTL = WDTPW +WDTHOLD;                  // 关闭看门狗

 //1Mhz
  if (CALBC1_1MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  } 
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_1MHZ;                    // Set range
  DCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */

 /*//8Mhz
  if (CALBC1_8MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // 设置DCOx和MODx
  BCSCTL1 = CALBC1_8MHZ;                    
  DCOCTL = CALDCO_8MHZ;                     // 设置DCO频率为8M */

/* //12Mhz
  if (CALBC1_12MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_12MHZ;                   // Set range
  DCOCTL = CALDCO_12MHZ;                    // Set DCO step + modulation*/

 /*//16Mhz
  if (CALBC1_16MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_16MHZ;                   // Set range
  DCOCTL = CALDCO_16MHZ;                    // Set DCO step + modulation*/

  BCSCTL1|=DIVA_3;
  BCSCTL2|=DIVS_3;
  P1DIR |= (BIT0+BIT1+BIT4);                            // 设置P1.0,1 和 P1.4 为输出
  P1SEL |= (BIT0+BIT4);                            // 设置P1.0为ACLK输出, p1.4为SMCLK输出

  while(1)
  {
      P1OUT|=(BIT4+BIT1+BIT0);    //间断给P1.0/1/4赋值1和0,然而P1.4/1不是数字I/O功能,所以没有什么卵用,它们不由MCLK控制                  
      Delay_ms(1000);
      P1OUT&=~(BIT4+BIT1+BIT0);
      Delay_ms(1000);
  }
}

效果如下

基本时钟配置效果

Task

编写LED1闪灯程序,编写延迟函数,延时时间1s,实现循环间隔1s的亮灭。
没什么好分析的直接上代码

#include "io430.h"
void Delay_ms(unsigned cnt)
{
  unsigned int i,j;
  for(j=0;j<cnt;j++)
  {
    i=1000/6;
    while(i--);
  }
}
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  DCOCTL=0;
  BCSCTL1=CALBC1_1MHZ;
  DCOCTL=CALDCO_1MHZ;
  P1DIR|=BIT0;
  P1OUT&=~BIT0;
  while(1)
  {
    P1OUT^=BIT0;
    Delay_ms(1000);
  }
}

这个task还可以用后面定时器中断来处理,之后再说。

sao话一下

还记得电影《大鱼海棠》里的一句台词吗?这短短的一生我们最终都会失去,你不妨大胆一些,老子整把AK,给你龟儿弄把来福,rnw,做大做强,再创辉煌。

### OV5640 摄像头传感器时钟配置方法 对于 OV5640 摄像头传感器而言,其时钟配置至关重要,直接影响着图像的质量以及系统的稳定性。该传感器支持多种不同的工作模式和分辨率,在不同应用场景下需要灵活调整时钟频率。 #### SCCB 接口与时钟源设定 OV5640 使用 I2C 兼容的串行相机控制总线(SCCB)来访问内部寄存器并完成初始化设置。为了正确配置时钟,需通过 SCCB 修改特定寄存器中的值[^1]。 具体来说: - **XVCLK 控制**:外部提供给 OV5640 的像素时钟信号称为 XVCLK。通常情况下,这个时钟由 FPGA 或者其他主控设备产生,并且可以根据所需的应用场景调节频率范围。 - **PLL 设置**:内部锁相环(PLL)用于生成系统所需的多个时钟域。PLL 配置涉及到几个关键寄存器的操作,比如 PLL Control Register (地址 0x301E),其中包含了 VCO 分频系数等重要参数;还有 Clock Divider Registers (如 0x301F 至 0x3027),这些用来定义最终输出至各模块使用的实际时钟速率[^2]。 #### 实际应用中的注意事项 当设计基于 OV5640 的硬件平台时,确保所提供的 XVCLK 符合规格书的要求非常重要。过低或过高都会影响性能甚至造成无法正常启动的问题。一般推荐初始测试阶段采用较低但稳定的频率作为输入,之后再逐步优化直至达到最佳效果[^3]。 另外值得注意的是,在某些特殊的工作条件下可能还需要额外考虑温度变化等因素对时钟稳定性的潜在影响[^4]。 ```verilog // Verilog 示例代码片段展示如何利用 SCCB 对 OV5640 进行基本时钟配置 module ov5640_clock_config ( input wire sccb_clk, input wire sccb_data_in, output reg sccb_data_out ); always @(posedge sccb_clk) begin // 向指定寄存器写入适当数值以完成时钟相关设置... end endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值