blob: 6697566ea3b08403fe72788ee2d3d46647ddc9ac [file] [log] [blame]
//*****************************************************************************
//
// pwm.c - API for the PWM modules
//
// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved.
//
// Software License Agreement
//
// Luminary Micro, Inc. (LMI) is supplying this software for use solely and
// exclusively on LMI's Stellaris Family of microcontroller products.
//
// The software is owned by LMI and/or its suppliers, and is protected under
// applicable copyright laws. All rights are reserved. Any use in violation
// of the foregoing restrictions may subject the user to criminal sanctions
// under applicable laws, as well as to civil liability for the breach of the
// terms and conditions of this license.
//
// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 991 of the Stellaris Driver Library.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup pwm_api
//! @{
//
//*****************************************************************************
#include "../hw_ints.h"
#include "../hw_memmap.h"
#include "../hw_pwm.h"
#include "../hw_types.h"
#include "debug.h"
#include "interrupt.h"
#include "pwm.h"
//*****************************************************************************
//
// Misc macros for manipulating the encoded generator and output defines used
// by the API.
//
//*****************************************************************************
#define PWM_GEN_BADDR(_mod_, _gen_) \
((_mod_) + (_gen_))
#define PWM_OUT_BADDR(_mod_, _out_) \
((_mod_) + ((_out_) & 0xFFFFFFC0))
#define PWM_IS_OUTPUT_ODD(_out_) \
((_out_) & 0x00000001)
//*****************************************************************************
//
//! Configures a PWM generator.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to configure. Must be one of
//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2.
//! \param ulConfig is the configuration for the PWM generator.
//!
//! This function is used to set the mode of operation for a PWM generator.
//! The counting mode, synchronization mode, and debug behavior are all
//! configured. After configuration, the generator is left in the disabled
//! state.
//!
//! A PWM generator can count in two different modes: count down mode or count
//! up/down mode. In count down mode, it will count from a value down to zero,
//! and then reset to the preset value. This will produce left-aligned PWM
//! signals (i.e. the rising edge of the two PWM signals produced by the
//! generator will occur at the same time). In count up/down mode, it will
//! count up from zero to the preset value, count back down to zero, and then
//! repeat the process. This will produce center-aligned PWM signals (i.e. the
//! middle of the high/low period of the PWM signals produced by the generator
//! will occur at the same time).
//!
//! When the PWM generator parameters (period and pulse width) are modified,
//! their affect on the output PWM signals can be delayed. In synchronous
//! mode, the parameter updates are not applied until a synchronization event
//! occurs. This allows multiple parameters to be modified and take affect
//! simultaneously, instead of one at a time. Additionally, parameters to
//! multiple PWM generators in synchronous mode can be updated simultaneously,
//! allowing them to be treated as if they were a unified generator. In
//! non-synchronous mode, the parameter updates are not delayed until a
//! synchronization event. In either mode, the parameter updates only occur
//! when the counter is at zero to help prevent oddly formed PWM signals during
//! the update (i.e. a PWM pulse that is too short or too long).
//!
//! The PWM generator can either pause or continue running when the processor
//! is stopped via the debugger. If configured to pause, it will continue to
//! count until it reaches zero, at which point it will pause until the
//! processor is restarted. If configured to continue running, it will keep
//! counting as if nothing had happened.
//!
//! The \b ulConfig parameter contains the desired configuration. It is the
//! logical OR of the following: \b PWM_GEN_MODE_DOWN or
//! \b PWM_GEN_MODE_UP_DOWN to specify the counting mode, \b PWM_GEN_MODE_SYNC
//! or \b PWM_GEN_MODE_NO_SYNC to specify the synchronization mode, and
//! \b PWM_GEN_MODE_DBG_RUN or \b PWM_GEN_MODE_DBG_STOP to specify the debug
//! behavior.
//!
//! \note Changes to the counter mode will affect the period of the PWM signals
//! produced. PWMGenPeriodSet() and PWMPulseWidthSet() should be called after
//! any changes to the counter mode of a generator.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_genconfigure) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMGenConfigure(unsigned long ulBase, unsigned long ulGen,
unsigned long ulConfig)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Compute the generator's base address.
//
ulGen = PWM_GEN_BADDR(ulBase, ulGen);
//
// Change the global configuration of the generator.
//
HWREG(ulGen + PWM_O_X_CTL) = ((HWREG(ulGen + PWM_O_X_CTL) &
~(PWM_X_CTL_MODE | PWM_X_CTL_DEBUG |
PWM_X_CTL_LOADUPD | PWM_X_CTL_CMPAUPD |
PWM_X_CTL_CMPBUPD)) | ulConfig);
//
// Set the individual PWM generator controls.
//
if(ulConfig & PWM_X_CTL_MODE)
{
//
// In up/down count mode, set the signal high on up count comparison
// and low on down count comparison (i.e. center align the signals).
//
HWREG(ulGen + PWM_O_X_GENA) = ((PWM_GEN_ACT_ONE <<
PWM_GEN_ACT_A_UP_SHIFT) |
(PWM_GEN_ACT_ZERO <<
PWM_GEN_ACT_A_DN_SHIFT));
HWREG(ulGen + PWM_O_X_GENB) = ((PWM_GEN_ACT_ONE <<
PWM_GEN_ACT_B_UP_SHIFT) |
(PWM_GEN_ACT_ZERO <<
PWM_GEN_ACT_B_DN_SHIFT));
}
else
{
//
// In down count mode, set the signal high on load and low on count
// comparison (i.e. left align the signals).
//
HWREG(ulGen + PWM_O_X_GENA) = ((PWM_GEN_ACT_ONE <<
PWM_GEN_ACT_LOAD_SHIFT) |
(PWM_GEN_ACT_ZERO <<
PWM_GEN_ACT_A_DN_SHIFT));
HWREG(ulGen + PWM_O_X_GENB) = ((PWM_GEN_ACT_ONE <<
PWM_GEN_ACT_LOAD_SHIFT) |
(PWM_GEN_ACT_ZERO <<
PWM_GEN_ACT_B_DN_SHIFT));
}
}
#endif
//*****************************************************************************
//
//! Set the period of a PWM generator.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to be modified. Must be one of
//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2.
//! \param ulPeriod specifies the period of PWM generator output, measured
//! in clock ticks.
//!
//! This function sets the period of the specified PWM generator block, where
//! the period of the generator block is defined as the number of \b PWM
//! clock ticks between pulses on the generator block \b zero signal.
//!
//! \note Any subsequent calls made to this function before an update occurs
//! will cause the previous values to be overwritten.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_genperiodset) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen,
unsigned long ulPeriod)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Compute the generator's base address.
//
ulGen = PWM_GEN_BADDR(ulBase, ulGen);
//
// Set the reload register based on the mode.
//
if(HWREG(ulGen + PWM_O_X_CTL) & PWM_X_CTL_MODE)
{
//
// In up/down count mode, set the reload register to half the requested
// period.
//
ASSERT((ulPeriod / 2) < 65536);
HWREG(ulGen + PWM_O_X_LOAD) = ulPeriod / 2;
}
else
{
//
// In down count mode, set the reload register to the requested period
// minus one.
//
ASSERT((ulPeriod <= 65536) && (ulPeriod != 0));
HWREG(ulGen + PWM_O_X_LOAD) = ulPeriod - 1;
}
}
#endif
//*****************************************************************************
//
//! Gets the period of a PWM generator block.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to query. Must be one of
//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2.
//!
//! This function gets the period of the specified PWM generator block. The
//! period of the generator block is defined as the number of \b PWM clock
//! ticks between pulses on the generator block \b zero signal.
//!
//! If the update of the counter for the specified PWM generator has yet
//! to be completed, the value returned may not be the active period. The
//! value returned is the programmed period, measured in \b PWM clock ticks.
//!
//! \return Returns the programmed period of the specified generator block
//! in \b PWM clock ticks.
//
//*****************************************************************************
#if defined(GROUP_genperiodget) || defined(BUILD_ALL) || defined(DOXYGEN)
unsigned long
PWMGenPeriodGet(unsigned long ulBase, unsigned long ulGen)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Compute the generator's base address.
//
ulGen = PWM_GEN_BADDR(ulBase, ulGen);
//
// Figure out the counter mode.
//
if(HWREG(ulGen + PWM_O_X_CTL) & PWM_X_CTL_MODE)
{
//
// The period is twice the reload register value.
//
return(HWREG(ulGen + PWM_O_X_LOAD) * 2);
}
else
{
//
// The period is the reload register value plus one.
//
return(HWREG(ulGen + PWM_O_X_LOAD) + 1);
}
}
#endif
//*****************************************************************************
//
//! Enables the timer/counter for a PWM generator block.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to be enabled. Must be one of
//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2.
//!
//! This function allows the \b PWM clock to drive the timer/counter for the
//! specified generator block.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_genenable) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMGenEnable(unsigned long ulBase, unsigned long ulGen)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Enable the PWM generator.
//
HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_CTL) |= PWM_X_CTL_ENABLE;
}
#endif
//*****************************************************************************
//
//! Disables the timer/counter for a PWM generator block.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to be disabled. Must be one of
//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2.
//!
//! This function blocks the \b PWM clock from driving the timer/counter for
//! the specified generator block.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_gendisable) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMGenDisable(unsigned long ulBase, unsigned long ulGen)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Disable the PWM generator.
//
HWREG(PWM_GEN_BADDR(ulBase, + ulGen) + PWM_O_X_CTL) &= ~(PWM_X_CTL_ENABLE);
}
#endif
//*****************************************************************************
//
//! Sets the pulse width for the specified PWM output.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulPWMOut is the PWM output to modify. Must be one of \b PWM_OUT_0,
//! \b PWM_OUT_1, \b PWM_OUT_2, \b PWM_OUT_3, \b PWM_OUT_4, or \b PWM_OUT_5.
//! \param ulWidth specifies the width of the positive portion of the pulse.
//!
//! This function sets the pulse width for the specified PWM output, where the
//! pulse width is defined as the number of \b PWM clock ticks.
//!
//! \note Any subsequent calls made to this function before an update occurs
//! will cause the previous values to be overwritten.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_pulsewidthset) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut,
unsigned long ulWidth)
{
unsigned long ulGenBase, ulReg;
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulPWMOut == PWM_OUT_0) || (ulPWMOut == PWM_OUT_1) ||
(ulPWMOut == PWM_OUT_2) || (ulPWMOut == PWM_OUT_3) ||
(ulPWMOut == PWM_OUT_4) || (ulPWMOut == PWM_OUT_5));
//
// Compute the generator's base address.
//
ulGenBase = PWM_OUT_BADDR(ulBase, ulPWMOut);
//
// If the counter is in up/down count mode, divide the width by two.
//
if(HWREG(ulGenBase + PWM_O_X_CTL) & PWM_X_CTL_MODE)
{
ulWidth /= 2;
}
//
// Get the period.
//
ulReg = HWREG(ulGenBase + PWM_O_X_LOAD);
//
// Make sure the width is not too large.
//
ASSERT(ulWidth < ulReg);
//
// Compute the compare value.
//
ulReg = ulReg - ulWidth;
//
// Write to the appropriate registers.
//
if(PWM_IS_OUTPUT_ODD(ulPWMOut))
{
HWREG(ulGenBase + PWM_O_X_CMPB) = ulReg;
}
else
{
HWREG(ulGenBase + PWM_O_X_CMPA) = ulReg;
}
}
#endif
//*****************************************************************************
//
//! Gets the pulse width of a PWM output.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulPWMOut is the PWM output to query. Must be one of \b PWM_OUT_0,
//! \b PWM_OUT_1, \b PWM_OUT_2, \b PWM_OUT_3, \b PWM_OUT_4, or \b PWM_OUT_5.
//!
//! This function gets the currently programmed pulse width for the
//! specified PWM output. If the update of the comparator for the specified
//! output has yet to be completed, the value returned may not be the active
//! pulse width. The value returned is the programmed pulse width, measured
//! in \b PWM clock ticks.
//!
//! \return Returns the width of the pulse in \b PWM clock ticks.
//
//*****************************************************************************
#if defined(GROUP_pulsewidthget) || defined(BUILD_ALL) || defined(DOXYGEN)
unsigned long
PWMPulseWidthGet(unsigned long ulBase, unsigned long ulPWMOut)
{
unsigned long ulGenBase, ulReg, ulLoad;
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulPWMOut == PWM_OUT_0) || (ulPWMOut == PWM_OUT_1) ||
(ulPWMOut == PWM_OUT_2) || (ulPWMOut == PWM_OUT_3) ||
(ulPWMOut == PWM_OUT_4) || (ulPWMOut == PWM_OUT_5));
//
// Compute the generator's base address.
//
ulGenBase = PWM_OUT_BADDR(ulBase, ulPWMOut);
//
// Then compute the pulse width. If mode is UpDown, set
// width = (load-compare)*2. Otherwise, set width = load - compare
//
ulLoad = HWREG(ulGenBase + PWM_O_X_LOAD);
if(PWM_IS_OUTPUT_ODD(ulPWMOut))
{
ulReg = HWREG(ulGenBase + PWM_O_X_CMPB);
}
else
{
ulReg = HWREG(ulGenBase + PWM_O_X_CMPA);
}
ulReg = ulLoad - ulReg;
//
// If in up/down count mode, double the pulse width.
//
if(HWREG(ulGenBase + PWM_O_X_CTL) & PWM_X_CTL_MODE)
{
ulReg = ulReg * 2;
}
//
// Return the pulse width.
//
return(ulReg);
}
#endif
//*****************************************************************************
//
//! Enables the PWM dead band output, and sets the dead band delays.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to modify. Must be one of
//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2.
//! \param usRise specifies the width of delay from the rising edge.
//! \param usFall specifies the width of delay from the falling edge.
//!
//! This function sets the dead bands for the specified PWM generator,
//! where the dead bands are defined as the number of \b PWM clock ticks
//! from the rising or falling edge of the generator's \b OutA signal.
//! Note that this function causes the coupling of \b OutB to \b OutA.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_deadbandenable) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen,
unsigned short usRise, unsigned short usFall)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
ASSERT(usRise < 4096);
ASSERT(usFall < 4096);
//
// Compute the generator's base address.
//
ulGen = PWM_GEN_BADDR(ulBase, ulGen);
//
// Write the dead band delay values.
//
HWREG(ulGen + PWM_O_X_DBRISE) = usRise;
HWREG(ulGen + PWM_O_X_DBFALL) = usFall;
//
// Enable the deadband functionality.
//
HWREG(ulGen + PWM_O_X_DBCTL) |= PWM_DBCTL_ENABLE;
}
#endif
//*****************************************************************************
//
//! Disables the PWM dead band output.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to modify. Must be one of
//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2.
//!
//! This function disables the dead band mode for the specified PWM generator.
//! Doing so decouples the \b OutA and \b OutB signals.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_deadbanddisable) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Disable the deadband functionality.
//
HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_DBCTL) &= ~(PWM_DBCTL_ENABLE);
}
#endif
//*****************************************************************************
//
//! Synchronizes all pending updates.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGenBits are the PWM generator blocks to be updated. Must be the
//! logical OR of any of \b PWM_GEN_0_BIT, \b PWM_GEN_1_BIT, or
//! \b PWM_GEN_2_BIT.
//!
//! For the selected PWM generators, this function causes all queued updates to
//! the period or pulse width to be applied the next time the corresponding
//! counter becomes zero.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_syncupdate) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT(!(ulGenBits & ~(PWM_GEN_0_BIT | PWM_GEN_1_BIT | PWM_GEN_2_BIT)));
//
// Update the PWM timing registers.
//
HWREG(ulBase + PWM_O_CTL) = ulGenBits;
}
#endif
//*****************************************************************************
//
//! Synchronizes the counters in one or multiple PWM generator blocks.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGenBits are the PWM generator blocks to be synchronized. Must be
//! the logical OR of any of \b PWM_GEN_0_BIT, \b PWM_GEN_1_BIT, or
//! \b PWM_GEN_2_BIT.
//!
//! For the selected PWM module, this function synchronizes the time base
//! of the generator blocks by causing the specified generator counters to be
//! reset to zero.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_synctimebase) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT(!(ulGenBits & ~(PWM_GEN_0_BIT | PWM_GEN_1_BIT | PWM_GEN_2_BIT)));
//
// Synchronize the counters in the specified generators by writing to
// the module's synchronization register.
//
HWREG(ulBase + PWM_O_SYNC) = ulGenBits;
}
#endif
//*****************************************************************************
//
//! Enables or disables PWM outputs.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulPWMOutBits are the PWM outputs to be modified. Must be the
//! logical OR of any of \b PWM_OUT_0_BIT, \b PWM_OUT_1_BIT, \b PWM_OUT_2_BIT,
//! \b PWM_OUT_3_BIT, \b PWM_OUT_4_BIT, or \b PWM_OUT_5_BIT.
//! \param bEnable determines if the signal is enabled or disabled.
//!
//! This function is used to enable or disable the selected PWM outputs. The
//! outputs are selected using the parameter \e ulPWMOutBits. The parameter
//! \e bEnable determines the state of the selected outputs. If \e bEnable is
//! \b true, then the selected PWM outputs are enabled, or placed in the active
//! state. If \e bEnable is \b false, then the selected outputs are disabled,
//! or placed in the inactive state.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_outputstate) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits,
tBoolean bEnable)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT(!(ulPWMOutBits & ~(PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT |
PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT)));
//
// Read the module's ENABLE output control register, and set or clear
// the requested bits.
//
if(bEnable == true)
{
HWREG(ulBase + PWM_O_ENABLE) |= ulPWMOutBits;
}
else
{
HWREG(ulBase + PWM_O_ENABLE) &= ~(ulPWMOutBits);
}
}
#endif
//*****************************************************************************
//
//! Selects the inversion mode for PWM outputs.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulPWMOutBits are the PWM outputs to be modified. Must be the
//! logical OR of any of \b PWM_OUT_0_BIT, \b PWM_OUT_1_BIT, \b PWM_OUT_2_BIT,
//! \b PWM_OUT_3_BIT, \b PWM_OUT_4_BIT, or \b PWM_OUT_5_BIT.
//! \param bInvert determines if the signal is inverted or passed through.
//!
//! This function is used to select the inversion mode for the selected PWM
//! outputs. The outputs are selected using the parameter \e ulPWMOutBits.
//! The parameter \e bInvert determines the inversion mode for the selected
//! outputs. If \e bInvert is \b true, this function will cause the specified
//! PWM output signals to be inverted, or made active low. If \e bInvert is
//! \b false, the specified output will be passed through as is, or be made
//! active high.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_outputinvert) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits,
tBoolean bInvert)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT(!(ulPWMOutBits & ~(PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT |
PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT)));
//
// Read the module's INVERT output control register, and set or clear
// the requested bits.
//
if(bInvert == true)
{
HWREG(ulBase + PWM_O_INVERT) |= ulPWMOutBits;
}
else
{
HWREG(ulBase + PWM_O_INVERT) &= ~(ulPWMOutBits);
}
}
#endif
//*****************************************************************************
//
//! Specifies the state of PWM outputs in response to a fault condition.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulPWMOutBits are the PWM outputs to be modified. Must be the
//! logical OR of any of \b PWM_OUT_0_BIT, \b PWM_OUT_1_BIT, \b PWM_OUT_2_BIT,
//! \b PWM_OUT_3_BIT, \b PWM_OUT_4_BIT, or \b PWM_OUT_5_BIT.
//! \param bFaultKill determines if the signal is killed or passed through
//! during an active fault condition.
//!
//! This function sets the fault handling characteristics of the selected PWM
//! outputs. The outputs are selected using the parameter \e ulPWMOutBits.
//! The parameter \e bFaultKill determines the fault handling characteristics
//! for the selected outputs. If \e bFaultKill is \b true, then the selected
//! outputs will be made inactive. If \e bFaultKill is \b false, then the
//! selected outputs are unaffected by the detected fault.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_outputfault) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits,
tBoolean bFaultKill)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT(!(ulPWMOutBits & ~(PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT |
PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT)));
//
// Read the module's FAULT output control register, and set or clear
// the requested bits.
//
if(bFaultKill == true)
{
HWREG(ulBase + PWM_O_FAULT) |= ulPWMOutBits;
}
else
{
HWREG(ulBase + PWM_O_FAULT) &= ~(ulPWMOutBits);
}
}
#endif
//*****************************************************************************
//
//! Registers an interrupt handler for the specified PWM generator block.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator in question.
//! \param pfnIntHandler is a pointer to the function to be called when the PWM
//! generator interrupt occurs.
//!
//! This function will ensure that the interrupt handler specified by
//! \e pfnIntHandler is called when an interrupt is detected for the specified
//! PWM generator block. This function will also enable the corresponding
//! PWM generator interrupt in the interrupt controller; individual generator
//! interrupts and interrupt sources must be enabled with PWMIntEnable() and
//! PWMGenIntTrigEnable().
//!
//! \sa IntRegister() for important information about registering interrupt
//! handlers.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_genintregister) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen,
void (*pfnIntHandler)(void))
{
unsigned long ulInt;
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Get the interrupt number associated with the specified generator.
//
ulInt = INT_PWM0 + (ulGen >> 6) - 1;
//
// Register the interrupt handler.
//
IntRegister(ulInt, pfnIntHandler);
//
// Enable the PWMx interrupt.
//
IntEnable(ulInt);
}
#endif
//*****************************************************************************
//
//! Removes an interrupt handler for the specified PWM generator block.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator in question.
//!
//! This function will unregister the interrupt handler for the specified
//! PWM generator block. This function will also disable the corresponding
//! PWM generator interrupt in the interrupt controller; individual generator
//! interrupts and interrupt sources must be disabled with PWMIntDisable() and
//! PWMGenIntTrigDisable().
//!
//! \sa IntRegister() for important information about registering interrupt
//! handlers.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_genintunregister) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen)
{
unsigned long ulInt;
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Get the interrupt number associated with the specified generator.
//
ulInt = INT_PWM0 + (ulGen >> 6) - 1;
//
// Disable the PWMx interrupt.
//
IntDisable(ulInt);
//
// Unregister the interrupt handler.
//
IntUnregister(ulInt);
}
#endif
//*****************************************************************************
//
//! Registers an interrupt handler for a fault condition detected in a PWM
//! module.
//!
//! \param ulBase is the base address of the PWM module.
//! \param pfnIntHandler is a pointer to the function to be called when the PWM
//! fault interrupt occurs.
//!
//! This function will ensure that the interrupt handler specified by
//! \e pfnIntHandler is called when a fault interrupt is detected for the
//! selected PWM module. This function will also enable the PWM fault
//! interrupt in the NVIC; the PWM fault interrupt must also be enabled at the
//! module level using PWMIntEnable().
//!
//! \sa IntRegister() for important information about registering interrupt
//! handlers.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_faultintregister) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMFaultIntRegister(unsigned long ulBase, void (*pfnIntHandler)(void))
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
//
// Register the interrupt handler, returning an error if one occurs.
//
IntRegister(INT_PWM_FAULT, pfnIntHandler);
//
// Enable the PWM fault interrupt.
//
IntEnable(INT_PWM_FAULT);
}
#endif
//*****************************************************************************
//
//! Removes the PWM fault condition interrupt handler.
//!
//! \param ulBase is the base address of the PWM module.
//!
//! This function will remove the interrupt handler for a PWM fault interrupt
//! from the selected PWM module. This function will also disable the PWM
//! fault interrupt in the NVIC; the PWM fault interrupt must also be disabled
//! at the module level using PWMIntDisable().
//!
//! \sa IntRegister() for important information about registering interrupt
//! handlers.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_faultintunregister) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMFaultIntUnregister(unsigned long ulBase)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
//
// Disable the PWM fault interrupt.
//
IntDisable(INT_PWM_FAULT);
//
// Unregister the interrupt handler, returning an error if one occurs.
//
IntUnregister(INT_PWM_FAULT);
}
#endif
//*****************************************************************************
//
//! Enables interrupts and triggers for the specified PWM generator block.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to have interrupts and triggers enabled.
//! Must be one of \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2.
//! \param ulIntTrig specifies the interrupts and triggers to be enabled.
//!
//! Unmasks the specified interrupt(s) and trigger(s) by setting the
//! specified bits of the interrupt/trigger enable register for the specified
//! PWM generator. The defined values for the bits are as follows:
//!
//! - PWM_INT_CNT_ZERO
//! - PWM_INT_CNT_LOAD
//! - PWM_INT_CMP_AU
//! - PWM_INT_CMP_AD
//! - PWM_INT_CMP_BU
//! - PWM_INT_CMP_BD
//! - PWM_TR_CNT_ZERO
//! - PWM_TR_CNT_LOAD
//! - PWM_TR_CMP_AU
//! - PWM_TR_CMP_AD
//! - PWM_TR_CMP_BU
//! - PWM_TR_CMP_BD
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_geninttrigenable) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen,
unsigned long ulIntTrig)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Enable the specified interrupts/triggers.
//
HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_INTEN) |= ulIntTrig;
}
#endif
//*****************************************************************************
//
//! Disables interrupts for the specified PWM generator block.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to have interrupts and triggers disabled.
//! Must be one of \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2.
//! \param ulIntTrig specifies the interrupts and triggers to be disabled.
//!
//! Masks the specified interrupt(s) and trigger(s) by clearing the
//! specified bits of the interrupt/trigger enable register for the specified
//! PWM generator. The defined values for the bits are as follows:
//!
//! - PWM_INT_CNT_ZERO
//! - PWM_INT_CNT_LOAD
//! - PWM_INT_CMP_AU
//! - PWM_INT_CMP_AD
//! - PWM_INT_CMP_BU
//! - PWM_INT_CMP_BD
//! - PWM_TR_CNT_ZERO
//! - PWM_TR_CNT_LOAD
//! - PWM_TR_CMP_AU
//! - PWM_TR_CMP_AD
//! - PWM_TR_CMP_BU
//! - PWM_TR_CMP_BD
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_geninttrigdisable) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen,
unsigned long ulIntTrig)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Disable the specified interrupts/triggers.
//
HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_INTEN) &= ~(ulIntTrig);
}
#endif
//*****************************************************************************
//
//! Gets interrupt status for the specified PWM generator block.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to query. Must be one of \b PWM_GEN_0,
//! \b PWM_GEN_1, or \b PWM_GEN_2.
//! \param bMasked specifies whether masked or raw interrupt status is
//! returned.
//!
//! If \e bMasked is set as \b true, then the masked interrupt status is
//! returned; otherwise, the raw interrupt status will be returned.
//!
//! \return Returns the contents of the interrupt status register, or the
//! contents of the raw interrupt status register, for the specified
//! PWM generator.
//
//*****************************************************************************
#if defined(GROUP_genintstatus) || defined(BUILD_ALL) || defined(DOXYGEN)
unsigned long
PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, tBoolean bMasked)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Compute the generator's base address.
//
ulGen = PWM_GEN_BADDR(ulBase, ulGen);
//
// Read and return the specified generator's raw or enabled interrupt
// status.
//
if(bMasked == true)
{
return(HWREG(ulGen + PWM_O_X_ISC));
}
else
{
return(HWREG(ulGen + PWM_O_X_RIS));
}
}
#endif
//*****************************************************************************
//
//! Clears the specified interrupt(s) for the specified PWM generator block.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGen is the PWM generator to query. Must be one of \b PWM_GEN_0,
//! \b PWM_GEN_1, or \b PWM_GEN_2.
//! \param ulInts specifies the interrupts to be cleared.
//!
//! Clears the specified interrupt(s) by writing a 1 to the specified bits
//! of the interrupt status register for the specified PWM generator. The
//! defined values for the bits are as follows:
//!
//! - PWM_INT_CNT_ZERO
//! - PWM_INT_CNT_LOAD
//! - PWM_INT_CMP_AU
//! - PWM_INT_CMP_AD
//! - PWM_INT_CMP_BU
//! - PWM_INT_CMP_BD
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_genintclear) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, unsigned long ulInts)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) ||
(ulGen == PWM_GEN_2));
//
// Clear the requested interrupts by writing ones to the specified bit
// of the module's interrupt enable register.
//
HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_ISC) = ulInts;
}
#endif
//*****************************************************************************
//
//! Enables generator and fault interrupts for a PWM module.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGenFault contains the interrupts to be enabled. Must be a logical
//! OR of any of \b PWM_INT_GEN_0, \b PWM_INT_GEN_1, \b PWM_INT_GEN_2, or
//! \b PWM_INT_FAULT.
//!
//! Unmasks the specified interrupt(s) by setting the specified bits of
//! the interrupt enable register for the selected PWM module.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
//
// Read the module's interrupt enable register, and enable interrupts
// for the specified PWM generators.
//
HWREG(ulBase + PWM_O_INTEN) |= ulGenFault;
}
#endif
//*****************************************************************************
//
//! Disables generator and fault interrupts for a PWM module.
//!
//! \param ulBase is the base address of the PWM module.
//! \param ulGenFault contains the interrupts to be disabled. Must be a
//! logical OR of any of \b PWM_INT_GEN_0, \b PWM_INT_GEN_1, \b PWM_INT_GEN_2,
//! or \b PWM_INT_FAULT.
//!
//! Masks the specified interrupt(s) by clearing the specified bits of
//! the interrupt enable register for the selected PWM module.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
//
// Read the module's interrupt enable register, and disable interrupts
// for the specified PWM generators.
//
HWREG(ulBase + PWM_O_INTEN) &= ~(ulGenFault);
}
#endif
//*****************************************************************************
//
//! Clears the fault interrupt for a PWM module.
//!
//! \param ulBase is the base address of the PWM module.
//!
//! Clears the fault interrupt by writing to the appropriate bit of the
//! interrupt status register for the selected PWM module.
//!
//! \return None.
//
//*****************************************************************************
#if defined(GROUP_faultintclear) || defined(BUILD_ALL) || defined(DOXYGEN)
void
PWMFaultIntClear(unsigned long ulBase)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
//
// Write the only writeable bit in the module's interrupt register.
//
HWREG(ulBase + PWM_O_ISC) = PWM_INT_INTFAULT;
}
#endif
//*****************************************************************************
//
//! Gets the interrupt status for a PWM module.
//!
//! \param ulBase is the base address of the PWM module.
//! \param bMasked specifies whether masked or raw interrupt status is
//! returned.
//!
//! If \e bMasked is set as \b true, then the masked interrupt status is
//! returned; otherwise, the raw interrupt status will be returned.
//!
//! \return The current interrupt status, enumerated as a bit field of
//! \b PWM_INT_GEN_0, \b PWM_INT_GEN_1, \b PWM_INT_GEN_2, and \b PWM_INT_FAULT.
//!
//*****************************************************************************
#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN)
unsigned long
PWMIntStatus(unsigned long ulBase, tBoolean bMasked)
{
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
//
// Read and return either the module's raw or enabled interrupt status.
//
if(bMasked == true)
{
return(HWREG(ulBase + PWM_O_ISC));
}
else
{
return(HWREG(ulBase + PWM_O_RIS));
}
}
#endif
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************