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中断
}
我要产生的时序是不是定时器硬件中断触发比较好,还是我自己没设置好呢?完成这样的时序我应该怎么做?
这是我要做的时序:
下面是执行图上的状态: