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