打印
[Cortex-M0技术交流]

定时器Timer 捕捉实现 频率测定

[复制链接]
3701|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
suiwei|  楼主 | 2012-7-20 09:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>

/*---------------------------------------------------------------------------------------------------------*/
/*  Include hear file   
   
                                                           */
/*---------------------------------------------------------------------------------------------------------*/

#include "DrvTIMER.h"
#include "DrvUART.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "assert.h"
#include "DrvPWM.h"


/*---------------------------------------------------------------------------------------------------------*/
/* Global variables                                                                                        */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t volatile complete = 0;

static int cnt = 0;

void TMR1_Callback(uint32_t u32Param)
{
        printf("%d=>%d Hz\n", ++cnt, (12000000 * 100) / DrvTIMER_GetCaptureData(E_TMR1));

complete = 1;
}

/*---------------------------------------------------------------------------------------------------------*/
/* PWM Timer Callback function                                                                             */
/*---------------------------------------------------------------------------------------------------------*/



/*---------------------------------------------------------------------------------------------------------*/
/*  Main Function
                                          
   */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main (void)
{

S_DRVPWM_TIME_DATA_T sPt;



  STR_UART_T param;



uint8_t u8Timer = DRVPWM_TIMER1;


UNLOCKREG();
    CLK->PWRCTL_BITS.LXT_EN = 1;

CLK->PWRCTL_BITS.HXT_EN = 1;
    DrvSYS_Open(32000000);//将时钟设定为32MHz





while(1)

if (CLK->CLKSTATUS_BITS.LXT_STB == 1)

break;






//DrvSYS_SelectHCLKSource (1);


    //DrvSYS_Delay(5000);



//DrvGPIO_InitFunction (E_FUNC_CLKO);//将GPIOB.12设置为CLKO输出









//DrvSYS_SelectIPClockSource (FRQDIV_CLK_SET, 0x02);// 分频源选择


   //DrvSYS_SetFreqDividerOutput (1, 0); // 使能与分频







DrvGPIO_InitFunction(E_FUNC_PWM01); // 设置GPIO口的PWM01功能


    DrvPWM_Open(DRVPWM_TIMER1); //使能PWM时钟并复位
    DrvSYS_Delay(500);

/* PWM Timer property */
sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;
sPt.u8HighPulseRatio = 20; /* High Pulse peroid : Total Pulse peroid = 20 : 100 */
sPt.i32Inverter = 0;
sPt.u32Frequency = 600000; // Set 1KHz to PWM timer output frequency


/* Select PWM engine clock */
DrvPWM_SelectClockSource(DRVPWM_TIMER1,DRVPWM_HCLK); //选择系统时钟作为PWM的时钟
//DrvPWM_SelectClockSource(u8Timer, DRVPWM_EXT_12M);
/* Set PWM Timer0 Configuration */
DrvPWM_SetTimerClk(u8Timer, &sPt);
/* Enable Output for PWM Timer0 */
  DrvPWM_SetTimerIO(u8Timer, 1);
/* Enable Interrupt Sources of PWM Timer 0 and install call back function */
  //DrvPWM_EnableInt(u8Timer, 0, DRVPWM_PwmIRQHandler);
/* Enable the PWM Timer 0 */
   DrvPWM_Enable(u8Timer);










//DrvSYS_SelectHCLKSource(0);


/* Select UART Clock Source From 12Mhz*/

DrvSYS_SelectIPClockSource(UART_CLK_SET, 0);

    DrvGPIO_InitFunction(E_FUNC_UART0);


    param.u32BaudRate        = 115200;
    param.u8cDataBits        = DRVUART_DATABITS_8;
    param.u8cStopBits        = DRVUART_STOPBITS_1;
    param.u8cParity          = DRVUART_PARITY_NONE;
    param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;
    DrvUART_Open(UART_PORT0, &param);


    DrvTIMER_Init();
   
printf(" TIMER Sample Code \n");

    /* Set all the TIMER clock source are from 12MHz */
    DrvSYS_SelectIPClockSource(TMR0_CLK_SET, 0);
    DrvSYS_SelectIPClockSource(TMR1_CLK_SET, 0);



/* Using TIMER0 in E_ONESHOT_MODE, take frequency every 100 pulse */
    DrvTIMER_OpenCounter(E_TMR0, 100, E_ONESHOT_MODE);

DrvTIMER_Stop(E_TMR0);
// Don't need to timer start now. OpenCounter automatically starts timer

/* Using TIMER1 in E_PERIODIC_MODE, counter counter works at 12MHz*/
    DrvTIMER_Open(E_TMR1, 1000000, E_PERIODIC_MODE);

DrvTIMER_Stop(E_TMR1);

DrvTIMER_SetPrescale(E_TMR1, 0);
// Overwrite DrvTIMER_Open() setting

DrvTIMER_SetCompareValue(E_TMR1, 0xFFFFFF); // Full scale


/* Install callback "TMR1_Callback" and trigger callback when interrupt occures */
    DrvTIMER_SetTimerEvent(E_TMR1, 1, (TIMER_CALLBACK)TMR1_Callback, 1);


/* Enable TIMER1 Intettupt */
    DrvTIMER_EnableInt(E_TMR1, E_TIMER_TCAP_INT);


    while(1) {



complete = 0;







DrvTIMER_EnableInterTimerTriggerMode(E_TMR0);

DrvTIMER_Start(E_TMR0);





//DrvTIMER_EnableExternalEventMode (E_TMR0, E_TIMER_EVENT_FALLING_EDGE);



GCR->PB_H_MFP_BITS.PB8 = 2;

while(complete == 0);

GCR->PB_H_MFP_BITS.PB8 = 0;

}

}

相关帖子

沙发
suiwei|  楼主 | 2012-7-20 09:07 | 只看该作者
菜园里没有这个的实现方法看到有人问,所以发出来分享一下。

使用特权

评论回复
板凳
xinhurenfengsl| | 2013-4-23 09:22 | 只看该作者
学习:victory:

使用特权

评论回复
地板
西行侠客| | 2013-4-25 10:42 | 只看该作者
注释都是鸟语,高端啊

使用特权

评论回复
5
零度888| | 2014-4-25 17:36 | 只看该作者
楼主  能整理下代码重新发上吗   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

0

粉丝