This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430 SYS/BIOS UCS Configuration

Other Parts Discussed in Thread: SYSBIOS, MSP430F5438, MSP430F5438A, MSP430WARE

GENERAL ISSUE:
The MSP430 SYS/BIOS documentation contains a variety of fragmented reference and application material, as well as some some (mostly esoteric and simple) examples. While the overview material is adequate, it seems that no comprehensive tutorials (cookbook example style) are available. I did a literature search but found no suitable textbook or manual. I would appreciate any suggestions regarding a comprehensive COOKBOOK style publication.

Development Platform:
 *MS Win XP Pro SP3
 *CCS 5.5.0
 *SYS/BIOS 6.35.04.50 GA
 *Evaluation Boards
  1. TI MSP-EXP430F5438(A) Experimenter Board
  2. Olimex MSP430-5438STK development board
 *MSP-FET430UIF USB-Debug-Interface

SPECIFIC ISSUE:
How is UCS CLK SYSTEM specified using SYS/BIOS app.cfgg GUI for the MSP430? The "SYS/BIOS 6.35.04.50 > API reference > ti > sysbios > family > msp430" documentation seems to imply that the app.cfg SMCLK is fixed at 8192000 Hz in the current version of MSP430 SYS/BIOS. If so, this is a severe deficiency!

I need to to run my application using an external 25 MgHz crystal, but I see no way of accomplishing that under MSP430 SYS/BIOS. The SYS/BIOS 1.5-day Workshop Videos (Eric Scot Videos) and other dcuments don't seem to cover the SYS/BIOS CPU UCS CLK SYSTEM.

The question is: How can I get my CPU clock to work with the crystal with appropriate scaling under SYS/BIOS, and can this be done within the GUI?

Alternatively, will the CPU clock work as specified if is it is configured before invoking SYS/BIOS?

TESTS:
Anyway, my Olimex MSP430-5438STK development board has a 15 MgHz crystal on board (as well as the watch crystal). Just to test the result, I set the "GUI app.cfg" CPU clock frequency to 15,000,000 in a simple timer program (but I found no way of specifying the external crystal as the source). The program runs, but the crystal is not oscillating. The FFL circuit seems to be generating some sort of arbitrary or default CPU clock.

I ran the program once with the timer period set for 500 microseconds and once with the timer period set for 1500 counts for both the TI and the Olimex boards. The TI board has no high speed crystal, confirming that the 15 MgHz Xtal was not operating on the Olimex board.

TI results--
500 uS --> 1039 Hz
1500 counts --> 11.01 Hz

Olimex results--
500 uS --> 1042 Hz
1500 counts --> 10.94 Hz

Since the results apparently are not board dependendent, SYS/BIOS seems to have assigned some esoteric default CPU clock settings when the 8192000 value is redefined as 15000000.

PROGRAM:
// timerTEST

//#include <msp430f5438.h> // Olimex MSP430-5438STK
#include <msp430f5438a.h> // TI MSP-EXP430F5438(A)
#include <xdc/std.h>

#include <xdc/runtime/System.h>

#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/hal/Timer.h>
#include <ti/sysbios/hal/Hwi.h>
#include <ti/sysbios/knl/Swi.h>

#include <xdc/cfg/global.h>

Int main()
{

// P1DIR = 0x01;  // Olimex MSP430-5438STK
// P1OUT = 0x00;
 P5DIR = 0x01;  // TI MSP-EXP430F5438(A)
 P5OUT = 0x00;

 BIOS_start();

}

void mySqwFxn(UArg arg)
{

// P1OUT ^= 0x01;  // Olimex MSP430-5438STK
 P5OUT ^= 0x01;  // TI MSP-EXP430F5438(A)

}

GUI CONFIGURATION:
BIOS
 CPU clock frequency (Hz) = 15000000
Timer
 timer0
 ISR = mySqwFxn
 Id = 0
 Period = 500 uS (test 1)
 Period = 1500 counts (test 2)
 starts automatically
 periodic and continuous
ClockFreqs
 ACLK = 32768
 SMCLK = 15000000

