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.

请问,我想用TM4C123GXL launchpad做频率计,但是发现真正用函数发生器输入信号却不会进入中断,但是用手指或者表笔,磨两下倒是能进入中断

Other Parts Discussed in Thread: TM4C123GH6PM

#include <stdint.h> #include <stdbool.h> #include <stdlib.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 #define GPIO_DATABASE GPIO_PORTF_BASE #define GPIO_CLKBASE GPIO_PORTF_BASE #define GPIO_DATA GPIO_PIN_2 #define GPIO_CLK GPIO_PIN_3

void send_byte(uchar); void write_cmd(uchar); void write_data(uchar); void LCD12864_INIT();

uchar const disps[]={"波的频率为:"}; int i = 0; unsigned long long t[5]; //unsigned int flag = 0;

int main(void) {

  SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);   //2.5分频,使用PLL,外部晶振16M,system时钟源选择 main osc。系统时钟80MHZ   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);

  LCD12864_INIT();   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,触发中断   //LCD12864_INIT();   while(1)   {   }  }

 

void WTimer0IntHandler(void)  {

        uchar c[10],d[3];         long int j;

        double f,time=0;         unsigned int status = 0;

        status = TimerIntStatus(WTIMER0_BASE,0);         TimerIntClear(WTIMER0_BASE           //, TIMER_CAPA_EVENT           ,status);         t[i++] = TimerValueGet64(WTIMER0_BASE);         //t[1] = t[2] >> 32;         //t[0] = t[2] & 0xFFFFFFFF;         if(i >= 2)         {          i = 0;    time = labs(t[1]-t[0]);

   f=80000000.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;    }

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

}

void send_byte(uchar data) {  int i;  for(i = 0;i < 8;i++)  {   if(data &(0x80>>i))    GPIOPinWrite(GPIO_DATABASE,GPIO_DATA,GPIO_DATA);   else    GPIOPinWrite(GPIO_DATABASE,GPIO_DATA,0);

  SysCtlDelay(600);   GPIOPinWrite(GPIO_CLKBASE,GPIO_CLK,0);   SysCtlDelay(600);   GPIOPinWrite(GPIO_CLKBASE,GPIO_CLK,GPIO_CLK);  } }

void write_cmd(uchar cmd) {  send_byte(0xf8);  SysCtlDelay(300);  send_byte(cmd & 0xf0);  SysCtlDelay(300);  send_byte(cmd<<4); }

void write_data(uchar data) {  send_byte(0xfa);  SysCtlDelay(300);  send_byte(data & 0xf0);  SysCtlDelay(300);  send_byte(data<<4); }

void LCD12864_INIT() {  //GPIOPinTypeGPIOOutput(GPIO_DATABASE,GPIO_DATA);  //GPIOPinTypeGPIOOutput(GPIO_CLKBASE,GPIO_CLK);  GPIOPinWrite(GPIO_CLKBASE,GPIO_CLK,GPIO_CLK);

 write_cmd(0x30);  SysCtlDelay(100);  write_cmd(0x0c);  SysCtlDelay(100);  write_cmd(0x01);  SysCtlDelay(100); }

 

 

还有那个TimerValueGet64函数是否是用两次相减取绝对值就是时间啊?????