- /**************************************************************************//**
- * [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. ***/
|