TI中文支持网
TI专业的中文技术问题搜集分享网站

执行DELAY_US()语句后进入defaultIsr.c中断??

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

Johnson Chen1:

楼主程序是跑在RAM还是FLASH?如果是跑在FLASH里,是否有调用memcpy?芯片是什么型号,楼主可以讲工程放上来,我们分析一下!

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

xiaobo wu:

回复 Johnson Chen1:

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

xiaobo wu:

回复 xiaobo wu:

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

xiaobo wu:

回复 xiaobo wu:

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

xiaobo wu:

回复 Johnson Chen1:

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

xiaobo wu:

回复 Johnson Chen1:

我使用CCS3.3对F28335进行烧写,

该程序的目的是交替对ADCINA0和ADCINB0通道采样,对采集到的信号进行处理。

该程序未使用中断,利用DELAY_US决定采样率。

出现问题的语句为DELAY_US(sr_tl)   sr_tl为采样时间间隔

代码段如下:

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(sr_tl);////the sample rate is 250hz

if (array_index>=ls)

{

                    。

                    。//以下是算法部分

                    。

                    。//以下部分是根据算法结果选择ADCINA0或ADCINB0

         if(k_rs==1)

 {

  flag=0;

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x08;

for(index=0;index<ls;index++)

{

 SampleTable[index]=0;

 }

}

 if(k_rs==0)

{

   flag=1;

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;

for(index=0;index<ls;index++)

{

 SampleTable[index]=0;

 }

}

                            .

                            .

                            .

                   }

       }

DELAY_US在在第一次交替采样时正常工作,但是在第二次交替采样时出现问题。

第二次采样到第一个数据点时,执行到DELAY_US后,程序跳到DSP2833x_DefaultIsr.c中去了。

我单步进入usDelay.asm中,发现在执行SUB ACC,#1后进入DSP2833x_DefaultIsr.c去的。

进入的是DSP2833x_DefaultIsr.c的以下中断区:

interrupt void DATALOG_ISR(void)   // Datalogging interrupt

{

  // Insert ISR Code here

  // Next two lines for debug only to halt the processor here

  // Remove after inserting ISR Code

  asm ("      ESTOP0");

  for(;;);

}

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

xiaobo wu:

回复 Johnson Chen1:

程序轮廓如下:

#include "DSP2833x_Device.h"

#include "DSP2833x_Examples.h"

#include "math.h"

void main(void)

{

InitSysCtrl();

// InitXintf();

InitGpio();////it is important

InitXintf16Gpio();

EALLOW;

SysCtrlRegs.HISPCP.all=ADC_MODCLK;////////clock preset for ADC clock

EDIS;

DINT;

InitPieCtrl();

IER=0x0000;

IFR=0x0000;

InitPieVectTable();

   memcpy(&RamfuncsRunStart,&RamfuncsLoadStart,(&RamfuncsLoadEnd – &RamfuncsLoadStart));

InitFlash();

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(sr_tl);////the sample rate is 250hz

if (array_index>=ls)

{

}

}

}

F28335的cmd文件:

MEMORY

{

PAGE 0:    /* Program Memory */

          /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */

  RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */  

  FLASHH      : origin = 0x300000, length = 0x008000     /* on-chip FLASH */

  FLASHG      : origin = 0x308000, length = 0x008000     /* on-chip FLASH */

  FLASHF      : origin = 0x310000, length = 0x008000     /* on-chip FLASH */

  FLASHD      : origin = 0x320000, length = 0x008000     /* on-chip FLASH */

  FLASHC      : origin = 0x328000, length = 0x008000     /* on-chip FLASH */

  FLASHB  : origin = 0x330000, length = 0x008000     /* on-chip FLASH */

  FLASHA      : origin = 0x338000, length = 0x007F80     /* on-chip FLASH */

  CSM_RSVD    : origin = 0x33FF80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */

  BEGIN       : origin = 0x33FFF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */

  CSM_PWL     : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */

  OTP         : origin = 0x380400, length = 0x000400     /* on-chip OTP */

  ADC_CAL     : origin = 0x380080, length = 0x000009     /* ADC_cal function in Reserved memory */

  IQTABLES    : origin = 0x3FE000, length = 0x000b50     /* IQ Math Tables in Boot ROM */

  IQTABLES2   : origin = 0x3FEB50, length = 0x00008c     /* IQ Math Tables in Boot ROM */  

  FPUTABLES   : origin = 0x3FEBDC, length = 0x0006A0     /* FPU Tables in Boot ROM */

  ROM         : origin = 0x3FF27C, length = 0x000D44     /* Boot ROM */        

  RESET       : origin = 0x3FA000, length = 0x000002     /* part of boot ROM  */

  VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */

PAGE 1 :   /* Data Memory */

          /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */

          /* Registers remain on PAGE1                                                  */

  BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */

  RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */

  RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */

  ZONE7       : origin = 0x200000, length = 0x002000

  RAMM2       : origin = 0x009000, length = 0x007000     /* on-chip RAM block L1 */

   FLASHE      : origin = 0x318000, length = 0x008000     /* on-chip FLASH */

}

