TM4C123GH6PM
1、 我在debug模式下调试程序,有的时候没反应
代码就是GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0x00);,这可是2灯还是一直亮(之前的配置都做好了,因为这个灯原来用过很多次了),不知道为什么?是因为ROM区已经满了吗?
2、 请问如果程序正在调试,然后我修改一下程序,重新debug,单片机会立刻执行新的程序吗?
3、 如果要将程序烧录进flash用LM Flash Programmer就可以吗?
4、 利用led灯检验,发现定时器中断中蓝灯LEd2亮了,这样IF_PIT应该就被置为true了,可为什么回到主程序还是没有修改过?还是执行Forward(0);
已经在向量表里注册过了,问题就是led2亮了,说明IF_PIT变为true了,可是主程序中还是false(下面只粘贴与该部分有关的代码)。已经搞了三天了,实在是不知道怎么办了,真的求助啊
//timer and interrupt,和触发端PF4
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2); // 启用Timer2模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); // 启用PF4作为脉冲触发脚
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // 启用PB0作为脉冲捕捉脚
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_0);
GPIOPinConfigure(GPIO_PB0_T2CCP0); // 配置GPIO脚为使用Timer0捕捉模式
GPIOPinTypeTimer(GPIO_PORTB_BASE, GPIO_PIN_0);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_OD); // 为管脚配置开漏模式
TimerConfigure(TIMER2_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME); // 配置使用Timer0的TimerA模块为边沿触发减计时计数模式
TimerControlEvent(TIMER2_BASE, TIMER_A, TIMER_EVENT_BOTH_EDGES); // 使用边沿触发
TimerLoadSet(TIMER2_BASE, TIMER_A, 0x7d00); //设置计数范围为32000到0,为2ms,最长可以测0.7m,超声测距了
TimerIntRegister(TIMER2_BASE, TIMER_A, Timer2AIntHandler); // 注册中断处理函数以响应触发事件
IntMasterEnable(); // 系统总中断开
TimerIntEnable(TIMER2_BASE, TIMER_CAPA_EVENT); // 时钟中断允许,中断事件为Capture模式中边沿触发
IntEnable(INT_TIMER2A); // NVIC中允许定时器A模块中断
//触发超声模块启动的引脚PF1
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//Enable the port
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4); //配置输出端口PF4
player.is_over = 0;
while(player.is_over == 0)
{
//UART_READ();
//GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3, 0x00);
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0xFF);
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0x00);
MeasurePit();
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0x00);
//SysCtlDelay((unsigned char)(SysCtlClockGet()));
//if(IF_PIT)GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0x00);
//else GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0x00);
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0xFF);
//Motion();
//BackForth(0);
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2, 0x00);
//Forward(1);
if(IF_PIT)BackForth(0);
else Forward(0);
//else ;
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0x00);
SysCtlDelay(SysCtlClockGet());
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0xFF);
SysCtlDelay(SysCtlClockGet());
}
//与超声波传感器的接口
void MeasurePit()
{
unsigned char i;
SENSORChangable = true;
TimerEnable(TIMER2_BASE, TIMER_A); // 启动捕捉模块
for(i = 0; i < 2 && SENSORChangable == true; i++)
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0x10);
SysCtlDelay(160/3); //延时10微秒
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0x00);
SysCtlDelay(SysCtlClockGet() / 3); //延时300ms
}
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2, 0x00);
TimerDisable(TIMER2_BASE, TIMER_A); //关闭捕捉模块
return;
}
//注册中断函数
void Timer2AIntHandler()
{
if(SENSORChangable == false)
{
TimerIntClear(TIMER2_BASE, TimerIntStatus(TIMER2_BASE, TIMER_CAPA_EVENT));
return;
}
if(GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0))
{
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0x00);
RiseTime = TimerValueGet(TIMER2_BASE, TIMER_A);
}
else
{
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0x);
uint32_t time = TimerValueGet(TIMER2_BASE, TIMER_A) > RiseTime ? RiseTime + 32000 - TimerValueGet(TIMER2_BASE, TIMER_A)
: RiseTime - TimerValueGet(TIMER2_BASE, TIMER_A);
if(time * 34 < 160000)
{
IF_PIT = false;
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0x00);
}
else
{
IF_PIT = true;
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0xFF);
}
SENSORChangable = false;
}
//GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_1, 0xFF);
TimerIntClear(TIMER2_BASE, TimerIntStatus(TIMER2_BASE, TIMER_CAPA_EVENT)); //清除中断
}