blob: 7fc8ec7f2cf16a8bfb1930f217d484430e335668 [file] [log] [blame]
/*
* 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)
{
}
}