/* --COPYRIGHT--,BSD * Copyright (c) 2014, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --/COPYRIGHT--*/ //***************************************************************************** // // cs.h - Driver for the CS Module. // //***************************************************************************** #ifndef __MSP430WARE_CS_H__ #define __MSP430WARE_CS_H__ #include "inc/hw_memmap.h" #if defined(__MSP430_HAS_CS__) || defined(__MSP430_HAS_SFR__) //***************************************************************************** // // If building with a C++ compiler, make all of the definitions in this header // have a C binding. // //***************************************************************************** #ifdef __cplusplus extern "C" { #endif //***************************************************************************** // // The following are values that can be passed to the clockSourceDivider // parameter for functions: CS_initClockSignal(). // //***************************************************************************** #define CS_CLOCK_DIVIDER_1 DIVM__1 #define CS_CLOCK_DIVIDER_2 DIVM__2 #define CS_CLOCK_DIVIDER_4 DIVM__4 #define CS_CLOCK_DIVIDER_8 DIVM__8 #define CS_CLOCK_DIVIDER_16 DIVM__16 #define CS_CLOCK_DIVIDER_32 DIVM__32 //***************************************************************************** // // The following are values that can be passed to the selectClock parameter for // functions: CS_enableClockRequest(), and CS_disableClockRequest(); the // selectedClockSignal parameter for functions: CS_initClockSignal(). // //***************************************************************************** #define CS_ACLK 0x01 #define CS_MCLK 0x02 #define CS_SMCLK 0x04 #define CS_MODOSC MODCLKREQEN //***************************************************************************** // // The following are values that can be passed to the clockSource parameter for // functions: CS_initClockSignal(). // //***************************************************************************** #define CS_VLOCLK_SELECT SELM__VLOCLK #define CS_DCOCLK_SELECT SELM__DCOCLK #define CS_LFXTCLK_SELECT SELM__LFXTCLK #define CS_HFXTCLK_SELECT SELM__HFXTCLK #define CS_LFMODOSC_SELECT SELM__LFMODOSC #define CS_MODOSC_SELECT SELM__MODOSC //***************************************************************************** // // The following are values that can be passed to the lfxtdrive parameter for // functions: CS_turnOnLFXT(), and CS_turnOnLFXTWithTimeout(). // //***************************************************************************** #define CS_LFXT_DRIVE_0 LFXTDRIVE_0 #define CS_LFXT_DRIVE_1 LFXTDRIVE_1 #define CS_LFXT_DRIVE_2 LFXTDRIVE_2 #define CS_LFXT_DRIVE_3 LFXTDRIVE_3 //***************************************************************************** // // The following are values that can be passed to the hfxtdrive parameter for // functions: CS_turnOnHFXT(), and CS_turnOnHFXTWithTimeout(). // //***************************************************************************** #define CS_HFXT_DRIVE_4MHZ_8MHZ HFXTDRIVE_0 #define CS_HFXT_DRIVE_8MHZ_16MHZ HFXTDRIVE_1 #define CS_HFXT_DRIVE_16MHZ_24MHZ HFXTDRIVE_2 #define CS_HFXT_DRIVE_24MHZ_32MHZ HFXTDRIVE_3 //***************************************************************************** // // The following are values that can be passed to the mask parameter for // functions: CS_getFaultFlagStatus(), and CS_clearFaultFlag() as well as // returned by the CS_getFaultFlagStatus() function. // //***************************************************************************** #define CS_LFXTOFFG LFXTOFFG #define CS_HFXTOFFG HFXTOFFG //***************************************************************************** // // The following are values that can be passed to the dcorsel parameter for // functions: CS_setDCOFreq(). // //***************************************************************************** #define CS_DCORSEL_0 0x00 #define CS_DCORSEL_1 DCORSEL //***************************************************************************** // // The following are values that can be passed to the dcofsel parameter for // functions: CS_setDCOFreq(). // //***************************************************************************** #define CS_DCOFSEL_0 DCOFSEL_0 #define CS_DCOFSEL_1 DCOFSEL_1 #define CS_DCOFSEL_2 DCOFSEL_2 #define CS_DCOFSEL_3 DCOFSEL_3 #define CS_DCOFSEL_4 DCOFSEL_4 #define CS_DCOFSEL_5 DCOFSEL_5 #define CS_DCOFSEL_6 DCOFSEL_6 //***************************************************************************** // // Prototypes for the APIs. // //***************************************************************************** //***************************************************************************** // //! \brief Sets the external clock source //! //! This function sets the external clock sources LFXT and HFXT crystal //! oscillator frequency values. This function must be called if an external //! crystal LFXT or HFXT is used and the user intends to call CS_getMCLK, //! CS_getSMCLK, CS_getACLK and CS_turnOnLFXT, CS_LFXTByPass, //! CS_turnOnLFXTWithTimeout, CS_LFXTByPassWithTimeout, CS_turnOnHFXT, //! CS_HFXTByPass, CS_turnOnHFXTWithTimeout, CS_HFXTByPassWithTimeout. //! //! \param LFXTCLK_frequency is the LFXT crystal frequencies in Hz //! \param HFXTCLK_frequency is the HFXT crystal frequencies in Hz //! //! \return None // //***************************************************************************** extern void CS_setExternalClockSource(uint32_t LFXTCLK_frequency, uint32_t HFXTCLK_frequency); //***************************************************************************** // //! \brief Initializes 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 to MSP430ware //! documentation for CS module or Device Family User's Guide for details of //! default clock signal states. //! //! \param selectedClockSignal Selected clock signal //! Valid values are: //! - \b CS_ACLK //! - \b CS_MCLK //! - \b CS_SMCLK //! - \b CS_MODOSC //! \param clockSource is the selected clock signal //! Valid values are: //! - \b CS_VLOCLK_SELECT //! - \b CS_DCOCLK_SELECT - [Not available for ACLK] //! - \b CS_LFXTCLK_SELECT //! - \b CS_HFXTCLK_SELECT - [Not available for ACLK] //! - \b CS_LFMODOSC_SELECT //! - \b CS_MODOSC_SELECT - [Not available for ACLK] //! \param clockSourceDivider is the selected clock divider to calculate clock //! signal from clock source. //! Valid values are: //! - \b CS_CLOCK_DIVIDER_1 - [Default for ACLK] //! - \b CS_CLOCK_DIVIDER_2 //! - \b CS_CLOCK_DIVIDER_4 //! - \b CS_CLOCK_DIVIDER_8 - [Default for SMCLK and MCLK] //! - \b CS_CLOCK_DIVIDER_16 //! - \b CS_CLOCK_DIVIDER_32 //! //! Modified bits of \b CSCTL0 register, bits of \b CSCTL3 register and bits of //! \b CSCTL2 register. //! //! \return None // //***************************************************************************** extern void CS_initClockSignal(uint8_t selectedClockSignal, uint16_t clockSource, uint16_t clockSourceDivider); //***************************************************************************** // //! \brief Initializes the LFXT crystal in low frequency mode. //! //! Initializes the LFXT crystal oscillator in low frequency mode. Loops until //! all oscillator fault flags are cleared, with no timeout. See the device- //! specific data sheet for appropriate drive settings. IMPORTANT: User must //! call CS_setExternalClockSource function to set frequency of external clocks //! before calling this function. //! //! \param lfxtdrive is the target drive strength for the LFXT crystal //! oscillator. //! Valid values are: //! - \b CS_LFXT_DRIVE_0 //! - \b CS_LFXT_DRIVE_1 //! - \b CS_LFXT_DRIVE_2 //! - \b CS_LFXT_DRIVE_3 [Default] //! //! Modified bits of \b CSCTL0 register, bits of \b CSCTL5 register, bits of \b //! CSCTL4 register and bits of \b SFRIFG1 register. //! //! \return None // //***************************************************************************** extern void CS_turnOnLFXT(uint16_t lfxtdrive); //***************************************************************************** // //! \brief Bypasses the LFXT crystal oscillator. //! //! Bypasses the LFXT crystal oscillator. Loops until all oscillator fault //! flags are cleared, with no timeout. IMPORTANT: User must call //! CS_setExternalClockSource function to set frequency of external clocks //! before calling this function. //! //! //! Modified bits of \b CSCTL0 register, bits of \b CSCTL5 register, bits of \b //! CSCTL4 register and bits of \b SFRIFG register. //! //! \return None // //***************************************************************************** extern void CS_bypassLFXT(void); //***************************************************************************** // //! \brief Initializes the LFXT crystal oscillator in low frequency mode with //! timeout. //! //! Initializes the LFXT crystal oscillator in low frequency mode with timeout. //! Loops until all oscillator fault flags are cleared or until a timeout //! counter is decremented and equals to zero. See the device-specific //! datasheet for appropriate drive settings. IMPORTANT: User must call //! CS_setExternalClockSource to set frequency of external clocks before //! calling this function. //! //! \param lfxtdrive is the target drive strength for the LFXT crystal //! oscillator. //! Valid values are: //! - \b CS_LFXT_DRIVE_0 //! - \b CS_LFXT_DRIVE_1 //! - \b CS_LFXT_DRIVE_2 //! - \b CS_LFXT_DRIVE_3 [Default] //! \param timeout is the count value that gets decremented every time the loop //! that clears oscillator fault flags gets executed. //! //! Modified bits of \b CSCTL0 register, bits of \b CSCTL5 register, bits of \b //! CSCTL4 register and bits of \b SFRIFG1 register. //! //! \return STATUS_SUCCESS or STATUS_FAIL indicating if the LFXT crystal //! oscillator was initialized successfully // //***************************************************************************** extern bool CS_turnOnLFXTWithTimeout(uint16_t lfxtdrive, uint32_t timeout); //***************************************************************************** // //! \brief Bypass the LFXT crystal oscillator with timeout. //! //! Bypasses the LFXT crystal oscillator with timeout. Loops until all //! oscillator fault flags are cleared or until a timeout counter is //! decremented and equals to zero. NOTE: User must call //! CS_setExternalClockSource to set frequency of external clocks before //! calling this function. //! //! \param timeout is the count value that gets decremented every time the loop //! that clears oscillator fault flags gets executed. //! //! Modified bits of \b CSCTL0 register, bits of \b CSCTL5 register, bits of \b //! CSCTL4 register and bits of \b SFRIFG register. //! //! \return STATUS_SUCCESS or STATUS_FAIL // //***************************************************************************** extern bool CS_bypassLFXTWithTimeout(uint32_t timeout); //***************************************************************************** // //! \brief Stops the LFXT oscillator using the LFXTOFF bit. //! //! //! Modified bits of \b CSCTL4 register. //! //! \return None // //***************************************************************************** extern void CS_turnOffLFXT(void); //***************************************************************************** // //! \brief Starts the HFXFT crystal //! //! Initializes the HFXT crystal oscillator, which supports crystal frequencies //! between 0 MHz and 24 MHz, depending on the selected drive strength. Loops //! until all oscillator fault flags are cleared, with no timeout. See the //! device-specific data sheet for appropriate drive settings. NOTE: User must //! call CS_setExternalClockSource to set frequency of external clocks before //! calling this function. //! //! \param hfxtdrive is the target drive strength for the HFXT crystal //! oscillator. //! Valid values are: //! - \b CS_HFXT_DRIVE_4MHZ_8MHZ //! - \b CS_HFXT_DRIVE_8MHZ_16MHZ //! - \b CS_HFXT_DRIVE_16MHZ_24MHZ //! - \b CS_HFXT_DRIVE_24MHZ_32MHZ [Default] //! //! Modified bits of \b CSCTL5 register, bits of \b CSCTL4 register and bits of //! \b SFRIFG1 register. //! //! \return None // //***************************************************************************** extern void CS_turnOnHFXT(uint16_t hfxtdrive); //***************************************************************************** // //! \brief Bypasses the HFXT crystal oscillator //! //! Bypasses the HFXT crystal oscillator, which supports crystal frequencies //! between 0 MHz and 24 MHz. Loops until all oscillator fault flags are //! cleared, with no timeout.NOTE: User must call CS_setExternalClockSource to //! set frequency of external clocks before calling this function. //! //! //! Modified bits of \b CSCTL5 register, bits of \b CSCTL4 register and bits of //! \b SFRIFG register. //! //! \return None // //***************************************************************************** extern void CS_bypassHFXT(void); //***************************************************************************** // //! \brief Initializes the HFXT crystal oscillator with timeout. //! //! Initializes the HFXT crystal oscillator, which supports crystal frequencies //! between 0 MHz and 24 MHz, depending on the selected drive strength. Loops //! until all oscillator fault flags are cleared or until a timeout counter is //! decremented and equals to zero. See the device-specific data sheet for //! appropriate drive settings. NOTE: User must call CS_setExternalClockSource //! to set frequency of external clocks before calling this function. //! //! \param hfxtdrive is the target drive strength for the HFXT crystal //! oscillator. //! Valid values are: //! - \b CS_HFXT_DRIVE_4MHZ_8MHZ //! - \b CS_HFXT_DRIVE_8MHZ_16MHZ //! - \b CS_HFXT_DRIVE_16MHZ_24MHZ //! - \b CS_HFXT_DRIVE_24MHZ_32MHZ [Default] //! \param timeout is the count value that gets decremented every time the loop //! that clears oscillator fault flags gets executed. //! //! Modified bits of \b CSCTL5 register, bits of \b CSCTL4 register and bits of //! \b SFRIFG1 register. //! //! \return STATUS_SUCCESS or STATUS_FAIL // //***************************************************************************** extern bool CS_turnOnHFXTWithTimeout(uint16_t hfxtdrive, uint32_t timeout); //***************************************************************************** // //! \brief Bypasses the HFXT crustal oscillator with timeout //! //! Bypasses the HFXT crystal oscillator, which supports crystal frequencies //! between 0 MHz and 24 MHz. Loops until all oscillator fault flags are //! cleared or until a timeout counter is decremented and equals to zero. NOTE: //! User must call CS_setExternalClockSource to set frequency of external //! clocks before calling this function. //! //! \param timeout is the count value that gets decremented every time the loop //! that clears oscillator fault flags gets executed. //! //! Modified bits of \b CSCTL5 register, bits of \b CSCTL4 register and bits of //! \b SFRIFG1 register. //! //! \return STATUS_SUCCESS or STATUS_FAIL // //***************************************************************************** extern bool CS_bypassHFXTWithTimeout(uint32_t timeout); //***************************************************************************** // //! \brief Stops the HFXT oscillator using the HFXTOFF bit. //! //! //! Modified bits of \b CSCTL4 register. //! //! \return None // //***************************************************************************** extern void CS_turnOffHFXT(void); //***************************************************************************** // //! \brief Enables conditional module requests //! //! \param selectClock selects specific request enables. //! Valid values are: //! - \b CS_ACLK //! - \b CS_MCLK //! - \b CS_SMCLK //! - \b CS_MODOSC //! //! Modified bits of \b CSCTL6 register. //! //! \return None // //***************************************************************************** extern void CS_enableClockRequest(uint8_t selectClock); //***************************************************************************** // //! \brief Disables conditional module requests //! //! \param selectClock selects specific request enables. //! Valid values are: //! - \b CS_ACLK //! - \b CS_MCLK //! - \b CS_SMCLK //! - \b CS_MODOSC //! //! Modified bits of \b CSCTL6 register. //! //! \return None // //***************************************************************************** extern void CS_disableClockRequest(uint8_t selectClock); //***************************************************************************** // //! \brief Gets the current CS fault flag status. //! //! \param mask is the masked interrupt flag status to be returned. Mask //! parameter can be either any of the following selection. //! Mask value is the logical OR of any of the following: //! - \b CS_LFXTOFFG - LFXT oscillator fault flag //! - \b CS_HFXTOFFG - HFXT oscillator fault flag //! //! \return Logical OR of any of the following: //! - \b CS_LFXTOFFG LFXT oscillator fault flag //! - \b CS_HFXTOFFG HFXT oscillator fault flag //! \n indicating the status of the masked interrupts // //***************************************************************************** extern uint8_t CS_getFaultFlagStatus(uint8_t mask); //***************************************************************************** // //! \brief Clears the current CS fault flag status for the masked bit. //! //! \param mask is the masked interrupt flag status to be returned. mask //! parameter can be any one of the following //! Mask value is the logical OR of any of the following: //! - \b CS_LFXTOFFG - LFXT oscillator fault flag //! - \b CS_HFXTOFFG - HFXT oscillator fault flag //! //! Modified bits of \b CSCTL5 register. //! //! \return None // //***************************************************************************** extern void CS_clearFaultFlag(uint8_t mask); //***************************************************************************** // //! \brief Get the current ACLK frequency. //! //! If a oscillator fault is set, the frequency returned will be based on the //! fail safe mechanism of CS module. The user of this API must ensure that //! CS_externalClockSourceInit API was invoked before in case LFXT or HFXT is //! being used. //! //! //! \return Current ACLK frequency in Hz // //***************************************************************************** extern uint32_t CS_getACLK(void); //***************************************************************************** // //! \brief Get the current SMCLK frequency. //! //! If a oscillator fault is set, the frequency returned will be based on the //! fail safe mechanism of CS module. The user of this API must ensure that //! CS_externalClockSourceInit API was invoked before in case LFXT or HFXT is //! being used. //! //! //! \return Current SMCLK frequency in Hz // //***************************************************************************** extern uint32_t CS_getSMCLK(void); //***************************************************************************** // //! \brief Get the current MCLK frequency. //! //! If a oscillator fault is set, the frequency returned will be based on the //! fail safe mechanism of CS module. The user of this API must ensure that //! CS_externalClockSourceInit API was invoked before in case LFXT or HFXT is //! being used. //! //! //! \return Current MCLK frequency in Hz // //***************************************************************************** extern uint32_t CS_getMCLK(void); //***************************************************************************** // //! \brief Turns off VLO //! //! //! Modified bits of \b CSCTL4 register. //! //! \return None // //***************************************************************************** extern void CS_turnOffVLO(void); //***************************************************************************** // //! \brief Clears all the Oscillator Flags //! //! \param timeout is the count value that gets decremented every time the loop //! that clears oscillator fault flags gets executed. //! //! Modified bits of \b CSCTL5 register and bits of \b SFRIFG1 register. //! //! \return the mask of the oscillator flag status // //***************************************************************************** extern uint16_t CS_clearAllOscFlagsWithTimeout(uint32_t timeout); //***************************************************************************** // //! \brief Set DCO frequency //! //! \param dcorsel selects frequency range option. //! Valid values are: //! - \b CS_DCORSEL_0 [Default] - Low Frequency Option //! - \b CS_DCORSEL_1 - High Frequency Option //! \param dcofsel selects valid frequency options based on dco frequency range //! selection (dcorsel) //! Valid values are: //! - \b CS_DCOFSEL_0 - Low frequency option 1MHz. High frequency option //! 1MHz. //! - \b CS_DCOFSEL_1 - Low frequency option 2.67MHz. High frequency //! option 5.33MHz. //! - \b CS_DCOFSEL_2 - Low frequency option 3.33MHz. High frequency //! option 6.67MHz. //! - \b CS_DCOFSEL_3 - Low frequency option 4MHz. High frequency option //! 8MHz. //! - \b CS_DCOFSEL_4 - Low frequency option 5.33MHz. High frequency //! option 16MHz. //! - \b CS_DCOFSEL_5 - Low frequency option 6.67MHz. High frequency //! option 20MHz. //! - \b CS_DCOFSEL_6 - Low frequency option 8MHz. High frequency option //! 24MHz. //! //! \return None // //***************************************************************************** extern void CS_setDCOFreq(uint16_t dcorsel, uint16_t dcofsel); //***************************************************************************** // // Mark the end of the C bindings section for C++ compilers. // //***************************************************************************** #ifdef __cplusplus } #endif #endif #endif // __MSP430WARE_CS_H__