/*
* 超声模块测距代码
*/
#ifndef PART_TM4C123GH6PM
#define PART_TM4C123GH6PM
#ifndef DOXYGEN
#define DOXYGEN
#include<stdint.h>
#include<stdbool.h>
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
#include"inc/hw_memmap.h"
//#include"inc/hw_types.h"
#include"inc/hw_ints.h"
#include"driverlib/gpio.h"
#include"driverlib/pin_map.h"
#include"driverlib/pwm.h"
#include"driverlib/sysctl.h"
#include"driverlib/uart.h"
#include"driverlib/timer.h"
#include"driverlib/interrupt.h"
const double HEIGHT = 0.3;
unsigned char flag;
unsigned char RiseTime; //记录超声测距模块echo端高电平出现时的时钟
void Timer0AIntHandler();
int main(void) {
flag = 0;
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ); //配置时钟,但是需要查看自己板子上的晶振
//timer and interrupt
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // 启用Timer0模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); // 启用PF0作为脉冲捕捉脚
GPIOPinConfigure(GPIO_PF0_T0CCP0); // 配置GPIO脚为使用Timer0捕捉模式
GPIOPinTypeTimer(GPIO_PORTF_BASE, GPIO_PIN_0);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_OD); // 为管脚配置开漏模式
TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME); // 配置使用Timer0的TimerA模块为边沿触发减计时计数模式
TimerControlEvent(TIMER0_BASE, TIMER_A, TIMER_EVENT_BOTH_EDGES); // 使用边沿触发
TimerLoadSet(TIMER0_BASE, TIMER_A, 0x7d00); //设置计数范围为32000到0,为2ms,最长可以测0.7m,超声测距了
TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0AIntHandler); // 注册中断处理函数以响应触发事件
IntMasterEnable(); // 系统总中断开
TimerIntEnable(TIMER0_BASE, TIMER_CAPA_EVENT); // 时钟中断允许,中断事件为Capture模式中边沿触发
IntEnable(INT_TIMER0A); // NVIC中允许定时器A模块中断
//触发超声模块启动的引脚PF1
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//Enable the port
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4); //配置输出端口PF1
//led
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
TimerEnable(TIMER0_BASE, TIMER_A); // 启动捕捉模块
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0x10);
SysCtlDelay(160/3); //延时10微秒
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0x00);
SysCtlDelay(SysCtlClockGet() / 3); //延时1s
if(flag == 1) return 0;
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0x00);
}
//注册中断函数
void Timer0AIntHandler()
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0xFF);
if(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_0) | 0xFE == 0xFF)RiseTime = TimerValueGet(TIMER0_BASE, TIMER_A);
else
{
uint32_t time = TimerValueGet(TIMER0_BASE, TIMER_A) > RiseTime ? RiseTime + 32000 - TimerValueGet(TIMER0_BASE, TIMER_A)
: RiseTime - TimerValueGet(TIMER0_BASE, TIMER_A);
if(time * 34 > (uint32_t)(HEIGHT * 1600000))
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0xFF);
flag = 1;
}
else
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0x02);
flag = 1;
}
SysCtlDelay((unsigned char)(SysCtlClockGet() / 3 * 5));
}
TimerIntClear(TIMER0_BASE, TimerIntStatus(TIMER0_BASE, TIMER_CAPA_EVENT)); //清除中断
}
#endif
#endif