set_dco.c

来自「关于MSP430F149的DCO设置子程序」· C语言 代码 · 共 65 行

C
65
字号
//******************************************************************************
//  MSP-FET430P140 Demo - Setting DCO Clock
//
//  This example shows how to use set the DCO clock using 32768Hz crystal
//
//
//                MSP430F149
//             ---------------
//            |               |
//            |      A0 (P6.0)|<---- Vin
//            |               |
//
//
//  M.Mitchell
//  Texas Instruments, Inc
//  February,2002
//  Built with IAR Embedded Workbench Version: 1.25A
//******************************************************************************
#include          "msp430x16x.h"        // Standard Equations

//Frequecny = 32768/4 * delta
                              
void Set_DCO (unsigned int delta)                           // Subroutine to set DCO
{
  unsigned int Compare, Oldcapture = 0;

  BCSCTL1 |= DIVA_3;                          // ACLK = LFXT1CLK/8
  CCTL2 = CM_1 + CCIS_1 + CAP;                // CAP, ACLK
  TACTL = TASSEL_2 + MC_2 + TACLR;            // SMCLK, cont-mode, clear

  while (1)
  {
    while (!(CCIFG & CCTL2));                 // Wait until capture occurred
    CCTL2 &= ~CCIFG;                          // Capture occurred, clear flag
    Compare = CCR2;                           // Get current captured SMCLK 
    Compare = Compare - Oldcapture;           // SMCLK difference
    Oldcapture = CCR2;                        // Save current captured SMCLK

    if (delta == Compare)
    {
      break;                                  // Break loop
    }
    else if (delta < Compare)           
    {
      DCOCTL--;
      if (DCOCTL == 0xFF)                     // DCO is too fast, slow it down
        if (BCSCTL1 & 0x07)
          BCSCTL1--;                          // DCO role under?, Sel lower RSEL
        else
          break;                              // Error condition, break loop
    }
    else
    {                      
      DCOCTL++;                               // DCO is too slow, speed it up
      if (DCOCTL == 0x00) 
        if ((BCSCTL1 & 0x07) != 0x07) 
          BCSCTL1++;                          // DCO role over? Sel higher RSEL
        else
          break;                              // Error condition, break loop
    }
  }
  CCTL2 = 0;                                  // Stop CCR2
  TACTL = 0;                                  // Stop Timer_A
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?