//关于定时器的使用
void SysClockInit_40M(void)
{
SysCtlLDOSet( SYSCTL_LDO_2_75V);
SysCtlDelay(SysCtlClockGet()/3000); //延时1ms,稳定芯片用
SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ); //5分频,PLL设置时钟为40M
SysCtlDelay(SysCtlClockGet()/3000);
//延时1ms,稳定芯片用
SysCtlLDOSet( SYSCTL_LDO_2_50V);
}
void Timer0A_ISR(void)
{
TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT );
//清除中断源
counter++;
//处理过程
void TimerEnable(TIMER0_BASE, Timer_A); //使能定时器
}
int main(void)
{
SysClockInit_40M();
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); //使能定时器0
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
// 使能PA端口
GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_0);
// 设置PA0为超声波的echo管脚
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_1 ); // 设置PA1为超声波的trig管脚
/*************************************关于定时器中断的设置**********************************/
TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR|TIMER_CFG_A_PERIODIC); //配置成16位周期定时器,使用定时器A
void TimerLoadSet(TIMER0_BASE, Timer_A, unsigned long ulValue);
//设置定时器初始值
void TimerIntRegister(TIMER0_BASE, Timer_A,void Timer0A_ISR(void)); //声明定时器A的中断处理函数
void TimerEnable(TIMER0_BASE, Timer_A); //使能定时器
void TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //使能中断,设置为定时器A的溢出中断
// GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_1,GPIO_PIN_1);
// GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_0);
while(1)
{
GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_1,GPIO_PIN_1); //trig口设置高电平信号,启动超声波传感器
SysCtlDelay(SysCtlClockGet()/3000/50);
//高电平持续 20US
GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_1,~GPIO_PIN_1); //trig口置低电平
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
flag=0;
//设置标志位,方便对超声波传感器的控制
while(flag==0)
{ if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_0)==0)
{ SysCtlIntDisable(TIMERA_BASE, TIMER_TIMA_TIMEOUT); //关闭中断
distance=counter;
counter=0;
flag=1;
while(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_0)==0); //等待超声波的echo端口转变为高电平,表示一次测距结束
}
}
}
}
|