- /**************************************************************************//**
- * [url=home.php?mod=space&uid=288409]@file[/url] main.c
- * [url=home.php?mod=space&uid=895143]@version[/url] V1.00
- * $Revision: 4 $
- * $Date: 14/02/10 3:06p $
- * [url=home.php?mod=space&uid=247401]@brief[/url] M051 Series PWM Generator and Capture Timer Driver Sample Code
- *
- * @note
- * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
- *
- ******************************************************************************/
- #include <stdio.h>
- #include "M051Series.h"
- /*---------------------------------------------------------------------------------------------------------*/
- /* Macro, type and constant definitions */
- /*---------------------------------------------------------------------------------------------------------*/
- #define PLLCON_SETTING CLK_PLLCON_50MHz_HXT
- #define PLL_CLOCK 50000000
- /*---------------------------------------------------------------------------------------------------------*/
- /* Global variables */
- /*---------------------------------------------------------------------------------------------------------*/
- /**
- * @brief PWMA IRQ Handler
- *
- * @param None
- *
- * [url=home.php?mod=space&uid=266161]@return[/url] None
- *
- * [url=home.php?mod=space&uid=1543424]@Details[/url] ISR to handle PWMA interrupt event
- */
- void PWMA_IRQHandler(void)
- {
- static uint32_t cnt;
- static uint32_t out;
- // Channel 0 frequency is 100Hz, every 1 second enter this IRQ handler 100 times.
- if(++cnt == 100)
- {
- if(out)
- PWM_EnableOutput(PWMA, 0xF);
- else
- PWM_DisableOutput(PWMA, 0xF);
- out ^= 1;
- cnt = 0;
- }
- // Clear channel 0 period interrupt flag
- PWM_ClearPeriodIntFlag(PWMA, 0);
- }
- void SYS_Init(void)
- {
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init System Clock */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Enable Internal RC clock */
- CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);
- /* Waiting for IRC22M clock ready */
- CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
- /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
- CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
- /* Enable external 12MHz XTAL, internal 22.1184MHz */
- CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC22M_EN_Msk);
- /* Enable PLL and Set PLL frequency */
- CLK_SetCoreClock(PLLCON_SETTING);
- /* Waiting for clock ready */
- CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_OSC22M_STB_Msk);
- /* Switch HCLK clock source to PLL, STCLK to HCLK/2 */
- CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(2));
- /* Enable UART module clock */
- CLK_EnableModuleClock(UART0_MODULE);
- /* Enable PWM module clock */
- CLK_EnableModuleClock(PWM01_MODULE);
- CLK_EnableModuleClock(PWM23_MODULE);
- /* Select UART module clock source */
- CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
- /* Select PWM module clock source */
- CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HXT, 0);
- CLK_SetModuleClock(PWM23_MODULE, CLK_CLKSEL1_PWM23_S_HXT, 0);
- /* Reset PWMA channel0~channel3 */
- SYS_ResetModule(PWM03_RST);
- /* Update System Core Clock */
- /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
- //SystemCoreClockUpdate();
- PllClock = PLL_CLOCK; // PLL
- SystemCoreClock = PLL_CLOCK / 1; // HCLK
- CyclesPerUs = PLL_CLOCK / 1000000; // For SYS_SysTickDelay()
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init I/O Multi-function */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Set P3 multi-function pins for UART0 RXD and TXD */
- SYS->P3_MFP = SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;
- /* Set P2 multi-function pins for PWMA Channel0~3 */
- SYS->P2_MFP = SYS_MFP_P20_PWM0 | SYS_MFP_P21_PWM1 | SYS_MFP_P22_PWM2 | SYS_MFP_P23_PWM3;
- }
- /*---------------------------------------------------------------------------------------------------------*/
- /* Main Function */
- /*---------------------------------------------------------------------------------------------------------*/
- int32_t main(void)
- {
- /* Init System, IP clock and multi-function I/O
- In the end of SYS_Init() will issue SYS_LockReg()
- to lock protected register. If user want to write
- protected register, please issue SYS_UnlockReg()
- to unlock protected register if necessary */
- /* Unlock protected registers */
- SYS_UnlockReg();
- /* Init System, IP clock and multi-function I/O */
- SYS_Init();
- /* Lock protected registers */
- SYS_LockReg();
- /* Init UART to 115200-8n1 for print message */
- UART_Open(UART0, 115200);
- printf("+------------------------------------------------------------------------+\n");
- printf("| PWM Driver Sample Code |\n");
- printf("| |\n");
- printf("+------------------------------------------------------------------------+\n");
- printf(" This sample code will output all PWMA channels with different\n");
- printf(" frequency and duty, enable dead zone function of all PWMA pairs.\n");
- printf(" And also enable/disable PWM output every 1 second.\n");
- printf(" I/O configuration:\n");
- printf(" waveform output pin: PWM0(P2.0), PWM1(P2.1), PWM2(P2.2), PWM3(P2.3)\n");
- // PWM0 frequency is 100Hz, duty 30%,
- PWM_ConfigOutputChannel(PWMA, PWM_CH0, 100, 30);
- PWM_EnableDeadZone(PWMA, PWM_CH0, 400);
- // PWM2 frequency is 300Hz, duty 50%
- PWM_ConfigOutputChannel(PWMA, PWM_CH2, 300, 50);
- PWM_EnableDeadZone(PWMA, PWM_CH2, 200);
- // Enable output of all PWMA channels
- PWM_EnableOutput(PWMA, 0xF);
- // Enable PWMA channel 0 period interrupt, use channel 0 to measure time.
- PWM_EnablePeriodInt(PWMA, PWM_CH0, 0);
- NVIC_EnableIRQ(PWMA_IRQn);
- // Start
- PWM_Start(PWMA, 0xF);
- while(1);
- }