//***************************************************************************** | |
// | |
// 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. | |
//! @} | |
// | |
//***************************************************************************** |