/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url] main.c
* [url=home.php?mod=space&uid=895143]@version[/url] V3.00
* $Revision: 3 $
* $Date: 17/05/04 1:55p $
* [url=home.php?mod=space&uid=247401]@brief[/url] Change duty cycle and period of output waveform in PWM down count type.
* @note
* Copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
******************************************************************************/
#include <stdio.h>
#include "NUC029xGE.h"
#define PLL_CLOCK 72000000
volatile uint32_t gu32Period;
/**
* @brief Timer0 IRQ
*
* @param None
*
* [url=home.php?mod=space&uid=266161]@return[/url] None
*
* [url=home.php?mod=space&uid=1543424]@Details[/url] The Timer0 default IRQ, declared in startup_NUC029xGE.s.
*/
void TMR0_IRQHandler(void)
{
static uint32_t u32Toggle = 0;
if(TPWM_GET_PERIOD_INT_FLAG(TIMER0))
{
if(u32Toggle == 0)
{
/* Set PWM period to generate output frequency 36000 Hz */
TPWM_SET_PERIOD(TIMER0, ((gu32Period / 2) - 1));
/* Set PWM duty, 40% */
TPWM_SET_CMPDAT(TIMER0, (((gu32Period / 2) * 4) / 10));
}
else
{
/* Set PWM period to generate output frequency 18000 Hz */
TPWM_SET_PERIOD(TIMER0, (gu32Period - 1));
/* Set PWM duty, 50% */
TPWM_SET_CMPDAT(TIMER0, (gu32Period / 2));
}
u32Toggle ^= 1;
TPWM_CLEAR_PERIOD_INT_FLAG(TIMER0);
}
}
void SYS_Init(void)
{
/*---------------------------------------------------------------------------------------------------------*/
/* Init System Clock */
/*---------------------------------------------------------------------------------------------------------*/
/* Enable HIRC clock */
CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
/* Waiting for HIRC clock ready */
CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
/* Switch HCLK clock source to HIRC */
CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
/* Enable HXT */
CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
/* Waiting for clock ready */
CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
/* Set core clock as PLL_CLOCK from PLL and SysTick source to HCLK/2*/
CLK_SetCoreClock(PLL_CLOCK);
CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLKSEL_HCLK_DIV2);
/* Enable peripheral clock */
CLK_EnableModuleClock(UART0_MODULE);
CLK_EnableModuleClock(TMR0_MODULE);
/* Peripheral clock source */
CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_PLL, CLK_CLKDIV0_UART(1));
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_PCLK0, 0);
/*---------------------------------------------------------------------------------------------------------*/
/* Init I/O Multi-function */
/*---------------------------------------------------------------------------------------------------------*/
/* Set multi-function pins for UART0 RXD and TXD */
SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk);
SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA3MFP_UART0_RXD | SYS_GPA_MFPL_PA2MFP_UART0_TXD);
/* Set Timer0 PWM CH0(TM0) pin */
SYS->GPD_MFPL &= ~SYS_GPD_MFPL_PD4MFP_Msk;
SYS->GPD_MFPL |= SYS_GPD_MFPL_PD4MFP_TM0;
}
void UART0_Init(void)
{
/*---------------------------------------------------------------------------------------------------------*/
/* Init UART */
/*---------------------------------------------------------------------------------------------------------*/
/* Reset UART module */
SYS_ResetModule(UART0_RST);
/* Configure UART0 and set UART0 Baudrate */
UART_Open(UART0, 115200);
}
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{
/* Unlock protected registers */
SYS_UnlockReg();
/* Init System, peripheral clock and multi-function I/O */
SYS_Init();
/* Lock protected registers */
SYS_LockReg();
/* Init UART0 for printf */
UART0_Init();
printf("\n\nCPU @ %d Hz\n", SystemCoreClock);
printf("+-----------------------------------------------+\n");
printf("| Timer PWM Change Duty Cycle Sample Code |\n");
printf("+-----------------------------------------------+\n\n");
printf("# Timer0 PWM_CH0 frequency of first period is 18 kHz and duty is 50%%.\n");
printf("# Timer0 PWM_CH0 frequency of second period is 36 kHz and duty is 40%%.\n");
printf("# I/O configuration:\n");
printf(" - Timer0 PWM_CH0 on PD.4\n\n");
printf(" Timer0 PWM_CH0 waveform of this sample shown below: \n");
printf("\n");
printf(" |<- PERIOD0+1 ->| \n");
printf(" |<- CMP0 ->| \n");
printf(" |<- PERIOD1+1 ->| \n");
printf(" |<CMP1 >| \n");
printf(" __ ______________ _______ \n");
printf(" |______50%%_____| 50%% |___60%%__| 40%% |___ PWM_CH0 outut duty \n");
printf("\n");
/* Change Timer to PWM counter mode */
TPWM_ENABLE_PWM_MODE(TIMER0);
/* Set PWM mode as independent mode*/
TPWM_ENABLE_INDEPENDENT_MODE(TIMER0);
/* Set Timer0 PWM output frequency is 18000 Hz, duty 50% in up count type */
TPWM_ConfigOutputFreqAndDuty(TIMER0, 18000, 50);
/* Get initial period and comparator value */
gu32Period = TPWM_GET_PERIOD(TIMER0) + 1;
/* Set PWM down count type */
TPWM_SET_COUNTER_TYPE(TIMER0, TPWM_DOWN_COUNT);
/* Enable output of PWM_CH0 */
TPWM_ENABLE_OUTPUT(TIMER0, TPWM_CH0);
/* Enable period event interrupt */
TPWM_ENABLE_PERIOD_INT(TIMER0);
NVIC_EnableIRQ(TMR0_IRQn);
/* Start Timer PWM counter */
TPWM_START_COUNTER(TIMER0);
printf("*** Check Timer0 PWM_CH0 output waveform by oscilloscope ***\n");
while(1);
}
/*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/
|