#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函数是否是用两次相减取绝对值就是时间啊?????