| /* |
| * Copyright (c) 2015, Freescale Semiconductor, Inc. |
| * Copyright 2016-2017 NXP |
| * All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| #include "fsl_debug_console.h" |
| #include "board.h" |
| #include "fsl_pwm.h" |
| |
| #include "pin_mux.h" |
| #include "clock_config.h" |
| #include "fsl_common.h" |
| /******************************************************************************* |
| * Definitions |
| ******************************************************************************/ |
| #define DEMO_PWM_BASEADDR PWM4 |
| #define DEMO_PWM_IRQn PWM4_IRQn |
| #define DEMO_PWM_IRQHandler PWM4_IRQHandler |
| /*! @brief PWM period value. PWMO (Hz) = PCLK(Hz) / (period +2) */ |
| #define PWM_PERIOD_VALUE 30 |
| |
| /******************************************************************************* |
| * Prototypes |
| ******************************************************************************/ |
| |
| /******************************************************************************* |
| * Variables |
| ******************************************************************************/ |
| volatile uint32_t pwmDutycycle = 0U; |
| volatile bool pwmDutyUp = true; /* Indicate PWM Duty cycle is increase or decrease */ |
| |
| /******************************************************************************* |
| * Code |
| ******************************************************************************/ |
| |
| void DEMO_PWM_IRQHandler(void) |
| { |
| /* Gets interrupt kPWM_FIFOEmptyFlag */ |
| if (PWM_GetStatusFlags(DEMO_PWM_BASEADDR) & kPWM_FIFOEmptyFlag) |
| { |
| if (pwmDutyUp) |
| { |
| /* Increase duty cycle until it reach limited value. */ |
| if (++pwmDutycycle > PWM_PERIOD_VALUE) |
| { |
| pwmDutycycle = PWM_PERIOD_VALUE; |
| pwmDutyUp = false; |
| } |
| } |
| else |
| { |
| /* Decrease duty cycle until it reach limited value. */ |
| if (--pwmDutycycle == 0U) |
| { |
| pwmDutyUp = true; |
| } |
| } |
| /* Write duty cycle to PWM sample register. */ |
| PWM_SetSampleValue(DEMO_PWM_BASEADDR, pwmDutycycle); |
| /* Clear kPWM_FIFOEmptyFlag */ |
| PWM_clearStatusFlags(DEMO_PWM_BASEADDR, kPWM_FIFOEmptyFlag); |
| } |
| SDK_ISR_EXIT_BARRIER; |
| } |
| |
| /*! |
| * @brief Main function |
| */ |
| int main(void) |
| { |
| pwm_config_t pwmConfig; |
| |
| /* Board pin, clock, debug console init */ |
| /* Board specific RDC settings */ |
| BOARD_RdcInit(); |
| |
| BOARD_InitPins(); |
| BOARD_BootClockRUN(); |
| BOARD_InitDebugConsole(); |
| BOARD_InitMemory(); |
| |
| PRINTF("\r\nPWM driver example.\r\n"); |
| |
| /*! |
| * config->enableStopMode = false; |
| * config->enableDozeMode = false; |
| * config->enableWaitMode = false; |
| * config->enableDebugMode = false; |
| * config->clockSource = kPWM_LowFrequencyClock; |
| * config->prescale = 0U; |
| * config->outputConfig = kPWM_SetAtRolloverAndClearAtcomparison; |
| * config->fifoWater = kPWM_FIFOWaterMark_2; |
| * config->sampleRepeat = kPWM_EachSampleOnce; |
| * config->byteSwap = kPWM_ByteNoSwap; |
| * config->halfWordSwap = kPWM_HalfWordNoSwap; |
| */ |
| PWM_GetDefaultConfig(&pwmConfig); |
| |
| /* Initialize PWM module */ |
| PWM_Init(DEMO_PWM_BASEADDR, &pwmConfig); |
| |
| /* Enable FIFO empty interrupt */ |
| PWM_EnableInterrupts(DEMO_PWM_BASEADDR, kPWM_FIFOEmptyInterruptEnable); |
| |
| /* Three initial samples be written to the PWM Sample Register */ |
| for (pwmDutycycle = 0u; pwmDutycycle < 3; pwmDutycycle++) |
| { |
| PWM_SetSampleValue(DEMO_PWM_BASEADDR, pwmDutycycle); |
| } |
| |
| /* Check and Clear interrupt status flags */ |
| if (PWM_GetStatusFlags(DEMO_PWM_BASEADDR)) |
| { |
| PWM_clearStatusFlags(DEMO_PWM_BASEADDR, |
| kPWM_FIFOEmptyFlag | kPWM_RolloverFlag | kPWM_CompareFlag | kPWM_FIFOWriteErrorFlag); |
| } |
| |
| /* Write the period to the PWM Period Register */ |
| PWM_SetPeriodValue(DEMO_PWM_BASEADDR, PWM_PERIOD_VALUE); |
| |
| /* Enable PWM interrupt request */ |
| EnableIRQ(DEMO_PWM_IRQn); |
| |
| PWM_StartTimer(DEMO_PWM_BASEADDR); |
| |
| while (1) |
| { |
| } |
| } |