/* Allocate sections to memory blocks.

  Note:

        codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code

                  execution when booting to flash

        ramfuncs  user defined section to store functions that will be copied from Flash into RAM

*/

SECTIONS

{

  /* Allocate program areas: */

  .cinit              : > FLASHB      PAGE = 0

  .pinit              : > FLASHB,     PAGE = 0

  .text               : > FLASHB      PAGE = 0

  codestart           : > BEGIN       PAGE = 0

  ramfuncs            : LOAD = FLASHD,

                        RUN = RAML0,

                        LOAD_START(_RamfuncsLoadStart),

                        LOAD_END(_RamfuncsLoadEnd),

                        RUN_START(_RamfuncsRunStart),

                        PAGE=0

  csmpasswds          : > CSM_PWL     PAGE = 0

  csm_rsvd            : > CSM_RSVD    PAGE = 0

  /* Allocate uninitalized data sections: */

  .stack              : > FLASHE       PAGE = 1

  .ebss               : > RAMM2       PAGE = 1

  .esysmem            : > RAMM1       PAGE = 1

  /* Initalized sections go in Flash */

  /* For SDFlash to program these, they must be allocated to page 0 */

  .econst             : > FLASHB      PAGE = 0

  .switch             : > FLASHB      PAGE = 0      

  /* Allocate IQ math areas: */

  IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD

  IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD

  FPUmathTables    : > FPUTABLES, PAGE = 0, TYPE = NOLOAD

  ZONE7DATA        : > ZONE7        PAGE = 1    

  .reset              : > RESET,      PAGE = 0, TYPE = DSECT

  vectors             : > VECTORS     PAGE = 0, TYPE = DSECT

  /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */

  .adc_cal     : load = ADC_CAL,   PAGE = 0, TYPE = NOLOAD

}

/*

//===========================================================================

// End of file.

//===========================================================================

*/

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

Johnson Chen1:

回复 xiaobo wu:

楼主请将整个项目打包一下传上来,我帮你看一下!

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

xiaobo wu:

回复 Johnson Chen1:

关于DELAY_US问题的真正原因我没有搞清楚。因为它老是跳到中断区,所以我禁止了中断使能,然后使用自己的delay小程序实现了连续采样,目前没有问题。有空我把原来的程序传上来。

我交替采样两个通道。两个通道采样完毕,下一个循环采样时执行DELAY_US()后进入defaultIsr.c的DATALOG_ISR(),这是为什么?

部分程序:

AdcRegs.ADCTRL2.all=0x2000;

for (;;)

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0)

{}

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);

DELAY_US(4000);//the sample rate is 250hz

if (array_index>=1024)

{

}

}

xiaobo wu:

回复 Johnson Chen1:

你好,Johnson

这是我写的程序,我运行时,目前程序跑飞到中断区rsvd_isr()

环境:CCS3.3, F28335, 12864显示屏

请您帮我看一下,怎么回事?

请您给我一些建议。

关于硬件仿真调试我不知道从哪里做起

谢谢您的帮助

赞(0)
未经允许不得转载:TI中文支持网 » 执行DELAY_US()语句后进入defaultIsr.c中断??
分享到: 更多 (0)