我使用WT0CCP0设置捕捉上升沿,进不去中断,可是换成T2CCP0就可以了
难道是64位定时器不能设置捕捉边沿吗?我的定时器已经拆分了啊
TM-4C123GH6PM
xyz549040622:
T0CCP0和T2CCP0有什么区别么?为什么一个可以,一个不可以呢?
Sun DaSheng Sun:
回复 xyz549040622:
我也奇怪啊TAT
Michael Sun:
电路上接的管脚对吗?
都可以捕捉的。贴电路,贴源码,大家一起看看。
Sun DaSheng Sun:
//四个红外的输入口 SysCtlPeripheralEnable(SYSCTL_PERIPH_WTIMER0); // 启用Timer3模块 //红外1,左轮前 GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4); GPIOPinConfigure(GPIO_PC4_WT0CCP0); // 配置GPIO脚为使用Timer0捕捉模式 GPIOPinTypeTimer(GPIO_PORTC_BASE, GPIO_PIN_4); GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); TimerConfigure(WTIMER0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME); // 配置使用Timer0的TimerA模块为边沿触发减计时计数模式 TimerControlEvent(WTIMER0_BASE, TIMER_A, TIMER_EVENT_POS_EDGE); // 使用边沿触发 TimerLoadSet(WTIMER0_BASE, TIMER_A, 0xffff); //设置计数范围为32000到0,为2ms,最长可以测0.7m,超声测距了 TimerIntRegister(WTIMER0_BASE, TIMER_A, WTimer0AIntHandler); // 注册中断处理函数以响应触发事件 IntPrioritySet(INT_WTIMER0A, 0<<5); TimerIntEnable(WTIMER0_BASE, TIMER_CAPA_EVENT); // 时钟中断允许,中断事件为Capture模式中边沿触发 IntEnable(INT_WTIMER0A); // NVIC中允许定时器A模块中断 TimerEnable(WTIMER0_BASE, TIMER_A);
IntMasterEnable(); // 系统总中断开
void WTimer0AIntHandler(void){ TimerIntClear(WTIMER0_BASE, TimerIntStatus(WTIMER0_BASE, TIMER_CAPA_EVENT)); //清除中断 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0xFF); BackForth(0); SysCtlDelay(SysCtlClockGet() / 6); if(distance(HEAD, PitPos[GOTOPIT_INDEX]) <25); GOTOPIT_INDEX = GOTOPIT_INDEX == 3 ? 0 : GOTOPIT_INDEX + 1;}
Sun DaSheng Sun:
//四个红外的输入口 SysCtlPeripheralEnable(SYSCTL_PERIPH_WTIMER0); // 启用Timer3模块 //红外1,左轮前 GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4); GPIOPinConfigure(GPIO_PC4_WT0CCP0); // 配置GPIO脚为使用Timer0捕捉模式 GPIOPinTypeTimer(GPIO_PORTC_BASE, GPIO_PIN_4); GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); TimerConfigure(WTIMER0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME); // 配置使用Timer0的TimerA模块为边沿触发减计时计数模式 TimerControlEvent(WTIMER0_BASE, TIMER_A, TIMER_EVENT_POS_EDGE); // 使用边沿触发 TimerLoadSet(WTIMER0_BASE, TIMER_A, 0xffff); //设置计数范围为32000到0,为2ms,最长可以测0.7m,超声测距了 TimerIntRegister(WTIMER0_BASE, TIMER_A, WTimer0AIntHandler); // 注册中断处理函数以响应触发事件 IntPrioritySet(INT_WTIMER0A, 0<<5); TimerIntEnable(WTIMER0_BASE, TIMER_CAPA_EVENT); // 时钟中断允许,中断事件为Capture模式中边沿触发 IntEnable(INT_WTIMER0A); // NVIC中允许定时器A模块中断 TimerEnable(WTIMER0_BASE, TIMER_A);
IntMasterEnable(); // 系统总中断开
void WTimer0AIntHandler(void){ TimerIntClear(WTIMER0_BASE, TimerIntStatus(WTIMER0_BASE, TIMER_CAPA_EVENT)); //清除中断 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0xFF); BackForth(0); SysCtlDelay(SysCtlClockGet() / 6); if(distance(HEAD, PitPos[GOTOPIT_INDEX]) <25); GOTOPIT_INDEX = GOTOPIT_INDEX == 3 ? 0 : GOTOPIT_INDEX + 1;}