CFG SCRIPT:
var Defaults = xdc.useModule('xdc.runtime.Defaults');
var Diags = xdc.useModule('xdc.runtime.Diags');
var Error = xdc.useModule('xdc.runtime.Error');
var Main = xdc.useModule('xdc.runtime.Main');
var Memory = xdc.useModule('xdc.runtime.Memory')
var SysMin = xdc.useModule('xdc.runtime.SysMin');
var System = xdc.useModule('xdc.runtime.System');
var Text = xdc.useModule('xdc.runtime.Text');

var BIOS = xdc.useModule('ti.sysbios.BIOS');
var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
var Timer = xdc.useModule('ti.sysbios.hal.Timer');
var ClockFreqs = xdc.useModule('ti.sysbios.family.msp430.ClockFreqs');

/*
 * Program.argSize sets the size of the .args section.
 * The examples don't use command line args so argSize is set to 0.
 */
Program.argSize = 0x0;

/*
 * Uncomment this line to globally disable Asserts.
 * All modules inherit the default from the 'Defaults' module.  You
 * can override these defaults on a per-module basis using Module.common$.
 * Disabling Asserts will save code space and improve runtime performance.
Defaults.common$.diags_ASSERT = Diags.ALWAYS_OFF;
 */

/*
 * Uncomment this line to keep module names from being loaded on the target.
 * The module name strings are placed in the .const section. Setting this
 * parameter to false will save space in the .const section.  Error and
 * Assert messages will contain an "unknown module" prefix instead
 * of the actual module name.
Defaults.common$.namedModule = false;
 */

/*
 * Minimize exit handler array in System.  The System module includes
 * an array of functions that are registered with System_atexit() to be
 * called by System_exit().
 */
System.maxAtexitHandlers = 4;      

/*
 * Uncomment this line to disable the Error print function. 
 * We lose error information when this is disabled since the errors are
 * not printed.  Disabling the raiseHook will save some code space if
 * your app is not using System_printf() since the Error_print() function
 * calls System_printf().
Error.raiseHook = null;
 */

/*
 * Uncomment this line to keep Error, Assert, and Log strings from being
 * loaded on the target.  These strings are placed in the .const section.
 * Setting this parameter to false will save space in the .const section.
 * Error, Assert and Log message will print raw ids and args instead of
 * a formatted message.
Text.isLoaded = false;
 */

/*
 * Uncomment this line to disable the output of characters by SysMin
 * when the program exits.  SysMin writes characters to a circular buffer.
 * This buffer can be viewed using the SysMin Output view in ROV.
SysMin.flushAtExit = false;
 */

/*
 * The BIOS module will create the default heap for the system.
 * Specify the size of this default heap.
 */
BIOS.heapSize = 0x400;

/*
 * Build a custom SYS/BIOS library from sources.
 */
BIOS.libType = BIOS.LibType_Custom;

/* System stack size (used by ISRs and Swis) */
Program.stack = 0x200;

/* Circular buffer size for System_printf() */
SysMin.bufSize = 0x200;

System.SupportProxy = SysMin;

