- /**************************************************************************//**
- * [url=home.php?mod=space&uid=288409]@file[/url] main.c
- * @brief
- * Demonstrate how to use the TIMER0 capture function to capture
- * both edge of external capture signal and calculate the time
- * of high level duration of capture signal.
- * @note
- * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
- ******************************************************************************/
- #include <stdio.h>
- #include "M0518.h"
- /****************************************************************************/
- /* Define */
- /****************************************************************************/
- #define HCLK_CLOCK 50000000
- /****************************************************************************/
- /* Global variables */
- /****************************************************************************/
- volatile uint32_t g_au32TMRCapCountRise, g_au32TMRCapCountFall, g_u32TimerCapFlag;
- /****************************************************************************/
- /* Functions */
- /****************************************************************************/
- /*------------------------------*/
- /* TIMER0 interrupt handler */
- /*------------------------------*/
- void TMR0_IRQHandler(void)
- {
- if (TIMER_GetCaptureIntFlag(TIMER0) == 1)
- {
- /* Clear TIMER0 capture interrupt flag */
- TIMER_ClearCaptureIntFlag(TIMER0);
- if (PB15)
- {
- /* Save the capture counter for PB15 rising edge */
- g_au32TMRCapCountRise = TIMER_GetCaptureData(TIMER0);
- }
- else
- {
- /* Save the capture counter for PB15 falling edge */
- g_au32TMRCapCountFall = TIMER_GetCaptureData(TIMER0);
- g_u32TimerCapFlag = 1;
- }
- }
- }
- void SYS_Init(void)
- {
- /*------------------------------*/
- /* Init System Clock */
- /*------------------------------*/
- /* Enable HIRC clock */
- CLK_EnableXtalRC(CLK_PWRCON_IRC22M_EN_Msk);
- /* Waiting for HIRC clock ready */
- CLK_WaitClockReady(CLK_CLKSTATUS_IRC22M_STB_Msk);
- /* Switch HCLK clock source to HIRC */
- CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
- /* Enable HXT */
- CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);
- /* Waiting for clock ready */
- CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);
- /* Set core clock as HCLK_CLOCK from PLL and SysTick source to HCLK/2*/
- CLK_SetCoreClock(HCLK_CLOCK);
- /* Enable peripheral clock */
- CLK_EnableModuleClock(UART0_MODULE);
- CLK_EnableModuleClock(TMR0_MODULE);
- /* Peripheral clock source */
- CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));
- CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HCLK, 0);
- /*------------------------------*/
- /* Init I/O Multi-function */
- /*------------------------------*/
- /* Set PB multi-function pins for UART0 RXD, TXD */
- SYS->GPB_MFP = SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;
- /* Set PB multi-function pins for TM0_EXT on PB.15 */
- SYS->GPB_MFP |= (SYS_GPB_MFP_PB15_TM0_EXT);
- SYS->ALT_MFP = SYS_ALT_MFP_PB15_TM0_EXT;
- }
- void UART0_Init(void)
- {
- /*------------------------------*/
- /* Init UART */
- /*------------------------------*/
- /* Reset UART IP */
- SYS_ResetModule(UART0_RST);
- /* Configure UART0 and set UART0 Baudrate */
- UART_Open(UART0, 115200);
- }
- /*------------------------------*/
- /* Main Function */
- /*------------------------------*/
- int main(void)
- {
- uint32_t u32CAPValue = 0;
- uint32_t u32delayCounter;
- /* 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("CPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
- printf("+------------------------------------------+\n");
- printf("| TIMER0 Capture Counter Sample Code |\n");
- printf("+------------------------------------------+\n\n");
- printf(" * Please connect PB14 and PB15 by wire.\n");
- /* Config PB14 to GPIO output mode to generate a pulse as external capture signal */
- PB14 = 0;
- GPIO_SetMode(PB, BIT14, GPIO_PMD_OUTPUT);
- /*----- Initial TIMER0 -----*/
- SYS_ResetModule(TMR0_RST);
- TIMER_Open(TIMER0, TIMER_CONTINUOUS_MODE, 1);
- /* Configure TIMER0 setting for external counter input and capture function */
- /* Set TIMER0 clock to HCLK/(1+1) */
- TIMER_SET_PRESCALE_VALUE(TIMER0, 1);
- printf("TIMER0 clock @ %d Hz\n", SystemCoreClock / 2);
- /* Reset TIMER0 counter value */
- TIMER_SET_CMP_VALUE(TIMER0, 0xFFFFFF);
- /* Set TIMER0 to capture both edges */
- TIMER_EnableCapture(TIMER0, TIMER_CAPTURE_FREE_COUNTING_MODE, TIMER_CAPTURE_FALLING_AND_RISING_EDGE);
- /* Enable TIMER0 capture interrupt */
- TIMER_EnableCaptureInt(TIMER0);
- NVIC_EnableIRQ(TMR0_IRQn);
- /*---- Begin to test -----*/
- g_au32TMRCapCountRise = g_au32TMRCapCountFall = g_u32TimerCapFlag = 0;
- /* Start TIMER0 counting */
- TIMER_Start(TIMER0);
- /* Generate a pulse with both rising edge and falling edge to PB14 */
- PB14 = 1; /* Rising edge */
- /* Delay to keep high level of pulse. */
- /* Change the delay counter will get different capture counter value */
- for (u32delayCounter = 0; u32delayCounter < 10000; u32delayCounter++);
- PB14 = 0; /* Falling edge */
- /* Wait a rising edge and a falling edge from PB15 */
- /* TIMER0 interrupt handler will set g_u32TimerCapFlag to 1 when received */
- /* external capture signal from PB15 */
- while (g_u32TimerCapFlag == 0);
- /* Got the counter value for external capture signal */
- if (g_au32TMRCapCountFall > g_au32TMRCapCountRise)
- u32CAPValue = g_au32TMRCapCountFall - g_au32TMRCapCountRise;
- else
- /* In the case that TIMER0 counter overflowed */
- u32CAPValue = 0xffffff - g_au32TMRCapCountRise + g_au32TMRCapCountFall;
- printf("Capture counter for rising edge: 0x%X (%d)\n", g_au32TMRCapCountRise, g_au32TMRCapCountRise);
- printf("Capture counter for falling edge: 0x%X (%d)\n", g_au32TMRCapCountFall, g_au32TMRCapCountFall);
- printf("\n");
- printf("Capture counter for high level duration: 0x%X (%d)\n", u32CAPValue, u32CAPValue);
- printf("The high level duration time should be about (TIMER0 clock) * %d\n", u32CAPValue);
- printf(" = %d us\n", u32CAPValue / (SystemCoreClock / 2 / 1000000));
- /* Stop TIMER0 counting */
- TIMER_Close(TIMER0);
- while (1);
- }
- /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
|