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.

F28335_BIOS工程新建了两个PRD对象:prd_5us和prd_1ms,对应的中断函数分别为timer0Func()和timer1Func(),在ti的例程上改的,工程编译没错,但是执行图中prd_swi为unknown状态,时序不对



F28335_BIOS工程新建了两个PRD对象:prd_5us和prd_1ms,前者要在5us和55us(count1=10)时刻进行相应的I/O操作,后者要1ms到来时实现相应功能。由于在执行prd_swi中断时需要花一段时间,于是将prd的模式设置成one-shot,但是中断内的操作执行完后重新prd_start。prd_swi的优先级设置的最高。下面是这部分的代码:

/**********************************************************************
* Function: Timer0Func()
*
* Description: PRD interrupt TIMER0 swi
**********************************************************************/
void Timer0Func()
{
int1_count++;
//CpuTimer0Regs.TCR.bit.TSS = 1; //关中断
if(int1_count==1){
if(flag) GpioDataRegs.GPADAT.bit.GPIO3=0; //gpio30----gpio3 5us拉低
else GpioDataRegs.GPADAT.bit.GPIO1=0; //5us拉低
DelayUs(2);
GpioDataRegs.GPACLEAR.bit.GPIO13=1; //50us拉低
// AdcRegs.ADCTRL2.bit.SOC_SEQ1=0x1; //触发ADC采样
// StartDMACH1();
}
PRD_start(&Timer0_PRD); // CpuTimer0Regs.TCR.bit.TSS = 0; //开定时器0中断
if(int1_count==11) //5us过后再经历50us
{
GpioDataRegs.GPASET.bit.GPIO13=1; //50us拉高
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x0; //50us后禁止ADC_seq中断
PRD_stop(&Timer0_PRD);// CpuTimer0Regs.TCR.bit.TSS = 1; //关中断
}
}

/**********************************************************************
* Function: Timer1Func()
*
* Description: PRD interrupt TIMER1 swi
**********************************************************************/
void Timer1Func()
{
// PRD_stop(&Timer1_PRD);//CpuTimer1Regs.TCR.bit.TSS = 1; //关中断
LOG_printf(&trace, "ticks = %d", PRD_getticks());
int2_count++;
sample_count1++;
if(sample_count1>9)
{
sample_count1=0;
}
if(int2_count==5)
{ // 8.0<->count=0 8.12<->count=4

flag=1;
GpioDataRegs.GPACLEAR.bit.GPIO15=1;
GpioDataRegs.GPASET.bit.GPIO16=1;
GpioDataRegs.GPADAT.bit.GPIO1=0; //5us拉低
GpioDataRegs.GPASET.bit.GPIO3=1;
}
if(int2_count==10)
{
freq=freq-0x000b;
freq_num++;
int2_count=0;// CpuTimer1.InterruptCount=0; //重新开始天线1,freq接着计数
flag=0;
GpioDataRegs.GPASET.bit.GPIO15=1;
GpioDataRegs.GPACLEAR.bit.GPIO16=1;
GpioDataRegs.GPADAT.bit.GPIO3=0;
GpioDataRegs.GPASET.bit.GPIO1=1;
}
if(flag)GpioDataRegs.GPADAT.bit.GPIO3=1; //5us置高准备
else GpioDataRegs.GPADAT.bit.GPIO1=1;
GpioDataRegs.GPASET.bit.GPIO13=1; //50us置高准备
PRD_start(&Timer0_PRD); //CpuTimer0Regs.TCR.bit.TSS = 0; //开定时器0中断
int1_count=0;
mcbspb_xmit(freq,0);
if(freq_num==16){freq=0x4AE5;int2_count=0;freq_num=0;}
PRD_start(&Timer1_PRD); //CpuTimer1Regs.TCR.bit.TSS = 0; //开定时器1中断
}

我要产生的时序是不是定时器硬件中断触发比较好,还是我自己没设置好呢?完成这样的时序我应该怎么做?

这是我要做的时序:

下面是执行图上的状态:

EASdspF28335_BIOS_noproblem.zip
  • 初步找出一个问题是CLK的时钟最低设置为10US,低于10US后程序进不去

  • 如果使用软时钟做不同延时的任务,建议都写在F28335_BIOS的基础时钟函数中,通过不同的count变量来实现不同的延时周期。

    假设基础时钟函数PRD_TICK是1us执行一次,定义周期变量COUNT_5US = 5,COUNT_50US = 50,COUNT_1MS = 1000;定义计数变量count_1,count_2,count_3。

    然后在基础时钟函数中这样写:

    PRD_TICK()

    {

           count_1++;count_2++;count_3++;

           if (count_1 == COUNT_5US)  { .........; count_1=0;}

           if (count_2 == COUNT_50US)  { .........; count_2=0;}

           if (count_3 == COUNT_1MS)  { .........; count_3=0;}

    }

  • 谢谢你的回复。我最近发现了一个奇怪的现象,如果我将上面的工程烧到30MHz晶振的学习板上(非TI的eZdsp),时序正常,输出的5us,50us,1ms均正常。但是烧到我50MHz晶振的项目板上,不能跳入断点,程序一直死在FXN_F_selfLoop()中,请问会是什么原因。已将Global Settings中的Board Clock设置为50MHz,是否还有其他方面的考虑?谢谢