var timer0Params = new Timer.Params();
timer0Params.instance.name = "null";
timer0Params.period = 500;
timer0Params.periodType = xdc.module("ti.sysbios.interfaces.ITimer").PeriodType_MICROSECS;
timer0Params.extFreq.lo = 0;
var timer0 = Timer.create(null, "&mySqwFxn", timer0Params);
BIOS.cpuFreq.lo = 15000000;
BIOS.customCCOpts = "-vmspx --near_data=none --code_model=large --data_model=restricted -q --advice:power=1  --program_level_compile -o3 -g --optimize_with_debug";
Program.gen.debuggerFiles = false;
ClockFreqs.SMCLK = 15000000;
ClockFreqs.ACLK = 32768;

  • Hi Fred,

    I need to consult my colleague who better knows the MSP430F5438 on this.  I'll get back to you as soon as I can.

    Steve

  • Hi Fred,

    Ok, I've spoken with some folks and have a better understanding of what you need to do here.  Unfortunately you cannot *change* these clock settings via the SYS/BIOS configuration file, but you can disable those default settings (8192000 Hz, etc.) and then change them in C code. 

    In addition to this, you must configure the BIOS cfg file to match the clock frequencies that you will set at run time.

    Here's the overview of the steps you need to take:

    1. Disable the default clock configuration/initialization
    2. Tell BIOS the clock frequency values that you want to configure.  This tells BIOS "what to expect."
    3. Configure the clocks to the frequencies that you want at run time (in main()).

    Step 1. Allows you to override the default values that are being set for you.  The following config code will do this (add to your *.cfg file):

    var Boot = xdc.useModule('ti.catalog.msp430.init.Boot');
    Boot.configureDCO = false;

    Step 2. This is also done in the *.cfg file and must be done so that BIOS "knows what you will do" at run time (it doesn't actually change the clock frequency).  In other words, you need to configure the ClockFreqs module with the frequency settings that will be made at run time.  You are already doing this in the config code that you posted:

    ClockFreqs.SMCLK = 15000000;
    ClockFreqs.ACLK = 32768;

    Step 3. Is where you will actually configure the clock frequencies to have the values that you want.  In this step, you will call/add some C code that makes the actual changes to the registers to change the clock frequencies.

    There are multiple ways you can implement step 3.

    A) Copy and modify the boot code that runs by default, changing the frequencies as needed.

    The following function is the default one that runs automatically.  This is what you *prevent* from running by performing step 1 above.  You can add this into your C file, update it as desired, then call it from main() before the call to BIOS_start():

    /*
    *  ======== Boot_configureDCO ========
    *  Initializes MSP430F5xxx clocks and DCO for:
    *      ACLK = REFO = 32768Hz
    *      MCLK = SMCLK = 8.192MHz
    Derived from the msp430x54x_UCS_3.c and MSP430F552x_UCS_03.c examples.
    */
    #if defined(__ICC430__)
        #pragma location="CSTART"
    #endif
    Void Boot_configureDCO(Void)
    {
        REG(UCSCTL3) |= SELREF_2;           /* set FLL ref to REF0 */
        REG(UCSCTL4) |= SELA_2;             /* set ACLK to REF0 */

        __bis_SR_register(SCG0);            /* disable FLL */
        REG(UCSCTL0) = 0x0000;              /* set lowest DCOx and MODx bits */
        REG(UCSCTL1) = DCORSEL_5;           /* select 24 MHz range */

        REG(UCSCTL2)  = FLLD_1 + 249;       /*
                                             * set multiplier for 8.192MHz:
                                             *     (N + 1) * FLLRef = Fdco
                                             *   (249 + 1) * 32768  = 8.192 MHz
                                             *      FLL Div = fDCOCLK/2
                                             */

        __bic_SR_register(SCG0);            /* enable FLL */

        /*
         * worst-case settling time (MCLK cylces)
         *    =  N x 32 x 32 x f_MCLK / f_FLL_ref
         *
         * 250000 =  32 x 32 x 8 MHz / 32768 Hz
         */
        __delay_cycles(250000);

        /* wait until XT1, XT2, and DCO fault flags are cleared... */
        do {
           REG(UCSCTL7) &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
           REG(SFRIFG1) &= ~OFIFG;
        } while (REG(SFRIFG1) &OFIFG);
    }

    B) Or you can use MSP430Ware APIs to configure the clocks.  This should be the one that you need. Note that there may be other APIs needed from MSP430Ware:

    C:\TI\msp430\MSP430ware_1_60_00_23\driverlib\MSP430F5xx_6xx\ucs.[ch]:

    //*****************************************************************************
    //
    //! \brief Initalizes a clock signal
    //!
    //! This function initializes each of the clock signals. The user must ensure
    //! that this function is called for each clock signal. If not, the default
    //! state is assumed for the particular clock signal. Refer MSP430Ware
    //! documentation for UCS module or Device Family User's Guide for details of
    //! default clock signal states.
    //!
    //! \param baseAddress is the base address of the UCS module.
    //! \param selectedClockSignal selected clock signal
    //!        Valid values are:
    //!        - \b UCS_ACLK
    //!        - \b UCS_MCLK
    //!        - \b UCS_SMCLK
    //!        - \b UCS_FLLREF
    //! \param clockSource is clock source for the selectedClockSignal
    //!        Valid values are:
    //!        - \b UCS_XT1CLK_SELECT
    //!        - \b UCS_VLOCLK_SELECT
    //!        - \b UCS_REFOCLK_SELECT
    //!        - \b UCS_DCOCLK_SELECT
    //!        - \b UCS_DCOCLKDIV_SELECT
    //!        - \b UCS_XT2CLK_SELECT
    //! \param clockSourceDivider selected the clock divider to calculate
    //!        clocksignal from clock source.
    //!        Valid values are:
    //!        - \b UCS_CLOCK_DIVIDER_1 [Default]
    //!        - \b UCS_CLOCK_DIVIDER_2
    //!        - \b UCS_CLOCK_DIVIDER_4
    //!        - \b UCS_CLOCK_DIVIDER_8
    //!        - \b UCS_CLOCK_DIVIDER_12 - [Valid only for UCS_FLLREF]
    //!        - \b UCS_CLOCK_DIVIDER_16
    //!        - \b UCS_CLOCK_DIVIDER_32 - [Not valid for UCSFLLREF]
    //!
    //! Modified bits of \b UCSCTL5 register, bits of \b UCSCTL4 register and bits
    //! of \b UCSCTL3 register.
    //!
    //! \return None
    //
    //*****************************************************************************
    void UCS_clockSignalInit( uint32_t baseAddress,
                              uint8_t selectedClockSignal,
                              uint16_t clockSource,
                              uint16_t clockSourceDivider
                              )
    {
            assert(
                    (UCS_XT1CLK_SELECT == clockSource) ||
                    (UCS_VLOCLK_SELECT == clockSource) ||
                    (UCS_REFOCLK_SELECT == clockSource) ||
                    (UCS_DCOCLK_SELECT == clockSource) ||
                    (UCS_DCOCLKDIV_SELECT == clockSource) ||
                    (UCS_XT2CLK_SELECT == clockSource)
                    );

            assert(
                    (UCS_CLOCK_DIVIDER_1 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_2 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_4 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_8 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_16 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_32 == clockSourceDivider)
                    );

            switch (selectedClockSignal) {
            case UCS_ACLK:
                    HWREG16(baseAddress + OFS_UCSCTL4) &= ~(SELA_7);
                    clockSource = clockSource << 8;
                    HWREG16(baseAddress + OFS_UCSCTL4) |= (clockSource);

                    HWREG16(baseAddress + OFS_UCSCTL5) &= ~(DIVA_7);
                    clockSourceDivider = clockSourceDivider << 8;
                    HWREG16(baseAddress + OFS_UCSCTL5) |= clockSourceDivider;
                    break;
            case UCS_SMCLK:
                    HWREG16(baseAddress + OFS_UCSCTL4) &= ~(SELS_7);
                    clockSource = clockSource << 4;
                    HWREG16(baseAddress + OFS_UCSCTL4) |= (clockSource);

                    HWREG16(baseAddress + OFS_UCSCTL5) &= ~(DIVS_7);
                    clockSourceDivider = clockSourceDivider << 4;
                    HWREG16(baseAddress + OFS_UCSCTL5) |= clockSourceDivider;
                    break;
            case UCS_MCLK:
                    HWREG16(baseAddress + OFS_UCSCTL4) &= ~(SELM_7);
                    HWREG16(baseAddress + OFS_UCSCTL4) |= (clockSource);

                    HWREG16(baseAddress + OFS_UCSCTL5) &= ~(DIVM_7);
                    HWREG16(baseAddress + OFS_UCSCTL5) |= clockSourceDivider;
                    break;
            case UCS_FLLREF:
                    assert(clockSource <= SELA_5);
                    HWREG8(baseAddress + OFS_UCSCTL3) &=  ~(SELREF_7);

                    clockSource = clockSource << 4;
                    HWREG8(baseAddress + OFS_UCSCTL3) |= (clockSource);

                    HWREG8(baseAddress + OFS_UCSCTL3) &= ~(FLLREFDIV_7);
                    //Note that dividers for FLLREF are slightly different
                    //Hence handled differently from other CLK signals
                    switch (clockSourceDivider) {
                    case UCS_CLOCK_DIVIDER_12:
                            HWREG8(baseAddress + OFS_UCSCTL3) |= FLLREFDIV__12;
                            break;
                    case UCS_CLOCK_DIVIDER_16:
                            HWREG8(baseAddress + OFS_UCSCTL3) |= FLLREFDIV__16;
                            break;
                    default:
                            HWREG8(baseAddress + OFS_UCSCTL3) |= clockSourceDivider;
                            break;
                    }

                    break;
            }
    }

    Steve

    //*****************************************************************************
    //
    //! \brief Initalizes a clock signal
    //!
    //! This function initializes each of the clock signals. The user must ensure
    //! that this function is called for each clock signal. If not, the default
    //! state is assumed for the particular clock signal. Refer MSP430Ware
    //! documentation for UCS module or Device Family User's Guide for details of
    //! default clock signal states.
    //!
    //! \param baseAddress is the base address of the UCS module.
    //! \param selectedClockSignal selected clock signal
    //!        Valid values are:
    //!        - \b UCS_ACLK
    //!        - \b UCS_MCLK
    //!        - \b UCS_SMCLK
    //!        - \b UCS_FLLREF
    //! \param clockSource is clock source for the selectedClockSignal
    //!        Valid values are:
    //!        - \b UCS_XT1CLK_SELECT
    //!        - \b UCS_VLOCLK_SELECT
    //!        - \b UCS_REFOCLK_SELECT
    //!        - \b UCS_DCOCLK_SELECT
    //!        - \b UCS_DCOCLKDIV_SELECT
    //!        - \b UCS_XT2CLK_SELECT
    //! \param clockSourceDivider selected the clock divider to calculate
    //!        clocksignal from clock source.
    //!        Valid values are:
    //!        - \b UCS_CLOCK_DIVIDER_1 [Default]
    //!        - \b UCS_CLOCK_DIVIDER_2
    //!        - \b UCS_CLOCK_DIVIDER_4
    //!        - \b UCS_CLOCK_DIVIDER_8
    //!        - \b UCS_CLOCK_DIVIDER_12 - [Valid only for UCS_FLLREF]
    //!        - \b UCS_CLOCK_DIVIDER_16
    //!        - \b UCS_CLOCK_DIVIDER_32 - [Not valid for UCSFLLREF]
    //!
    //! Modified bits of \b UCSCTL5 register, bits of \b UCSCTL4 register and bits
    //! of \b UCSCTL3 register.
    //!
    //! \return None
    //
    //*****************************************************************************
    void UCS_clockSignalInit( uint32_t baseAddress,
                              uint8_t selectedClockSignal,
                              uint16_t clockSource,
                              uint16_t clockSourceDivider
                              )
    {
            assert(
                    (UCS_XT1CLK_SELECT == clockSource) ||
                    (UCS_VLOCLK_SELECT == clockSource) ||
                    (UCS_REFOCLK_SELECT == clockSource) ||
                    (UCS_DCOCLK_SELECT == clockSource) ||
                    (UCS_DCOCLKDIV_SELECT == clockSource) ||
                    (UCS_XT2CLK_SELECT == clockSource)
                    );
     
            assert(
                    (UCS_CLOCK_DIVIDER_1 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_2 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_4 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_8 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_16 == clockSourceDivider) ||
                    (UCS_CLOCK_DIVIDER_32 == clockSourceDivider)
                    );
     
            switch (selectedClockSignal) {
            case UCS_ACLK:
                    HWREG16(baseAddress + OFS_UCSCTL4) &= ~(SELA_7);
                    clockSource = clockSource << 8;
                    HWREG16(baseAddress + OFS_UCSCTL4) |= (clockSource);
     
                    HWREG16(baseAddress + OFS_UCSCTL5) &= ~(DIVA_7);
                    clockSourceDivider = clockSourceDivider << 8;
                    HWREG16(baseAddress + OFS_UCSCTL5) |= clockSourceDivider;
                    break;
            case UCS_SMCLK:
                    HWREG16(baseAddress + OFS_UCSCTL4) &= ~(SELS_7);
                    clockSource = clockSource << 4;
                    HWREG16(baseAddress + OFS_UCSCTL4) |= (clockSource);
     
                    HWREG16(baseAddress + OFS_UCSCTL5) &= ~(DIVS_7);
                    clockSourceDivider = clockSourceDivider << 4;
                    HWREG16(baseAddress + OFS_UCSCTL5) |= clockSourceDivider;
                    break;
            case UCS_MCLK:
                    HWREG16(baseAddress + OFS_UCSCTL4) &= ~(SELM_7);
                    HWREG16(baseAddress + OFS_UCSCTL4) |= (clockSource);
     
                    HWREG16(baseAddress + OFS_UCSCTL5) &= ~(DIVM_7);
                    HWREG16(baseAddress + OFS_UCSCTL5) |= clockSourceDivider;
                    break;
            case UCS_FLLREF:
                    assert(clockSource <= SELA_5);
                    HWREG8(baseAddress + OFS_UCSCTL3) &=  ~(SELREF_7);
     
                    clockSource = clockSource << 4;
                    HWREG8(baseAddress + OFS_UCSCTL3) |= (clockSource);
     
                    HWREG8(baseAddress + OFS_UCSCTL3) &= ~(FLLREFDIV_7);
                    //Note that dividers for FLLREF are slightly different
                    //Hence handled differently from other CLK signals
                    switch (clockSourceDivider) {
                    case UCS_CLOCK_DIVIDER_12:
                            HWREG8(baseAddress + OFS_UCSCTL3) |= FLLREFDIV__12;
                            break;
                    case UCS_CLOCK_DIVIDER_16:
                            HWREG8(baseAddress + OFS_UCSCTL3) |= FLLREFDIV__16;
                            break;
                    default:
                            HWREG8(baseAddress + OFS_UCSCTL3) |= clockSourceDivider;
                            break;
                    }
     
                    break;
            }
    }
     
    From: Kopriva, Thomas
    Sent: Tuesday, September 24, 2013 10:34
    To: Connell, Steven
    Subject: FW: usc clock init function
     
    //*****************************************************************************
    //
    //! \brief Initalizes a clock signal
    //!
    //! This function initializes each of the clock signals. The user must ensure
    //! that this function is called for each clock signal. If not, the default
    //! state is assumed for the particular clock signal. Refer MSP430Ware
    //! documentation for UCS module or Device Family User's Guide for details of
    //! default clock signal states.
    //!
    //! \param baseAddress is the base address of the UCS module.
    //! \param selectedClockSignal selected clock signal
    //!        Valid values are:
    //!        - \b UCS_ACLK
    //!        - \b UCS_MCLK
    //!        - \b UCS_SMCLK
    //!        - \b UCS_FLLREF
    //! \param clockSource is clock source for the selectedClockSignal
    //!        Valid values are:
    //!        - \b UCS_XT1CLK_SELECT
    //!        - \b UCS_VLOCLK_SELECT
    //!        - \b UCS_REFOCLK_SELECT
    //!        - \b UCS_DCOCLK_SELECT
    //!        - \b UCS_DCOCLKDIV_SELECT
    //!        - \b UCS_XT2CLK_SELECT
    //! \param clockSourceDivider selected the clock divider to calculate
    //!        clocksignal from clock source.
    //!        Valid values are:
    //!        - \b UCS_CLOCK_DIVIDER_1 [Default]
    //!        - \b UCS_CLOCK_DIVIDER_2
    //!        - \b UCS_CLOCK_DIVIDER_4
    //!        - \b UCS_CLOCK_DIVIDER_8
    //!        - \b UCS_CLOCK_DIVIDER_12 - [Valid only for UCS_FLLREF]
    //!        - \b UCS_CLOCK_DIVIDER_16
    //!        - \b UCS_CLOCK_DIVIDER_32 - [Not valid for UCSFLLREF]
    //!
    //! Modified bits of \b UCSCTL5 register, bits of \b UCSCTL4 register and bits
    //! of \b UCSCTL3 register.
    //!
    //! \return None
    //
    //*****************************************************************************
  • Steve:
     
    Thanks for the response. I will have to digest what you've provided and get back to you after I've gone through it.
     
    My aim is to configure some TBD combination (eg, for CPU, Timers, AD) among the six independent clock sources specified:

    Low Freq --
        1. LFXT1 32768 Hz crystal
        2. VLO 10 kHz
        3. REFO 32 kHz

    High Freq --
        4. XT1   4 -> 32 MHz crystal
        5. XT2   4 -> 32 MHz crystal
        6. DCOFLL multiple of reference clock

    Regards, Fred A Rupinski