This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

怎样设置和获取计数值

Other Parts Discussed in Thread: TM4C123GH6PM

 

TIM_VALUE = TimerValueGet(TIMER0_BASE, TIMER_A);

在获取到当前计数后,怎样将计数值清零

 

这样不行 怎样才能将TAR置零啊

  • 我以前写的代码,亲可以参考一下。

    /*******************************************
    开发坏境:CCSv5
    程序功能:利用定时器的计时捕获模式制作简易频率计
    程序说明:可测方波频率,其它波形应先整形成方波再测频率。最高和最低可测频率
                     为1HZ-100KHZ(很久前测的,现在记不太清了,差不多就是这个范围,
                     具体以实际测量为准)

    ********************************************/
    #include <stdint.h>
    #include <stdbool.h>
    #include <math.h>
    #include "inc/tm4c123gh6pm.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/gpio.h"
    #include "driverlib/timer.h"
    #include "driverlib/fpu.h"
    #include "driverlib/sysctl.h"
    #include "grlib/grlib.h"
    #include "driverlib/adc.h"
    #include "inc/hw_gpio.h"
    #define uchar unsigned char
    #define uint unsigned int
    //16位捕获引脚PB6,32位捕获引脚PC4
    void delay_Nms(uint n);
    void Ini_Lcd(void);
    void write_com(uchar com);
    void write_dat(uchar dat);
    uchar const disps[]={"波的频率为:"};

    int main(void)
    {
        SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
            //5分频,使用PLL,外部晶振16M,system时钟源选择 main osc。系统时钟40MHZ
        SysCtlPeripheralEnable(SYSCTL_PERIPH_WTIMER0);
                //使能TIMER0
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
            SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
            //使能GPIOF和GPIOC外设
            GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
            GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);
            GPIOPinConfigure(GPIO_PC4_WT0CCP0);    //#define GPIO_PC4_WT0CCP0   0x00021007
            GPIOPinTypeTimer(GPIO_PORTC_BASE, GPIO_PIN_4);
        TimerConfigure(WTIMER0_BASE,TIMER_CFG_A_CAP_TIME_UP|TIMER_CFG_SPLIT_PAIR);//计时捕获模式,上升沿捕获
            TimerControlEvent(WTIMER0_BASE,TIMER_A,TIMER_EVENT_POS_EDGE);
            IntEnable(INT_WTIMER0A);
            //使能TIMER0A
            TimerIntEnable(WTIMER0_BASE, TIMER_CAPA_EVENT);
            //定时器A捕获事件触发中断
            IntMasterEnable();
        //master interrupt enable API for all interrupts
            TimerEnable(WTIMER0_BASE, TIMER_A);
        //TIMER0A开始计数,当计数值等于TimerLoadSet,触发中断
        while(1)
            {
            }
    }

    void WTimer0IntHandler(void)
    {

            uchar c[10],d[3],flag=0;
            long int t[12],j;
            double f,time=0;
            int i=0;

            TimerIntClear(WTIMER0_BASE, TIMER_CAPA_EVENT);
        t=TimerValueGet64(WTIMER0_BASE);
            i++;
            time=labs(t[1]-t[0]);
        if(i==2) {i=0;}
            flag++;
            if(flag==3)//显示
            {
                    f=40000000.0/time;
                    int a,aa,bb,m=0,k=0;
                    double b;
                    a= (int)f;//a= 1234
                    b= f - a;//b= 0.5678
                    for(j=a;j>0;j=j/10)
                    {
                            c[k++]=j%10;
                    }
                    bb=(int)(b*1000);

                    for(j=bb;m<3;j=j/10)
                    {
                            d[m++]=j%10;
                    }

                    Ini_Lcd();
                    for(aa=0;aa<12;aa++)
                    {
                             write_dat(disps[aa]);
                    }
                    write_com(0x90);
                    for(j=k-1;j>=0;j--)
                    {        write_dat(c[j]+48);}
                    write_dat('.');
                    for(j=2;j>=0;j--)
                    {        write_dat(d[j]+48);}
                    write_dat('H');
                    write_dat('Z');
        }

    }



    /*******************************************
    函数名称:delay_Nms
    功    能:延时N个ms的时间
    参    数:无
    返回值  :无
    ********************************************/
    void delay_Nms(uint n)
    {
        uint i = 0;
        for(i = n;i > 0;i--)
                SysCtlDelay(SysCtlClockGet() / 3000);
    }
    /*******************************************
    函数名称:Ini_Lcd
    功    能:初始化液晶模块
    参    数:无
    返回值  :无
    ********************************************/
    void Ini_Lcd(void)
    {
            SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能GPIOA
            GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4);//PA2,3,4设为输出
            SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIOB
        GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
                            GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输出
        delay_Nms(15);                     //延时等待液晶完成复位
            GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4);   //E=0
            delay_Nms(5);
            write_com(0x30);  /*功能设置:一次送8位数据,基本指令集*/

            delay_Nms(1);
        write_com(0x08);  /*DDRAM地址归位*/
            delay_Nms(1);
            write_com(0x0c);  /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
            delay_Nms(1);
            write_com(0x01);  /*清屏,将DDRAM的位址计数器调整为“00H”*/
            delay_Nms(1);
            write_com(0x06);  /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
            delay_Nms(5);
            write_com(0x80);
    }

    /**************************************************
    *名称:void write_com(uchar com)
    *功能:向1602写指令
    *入口参数:com
    *出口参数:无
    **************************************************/
    void write_com(uchar com)
    {
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3, 0x00000);//RS=0,RW=0
            GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
                            GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, com);    //PB=com
            delay_Nms(5);
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4);   //E=1
        delay_Nms(5);
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 0x00000);   //E=0
    }

    /**************************************************
    *名称:void write_dat(uchar dat)
    *功能:向1602写数据
    *入口参数:dat
    *出口参数:无
    **************************************************/
    void write_dat(uchar dat)
    {
            GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_2 );//RS=1,RW=0
            GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
                                    GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, dat);  //PB=dat
            delay_Nms(5);
            GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,GPIO_PIN_4);   //E=1
            delay_Nms(5);
            GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4);   //E=0
    }

  • 请问二楼,你的TimerLoadSet在什么地方,程序中看不到你的配置啊

  • 楼主你的问题解决了吗?我也想问问这问题

  • 当前的计数值是变化的,随时更新的,干嘛要清零呀。除非你关闭掉定时器才可以的

  • 是这样的,因为我想做一个频率计,原理就是高频部分测一段时间内有多少个脉冲,因此每次测量结束都需要把计数值清零,以便下一次计数

  • 这个好像没法清除,你只能获取到这次的值,然后获取到下次的值,计算下中间是否有几次溢出,向上溢出还是向下溢出,找到这些,就可以获取到频率了。我记得官方的数据手册上有这个图形的示例,不需要清除也是可以的。

  • 恩恩,明白了,非常感谢