/******************************************************************************
* @file main.c
* @version V1.00
* $Revision: 3 $
* $Date: 13/10/07 3:54p $
* @brief Timer sample for Mini51 series MCU
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "Mini51Series.h"
uint32_t TCAP0_old;
void TMR0_IRQHandler(void)
{
uint32_t TCAP0_tmp = TIMER0->TCAP;
printf("%d\n\r",(12000000/(TCAP0_tmp*2))*60);
/*
if(TCAP0_tmp==0)
{
printf("cap:0\n\r");
}
if(TCAP0_old!=TCAP0_tmp)
{
printf("%d\n\r",TCAP0_tmp-TCAP0_old);
TCAP0_old=TCAP0_tmp;
}
*/
TIMER0->TEXISR = TIMER_TEXISR_TEXIF_Msk;
}
void SYS_Init(void)
{
/*---------------------------------------------------------------------------------------------------------*/
/* Init System Clock */
/*---------------------------------------------------------------------------------------------------------*/
/* Unlock protected registers */
while(SYS->RegLockAddr != 1) {
SYS->RegLockAddr = 0x59;
SYS->RegLockAddr = 0x16;
SYS->RegLockAddr = 0x88;
}
SYS->P5_MFP=0X03;
/* Enable external 12MHz XTAL (UART), and internal 22.1184MHz */
CLK->PWRCON = CLK_PWRCON_XTL12M | CLK_PWRCON_IRC22M_EN_Msk;
/* Waiting for clock ready */
while((CLK->CLKSTATUS & (CLK_CLKSTATUS_IRC22M_STB_Msk |CLK_CLKSTATUS_XTL_STB_Msk)) !=
(CLK_CLKSTATUS_IRC22M_STB_Msk |CLK_CLKSTATUS_XTL_STB_Msk));
/* Enable UART and Timer 0 clock */
CLK->APBCLK = CLK_APBCLK_UART_EN_Msk | CLK_APBCLK_TMR0_EN_Msk;
/* Select Timer 0 clock source from external crystal*/
CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_TMR0_S_Msk) | CLK_CLKSEL1_TMR0_S_XTAL;
/* Update System Core Clock */
/* User can use SystemCoreClockUpdate() to calculate SystemCoreClock and CycylesPerUs automatically. */
SystemCoreClockUpdate();
/*---------------------------------------------------------------------------------------------------------*/
/* Init I/O Multi-function */
/*---------------------------------------------------------------------------------------------------------*/
/* Set P1 multi-function pins for UART RXD, TXD */
SYS->P0_MFP = SYS_MFP_P00_TXD | SYS_MFP_P01_RXD;
/* Set P3 multi function pin for Timer 0 capture pin */
SYS->P3_MFP = SYS_MFP_P32_T0EX;
/* Lock protected registers */
SYS->RegLockAddr = 0;
}
void UART_Init(void)
{
// Set UART to 8 bit character length, 1 stop bit, and no parity
UART->LCR = UART_LCR_WLS_Msk;
// 22.1184 MHz reference clock input, for 115200 bps
// 22118400 / 115200 = 192. Using mode 2 to calculate baudrate, 192 - 2 = 190 = 0xBE
UART->BAUD = UART_BAUD_DIV_X_EN_Msk | UART_BAUD_DIV_X_ONE_Msk | (0xBE);
}
int main(void)
{
int volatile i;
/* 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 */
SYS_Init();
/* Init UART to 115200-8n1 for print message */
UART_Init();
printf("\nThis sample code demonstrat timer trigger counting mode.\n");
printf("Please connect input source with Timer 0 capture pin T0EX (P3.2), press any key to continue\n");
//getchar();
TIMER0->TCSR = TIMER_TCSR_CEN_Msk | TIMER_TCSR_TDR_EN_Msk|TIMER_CONTINUOUS_MODE | 0;
// Set compare value as large as possible
TIMER0->TCMPR = 0xFFFFFF;
// Configure Timer 0 trigger counting mode, capture TDR value on falling edge, enable capture interrupt
TIMER0->TEXCON = TIMER_TEXCON_CAP_MODE_Msk|
TIMER_CAPTURE_TRIGGER_COUNTING_MODE |
TIMER_CAPTURE_FALLING_EDGE |
TIMER_TEXCON_TEXIEN_Msk |
TIMER_TEXCON_TEXEN_Msk|
TIMER_TEXCON_TEXDB_Msk;
NVIC_EnableIRQ(TMR0_IRQn);
while(1);
}
/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
|