76 lines
2.6 KiB
C
76 lines
2.6 KiB
C
//-------------------------------------------------------------------
|
|
// Filename: hal_clock.c
|
|
// Description: This file defines clock related functions for the CC253x family
|
|
// of RF system-on-chips from Texas Instruments.
|
|
//-------------------------------------------------------------------
|
|
//-------------------------------------------------------------------
|
|
// INCLUDES
|
|
//-------------------------------------------------------------------
|
|
#include "hal_defs.h"
|
|
#include "hal_clock.h"
|
|
|
|
//-------------------------------------------------------------------
|
|
// PUBLIC FUNCTIONS
|
|
//-------------------------------------------------------------------
|
|
//-------------------------------------------------------------------
|
|
// @fn clockSetMainSrc
|
|
// @brief Function for setting the main system clock source.
|
|
// The function turns off the clock source that is not being used.
|
|
// TICKSPD is set to the same frequency as the source.
|
|
// @param uint8 source (one of CLOCK_SRC_HFRC or CLOCK_SRC_XOSC)
|
|
// @return void
|
|
//-------------------------------------------------------------------
|
|
void clockSetMainSrc(uint8 source)
|
|
{
|
|
register uint8 osc32k_bm = CLKCONCMD &CLKCON_OSC32K_BM;
|
|
|
|
// Source can have the following values:
|
|
// CLOCK_SRC_XOSC 0x00 High speed Crystal Oscillator (XOSC)
|
|
// CLOCK_SRC_HFRC 0x01 Low power RC Oscillator (HFRC)
|
|
|
|
SLEEPCMD &= ~SLEEP_OSC_PD_BM; // power up both oscillators
|
|
while (!CC2530_IS_HFRC_STABLE() || ((SLEEPSTA &SLEEP_OSC_PD_BM) != 0))
|
|
;
|
|
// wait until the oscillator is stable
|
|
NOP();
|
|
|
|
if (source == CLOCK_SRC_HFRC)
|
|
{
|
|
CLKCONCMD = (osc32k_bm | CLKCON_OSC_BM | TICKSPD_DIV_2 | CLKCON_CLKSPD_BM);
|
|
}
|
|
else if (source == CLOCK_SRC_XOSC)
|
|
{
|
|
CLKCONCMD = (osc32k_bm | TICKSPD_DIV_1);
|
|
}
|
|
CC2530_WAIT_CLK_UPDATE();
|
|
SLEEPCMD |= SLEEP_OSC_PD_BM; // power down the unused oscillator
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// @fn clockSelect32k
|
|
// @brief Function for selecting source for the 32kHz oscillator
|
|
// @param uint8 source (one of CLOCK_32K_XTAL or CLOCK_32K_RCOSC)
|
|
// @return uint8 - SUCCESS or FAILED
|
|
//-------------------------------------------------------------------
|
|
uint8 clockSelect32k(uint8 source)
|
|
{
|
|
// System clock source must be high frequency RC oscillator before
|
|
// changing 32K source.
|
|
if (!(CLKCONSTA &CLKCON_OSC_BM))
|
|
{
|
|
return FAILED;
|
|
}
|
|
|
|
if (source == CLOCK_32K_XTAL)
|
|
{
|
|
CLKCONCMD &= ~CLKCON_OSC32K_BM;
|
|
}
|
|
else if (source == CLOCK_32K_RCOSC)
|
|
{
|
|
CLKCONCMD |= CLKCON_OSC32K_BM;
|
|
}
|
|
CC2530_WAIT_CLK_UPDATE();
|
|
|
|
return SUCCESS;
|
|
}
|