打印
[MCU]

内部晶振

[复制链接]
600|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stly|  楼主 | 2020-6-21 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zhuww| | 2020-6-21 20:53 | 只看该作者
不喜欢有人把内部RC振荡器写成“晶振”,命名不是一个概念的东西。

使用特权

评论回复
板凳
tian111| | 2020-6-21 20:57 | 只看该作者
是内部RC振荡器,参考官网例程。。。

使用特权

评论回复
地板
zhuhuis| | 2020-6-21 21:00 | 只看该作者
msp430内部有dco,一般都是用这个

使用特权

评论回复
5
stly|  楼主 | 2020-6-26 09:35 | 只看该作者
具体怎样做呢,我没有例程

使用特权

评论回复
6
dingy| | 2020-6-26 09:39 | 只看该作者
内部dco是不是得配置一下才能打开的

使用特权

评论回复
7
supernan| | 2020-6-26 09:42 | 只看该作者
430的内部晶振还是挺准的

使用特权

评论回复
8
chenjunt| | 2020-6-26 09:45 | 只看该作者
内部时钟是RC振荡器产什么的

使用特权

评论回复
9
guoyt| | 2020-6-26 09:50 | 只看该作者

(1)XT1处于LF模式作为XT1CLK时钟源。ACLK选通为XT1CLK。
(2)MCLK选通为DCOCLKDIV
(3)SMCLK选通为DCOCLKDIV
(4)FLL使能,且将XT1CLK作为FLL参考时钟。
(5)XIN和XOUT脚设置为通用IO,XIN和XOUT配置为XT1功能前,XT1保持禁用。
(6)如果可用的话,XT2IN和XT2OUT被设置为通用IO且保持禁止状态。

使用特权

评论回复
10
zhuww| | 2020-6-26 09:53 | 只看该作者
DCO模块运行需要参考时钟REFCLK,REFCLK可以来自REFOCLK、XT1CLK和XT2CLK,通过UCSCTL3的SELREF选择,默认使用的XT1CLK,但如果XT1CLK不可用则使用REFOCLK。

使用特权

评论回复
11
happy_10| | 2020-6-26 09:56 | 只看该作者

理解TI官方例子中的代码了,官方代码中的相关部分如下:
if (fsystem <= 630)            //           fsystem < 0.63MHz  
  UCSCTL1 = DCORSEL_0;  
else if (fsystem <  1250)      // 0.63MHz < fsystem < 1.25MHz  
  UCSCTL1 = DCORSEL_1;  
else if (fsystem <  2500)      // 1.25MHz < fsystem <  2.5MHz  
  UCSCTL1 = DCORSEL_2;  
else if (fsystem <  5000)      // 2.5MHz  < fsystem <    5MHz  
  UCSCTL1 = DCORSEL_3;  
else if (fsystem <  10000)     // 5MHz    < fsystem <   10MHz  
  UCSCTL1 = DCORSEL_4;  
else if (fsystem <  20000)     // 10MHz   < fsystem <   20MHz  
  UCSCTL1 = DCORSEL_5;  
else if (fsystem <  40000)     // 20MHz   < fsystem <   40MHz  
  UCSCTL1 = DCORSEL_6;  
else  
  UCSCTL1 = DCORSEL_7;  

使用特权

评论回复
12
zwll| | 2020-6-26 10:01 | 只看该作者
DCOCLK倍频到25M吗?

使用特权

评论回复
13
pengf| | 2020-6-26 10:04 | 只看该作者
用软件编写内部DCO振荡器 分频可以  例如BCSCTL2 |= SELM_3;  //主时钟8分频

使用特权

评论回复
14
pangb| | 2020-6-26 10:12 | 只看该作者
WDTCTL = WDTPW + WDTHOLD;        // 关闭看门狗定时器
        BCSCTL1 |= XT2OFF;        //XT2关闭    ACLK=32768hz DCO为默认值约800k
        BCSCTL3 |= LFXT1S_2;        // LFXT1 = VLO =12khz(大约)
//        BCSCTL3 |= LFXT1S_0;        // LFXT1 = 32.768khz (大约)
        IE1 &= ~OFIE;                        //清除时钟错误中断
        IFG1 &= ~OFIFG;                // Clear OSCFault flag
        BCSCTL2 |= SELM_3+SELS;// mclk时钟源为LFXT1CLK,smclk=LFXT1CLK=32768hz
