📄 main.c
字号:
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_ints.h>
#include <interrupt.h>
#include <sysctl.h>
#include <gpio.h>
#include <pwm.h>
#include <timer.h>
unsigned char flag=0;
unsigned long timerint;
void jtagWait(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
GPIODirModeSet(GPIO_PORTC_BASE,GPIO_PIN_5,GPIO_DIR_MODE_IN);
if(GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_5)==0x20)
{
for(;;);
}
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC);
}
int main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);
jtagWait();
LcdInit();
KeyInit();
//用B0作为控制,B2作为接收
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_0);
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE,GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,0);
//使用定时器0计时
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER);
//以中断方式控制
GPIOPinIntEnable(GPIO_PORTB_BASE,GPIO_PIN_2);
IntMasterEnable();
unsigned char key;
unsigned char str[8];
unsigned long i,j;
unsigned long time,dis;
while(1){
//按任意键开始
key=KeyRelease();
if(key==16)continue;
GPIOIntTypeSet(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_HIGH_LEVEL); //设B2允许高电平中断
//发一个略大于10us
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,1);
for(i=0;i<20;i++);
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,0);
//正式开启B2中断
flag=2;
IntEnable(INT_GPIOB);
//等待计时结束,将会两次进入中断程序
while(flag!=1);
//计时完毕,计算显示
time=3000000-147-timerint; //147为测得没有高电平的指令运行所需的时间
dis=time*340/12000; //*声速/2/6000
for(j=0;j<8;j++) str[j]='0';
str[8]='\0';
j=time;
i=1;
while(j>=10){
str[8-i]=j%10+48;
j=j/10;
i++;
}
str[8-i]=j+48;
LcdPst(0,1);
LcdWriteWord(&str);
for(j=0;j<8;j++) str[j]='0';
str[8]='\0';
j=dis;
i=1;
while(j>=10){
str[8-i]=j%10+48;
j=j/10;
i++;
}
str[8-i]=j+48;
LcdPst(0,2);
LcdWriteWord(&str);
}
}
void GPIO_Port_B_ISR(void)
{
unsigned long ulStatus;
ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true);
GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus);
if (ulStatus & GPIO_PIN_2)
{
if(flag==2){ //高电平进入中断,开定时器,开始计时,设为低电平中断
TimerLoadSet(TIMER0_BASE, TIMER_A,3000000);
TimerEnable(TIMER0_BASE, TIMER_A);
GPIOIntTypeSet(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_LOW_LEVEL);
flag=0;
}else{
IntDisable(INT_GPIOB); 低电平进入中断,关定时器,读取,示意计时完毕
timerint=TimerValueGet(TIMER0_BASE, TIMER_A);
TimerDisable(TIMER0_BASE,TIMER_A);
flag=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -