This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS调试、烧录程序的问题

Other Parts Discussed in Thread: TM4C123GH6PM, LMFLASHPROGRAMMER

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)); //清除中断
}

 

  • 1. PF0需要解锁后才能进行GPIO的配置。

    2.debug时会自动编译代码并下载最新的out文件。

    3.LMFlashProgrammer是个轻量级的软件,可以烧录bin格式的程序文件。当然CCS也可以,debug后,最新的代码已经烧写进去了。

    有些问题看的不是很清楚,请楼主描述的详细一些。

  • 请问debug是把程序烧写到什么区了?是RAM吗?那怎么烧写到Flash里呢?

    还有一个问题

    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHZ); //配置时钟

    请问定时器捕捉边沿模式时,

    从preload到TimerValueGet(TIMER2_BASE, TIMER_A)经历的时间是(preload - TimerValueGet(TIMER2_BASE, TIMER_A))/  SysCtlClockGet()    秒    吗

  • sorry还有一个问题麻烦您

    下面是一个控制电机转动的函数,为什么我修改里面的占空比,可是电机的速度完全没有变化,一直特别快?

    void BackForth(unsigned char speed) //BACKFORTH speed = 0 1 对应着10% 和 25%的速度
    {
    unsigned char duty_cycle1 = (speed == 0) ? PWMGenPeriodGet(PWM0_BASE, PWM_OUT_1) / 10 : PWMGenPeriodGet(PWM0_BASE, PWM_OUT_1) / 4;
    unsigned char duty_cycle2 = (speed == 0) ? PWMGenPeriodGet(PWM0_BASE, PWM_OUT_2) / 10 : PWMGenPeriodGet(PWM0_BASE, PWM_OUT_2) / 4;
    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_2|GPIO_PIN_3, 0xFF);//电源开关端置高电平,使得能转
    PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, 0);
    //PWMGenPeriodGet(PWM0_BASE, PWM_OUT_0)); // Set PWM0 to a duty cycle of 0.
    PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, duty_cycle1);
    //PWMGenPeriodGet(PWM0_BASE, PWM_OUT_1)); // Set PWM1 to a duty cycle .
    PWMPulseWidthSet(PWM0_BASE, PWM_OUT_2, duty_cycle2);
    //PWMGenPeriodGet(PWM0_BASE, PWM_OUT_2)); // Set PWM0 to a duty cycle.
    PWMPulseWidthSet(PWM0_BASE, PWM_OUT_3, 0);
    //PWMGenPeriodGet(PWM0_BASE, PWM_OUT_3)); // Set PWM0 to a duty cycle of 0.
    PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT, true);// Enable the PWM0 Bit0 (PD0) output signal.
    PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT, true);
    PWMOutputState(PWM0_BASE, PWM_OUT_2_BIT, true);
    PWMOutputState(PWM0_BASE, PWM_OUT_3_BIT, true);
    PWMGenEnable(PWM0_BASE, PWM_GEN_0); // Enable the PWM generator block.
    PWMOutputInvert(PWM0_BASE, PWM_OUT_0_BIT, false);
    PWMOutputInvert(PWM0_BASE, PWM_OUT_1_BIT, true);
    PWMOutputInvert(PWM0_BASE, PWM_OUT_2_BIT, true);
    PWMOutputInvert(PWM0_BASE, PWM_OUT_3_BIT, false);
    //小车1 2 反转
    }

  • 请问CCS debug模式是把程序烧到什么区了?RAM吗?  如果要烧写到Flash怎么弄?实在不想让让程序断电后就没了啊 

    还有一个问题就是

    在定时器捕捉边沿模式下

    从preload到TimerValueGet(TIMER2_BASE, TIMER_A)  经过的时间是(preload  -  TimerValueGet(TIMER2_BASE, TIMER_A))/  SysCtlClockGet()  秒吗

  • 电机没有变化,说明是你PWM的问题吧,看看官方给你程序,测试下你的pwm

  • 程序怎么会断电后就没呢?程序断电后没的只是你保存进去的数据,要想不丢失,只能放在eerom中

  • Debug后程序会直接烧写到Flash区。掉电不丢失。

    可以这么理解。不过如果定时器到0之后,会重新加载初值,

    所以也可能是preload  + 0xffff - TimerValueGet(TIMER2_BASE, TIMER_A) 这里假设是16bit定时器

  • 是我的驱动电路的问题吗

  • 设置的是preload,如果多走了一个周期,那么时间不应该是

    preload + preload - TimerValueGet()  /  SysCtlClockGet()    吗? 为什么会是0xffff

  • 应该是定时器初值,我们一般做捕获的时候就直接把定时器赋值为0xffff了。