//        BCSCTL2 |= SELM_0+SELS;        // mclk时钟源为DCOCLK,smclk=LFXT1CLK=32768hz
        __delay_cycles(1000);        //小延时等待振荡稳定

使用特权

评论回复
15
kangzj| | 2020-6-26 10:15 | 只看该作者
DCOCTL:控制DCO振荡器

使用特权

评论回复
16
yufe| | 2020-6-26 10:23 | 只看该作者

DCO的设置:通过设置DCOCTL和BCSCTL1,设置DCO的频率

使用特权

评论回复
17
zhanglli| | 2020-6-26 10:27 | 只看该作者

//DCOCTL初始值为60H,即DCOCTL |= DCO1 + DCO2;
  DCOCTL |= DCO0 + DCO1 + DCO2;              // Max DCO

使用特权

评论回复
18
zwll| | 2020-6-26 10:49 | 只看该作者
默认情况下由DCOCLK作MCLK与SMCLK的时钟信号,由于DCOCTL初始值为60H

使用特权

评论回复
19
dingy| | 2020-6-26 10:55 | 只看该作者
MSP430的时钟设置包括3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3
DCOCTL,DCO控制寄存器,地址为56H,初始值为60H
DCO2        DCO1        DCO0        MOD4        MOD3        MOD2        MOD1        MOD0
DCO0~DCO2: DCO Select Bit,定义了8种频率之一,而频率由注入直流发生器的电流定义。
MOD0~MOD4: Modulation Bit,频率的微调。
一般不需要DCO的场合保持默认初始值就行了。

使用特权

评论回复
20
xxrs| | 2020-6-26 10:58 | 只看该作者

void SetVcoreUp (unsigned int level)
{
  // Open PMM registers for write
  PMMCTL0_H = PMMPW_H;
  // Set SVS/SVM high side new level
  SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
  // Set SVM low side to new level
  SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
  // Wait till SVM is settled
  while ((PMMIFG & SVSMLDLYIFG) == 0);
  // Clear already set flags
  PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
  // Set VCore to new level
  PMMCTL0_L = PMMCOREV0 * level;
  // Wait till new level reached
  if ((PMMIFG & SVMLIFG))
    while ((PMMIFG & SVMLVLRIFG) == 0);
  // Set SVS/SVM low side to new level
  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
  // Lock PMM registers for write access
  PMMCTL0_H = 0x00;
}

void main(void) {
  WDTCTL = WDTPW+WDTHOLD;
  P1SEL &= ~BIT1;
  P1DIR |= BIT1;
  
  P1SEL |= BIT0; //ACLK
  P1DIR |= BIT0;
  P2SEL |= BIT2; //SMCLK
  P2DIR |= BIT2;
  P7SEL |= BIT7; //MCLK
  P7DIR |= BIT7;

  P5SEL |= BIT4|BIT5;
  UCSCTL6 |= XCAP_3;
  UCSCTL6 &= ~XT1OFF;

  SetVcoreUp(1); //一次提高Vcore电压等级,具体请参考手册
  SetVcoreUp(2);
  SetVcoreUp(3);

  __bis_SR_register(SCG0);
  UCSCTL0 = 0;
  UCSCTL1 = DCORSEL_6;
  UCSCTL2 = FLLD_1 | 380;
  __bic_SR_register(SCG0);
  __delay_cycles(782000);

  /*
   * 默认状态下:ACLK=FLLREFCLK=XT1 SMCLK=MCLK=DCOCLKDIV XT2关闭
   * 为了不产生XT1LFOFFG,将ACLK和FLLREFCLK设置为REFOCLK
   * 并打开XT2OFF,否则XT2将处于无法使用状态
   * */
  //UCSCTL6 &= ~(XT2DRIVE0|XT2DRIVE1|XT2OFF);

  while (SFRIFG1 & OFIFG) {                               // Check OFIFG fault flag
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // Clear OSC flaut Flags
    SFRIFG1 &= ~OFIFG;                                  // Clear OFIFG fault flag
  }

  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;

  while(1){
    P1OUT ^= BIT1;
    delay();
  }
}

使用特权

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

本版积分规则

433

主题

7058

帖子

0

粉丝