DSPwilliam hill官网
直播中

1563661808

10年用户 1833经验值
擅长:电源/新能源
私信 关注

【高手问答】第7期——与行工前辈一起畅谈DSP

`
与行工前辈一起畅谈DSP
高手问答第7期
小编导读:
       本期高手问答(8月11日-8月18日),我们请来了行工@michael_xing 为大家解答有关DSP的问题。
     

工简介

       michael_xing就是行江涛前辈,大家应该不陌生,经常在william hill官网 解答问题,是DSP的技术牛人。
       行工2008年于西安电子科技大学硕士毕业,毕业之后一直在DSP领域进行研究和开发。曾经任职于美国3DSP公司的嵌入式软件开发职位,中兴通讯的系统软件开发职位等,主要负责系统仿真、DSP和MCU等嵌入式算法和控制开发。
???
  • 假如你还在为DSP中的威廉希尔官方网站 实现or系统研发理不清头绪呢?
  • 假如你还在为DSP编程中的程序优化找不到更优的方法?
  • 或许,你可以动动你的五指,按下enter键,跟帖提问,并@michael_xing ,我们的行工哟,maybe热心的行工就能给你把问题解决or指引一个方向!

      同往常一样,我们的高手问答,还是回帖提问,记得同时@michael_xing

社区高手招募
     不限专业领域、不限技术方向,只要你是一个有活力并乐于分享的开发者,只要你愿意把自己的经验收获分享给大家,帮助众多从业者共同学习、共同进步,我们就欢迎你来做客社区高手问答。
      联系方式:pengjiali@elecfans.com。快来联系小编吧!

**************************************************************************
     Elecfans高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。
************问答精华*****************************
` 江前辈.jpg

回帖(98)

胡秋阳

2014-8-11 10:22:34
@michael_xing 请问前辈DSP TMS320F28232 是不是浮点型芯片?一个在28232上可以运行的程序,换成28335后程序不改动上是不是也可以跑?
1 举报

lique

2014-8-11 10:25:39
烧写flash时提示如下错误,是锁死了么?请前辈给分析下什么原因引起的,三天锁三个,
C28xx: Flash Programmer: Error erasing Flash memory.
C28xx: Flash operation timed out waiting for the algorithm to complete. Operation cancelled.
C28xx: Trouble Writing Memory Block at 0x3f64fa on Page 0 of Length 0x12
Cannot write to target
在MAP中显示 CSM_PWL               003f7ff8   00000008  00000000  00000008  RWIX,密码位没被占用
举报

niu!kf

2014-8-11 10:27:54
@michael_xing 小弟完全未接触过音频编解码,最近因为需要了解了一下音频编解码的芯片,其中均集成了ADC和DAC,想请教一下行工,音频编解码与ADC和DAC是什么关系?(我理解是:ADC是编码的基础,DAC是解码的基础,解码其实就是将数字量经DAC后生成了模拟量在经运放等恢复音频,不知对否?)
举报

爱吃果冻

2014-8-11 10:31:08
@michael_xing
请问下,DSP2812怎么实现3路的模拟信号输出,而且该3路模拟信号是可控,可调的。
如果用SPI,怎么实现3路输出?
或者其他用PWM波然后再经过什么可以实现这样的功能?先谢谢前辈的指导了。
举报

gvxiaot

2014-8-11 10:33:27
@michael_xing
当T1CTPRIP—PDPINTA口电平被拉至低电平后,PWM1-6没有PWM波形输出,如何设置能够使得当T1CTRIP-PDPINTA恢复成高电平后,继续产生PWM波形?求大神指导,我现在的状况是,一旦T1CTRIP-PDPINTA口在某一瞬间降为低电平,以后就算恢复成高电平也没有PWM输出了,只能再次上电复位@michael_xing   求大神指导
举报

klysa

2014-8-11 10:35:57
@michael_xing
自己写的一直进不去中断,关于PDPINT保护,中断pwm输出的程序。我写的程序是这样子的

使用的是evb的pdpintb中断
先是
         GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB_GPIOD5=1;    //设置外设功能
         GpioMuxRegs.GPDDIR.bit.GPIOD5=1;                     //设置为输出口
         
Ev中
        EvbRegs.EXTCONB.bit.INDCOE=0;
        EvbRegs.EVBIMRA.bit.PDPINTB=1;
        EvbRegs.EVBIFRA.bit.PDPINTB=1;
主程序中

PieCtrl.PIEIER1.bit.INTx2=1; //pdpintb 中断
请问还缺少什么?


初步问题是 没开CPU的中断和外设的时钟时能
应加上
IER|=M_INT1;        //开CPU中断1
SysCtrlRegs.PCLKCR.bit.EVBENCLK = 1;    //使能EVB模块时钟

还有其它问题吗? 不知道问题出在哪里呢?希望能得到指导。谢谢前辈。
举报

哼小曲

2014-8-11 10:37:42
@michael_xing 大虾,我在调试DSP(6701)的时候,发现程序下到SDRAM内跑的时候,只能按INT型数据跑,如果按字节读写的时候就会乱。还有我调试时使用fopen,printf函数时,就会死机。我研究威廉希尔官方网站 图发现,SDRAM是由两个16位宽的尔必达EDS5116ABTA拼接成32位。但是SDRAM的高16位和低16位UDQM和LDQM同时共用DSP的BE0和BE1,高16位的SDRAM没有接BE2和BE3。请教大虾,这是不是就是我出问题的原因???
举报

胖子的逆袭

2014-8-11 10:41:43

通过dsp f2812 的gpioA组引脚采集一幅静态数字图像,采集后存储到外部存储单元sram中,该怎样设置gpio引脚,该怎样配置,摄像头用ov6620.@michael_xing  大虾求助
举报

你又知道了

2014-8-11 10:45:14
@michael_xing 最近在做DSP图像处理,需要将采集到的图像从YCrCb转换成RGB格式后,进行图像处理,再将RGB图像转换成YCrCb进行显示,下面是我的图像处理的程序,不知道为什么显示出来的结果总是一片黑,求大神指点。
void videoReverse()
{
      int i,j,temp;
        int r,g,b,y,cr,cb,pr,pg,pb;
Uint8 *Y,*Cr,*Cb;
for(i=intALines;i         {
            for(j=intAPixels;j             {
            Y=(Uint8 *)(tempYbuffer + i*numPixels + j);
            Cr=(Uint8 *)(tempCrbuffer + i * (numPixels >> 1) + j);
            Cb=(Uint8 *)(tempCbbuffer + i * (numPixels >> 1) + j);
            y=(*Y);cr=(*Cr);cb=(*Cb);
            y-=16;cr-=128;cb-=128;
            r=1.164*y+1.596*cr;
            g=1.164*y-0.813*cr-0.392*cb;
            b=1.164*y+2.017*cb;
            if ( r>255 )        r=255;
                        else if ( r<0 )        r=0;
                        if ( g>255 )        g=255;
                        else if ( g<0 )        g=0;
                        if ( b>255 )        b=255;
                        else if ( b<0 )        b=0;

            temp=2*g-r-b;
            if ( temp>255 )          temp=255;
                        else if ( temp<0 )        temp=0;
            r=abs(temp);g=abs(temp);b=abs(temp);
            pr=abs(0.257*r+0.504*g+0.098*b+16);
            *(Uint8 *)(tempYbuffer + i*numPixels + j)=pr;
                        pb=abs(-0.148*r-0.291*g+0.439*b+128);
              *(Uint8 *)(tempCbbuffer + i * (numPixels >> 1) + j)=pb;
                        pr=abs(0.439*r-0.368*g-0.071*b+128);
            *(Uint8 *)(tempCrbuffer + i * (numPixels >> 1) + j)=pg;
            Y++;Cr++;Cb++;
}
}
for(i=numLines/2+intALines;i         {
            for(j=intAPixels;j             {
               Y=(Uint8 *)(tempYbuffer + i*numPixels + j);
            Cr=(Uint8 *)(tempCrbuffer + i * (numPixels >> 1) + j);
            Cb=(Uint8 *)(tempCbbuffer + i * (numPixels >> 1) + j);
            y=(*Y);cr=(*Cr);cb=(*Cb);
            y-=16;cr-=128;cb-=128;
            r=1.164*y+1.596*cr;
            g=1.164*y-0.813*cr-0.392*cb;
            b=1.164*y+2.017*cb;
            if ( r>255 )        r=255;
                        else if ( r<0 )        r=0;
                        if ( g>255 )        g=255;
                        else if ( g<0 )        g=0;
                        if ( b>255 )        b=255;
                        else if ( b<0 )        b=0;
            temp=2*g-r-b;
            if ( temp>255 )          temp=255;
                        else if ( temp<0 )        temp=0;
            r=abs(temp);g=abs(temp);b=abs(temp);
            pr=abs(0.257*r+0.504*g+0.098*b+16);
            *(Uint8 *)(tempYbuffer + i*numPixels + j)=pr;
                        pb=abs(-0.148*r-0.291*g+0.439*b+128);
              *(Uint8 *)(tempCbbuffer + i * (numPixels >> 1) + j)=pb;
                        pr=abs(0.439*r-0.368*g-0.071*b+128);
            *(Uint8 *)(tempCrbuffer + i * (numPixels >> 1) + j)=pg;
            Y++;Cr++;Cb++;
        }
}                        
}
举报

study875

2014-8-11 11:05:46

求助@michael_xing 大侠下面这段程序中的void image_projecting ()函数该如何进行优化呢?进行线性汇编的话该如何进行代码修改呢?
* FILENAME: app_process.c
* PLATFORM: VC6.0
*
*  The c file is used to compute the  projection iamge   
*
*
******************************************************************************/

/*--------------the head file declaration-------------------------------------*/

#include      
#include      
#include      
#include      "app_extern.h"
#include      "app_main.h"

/*---------------------------------------------------------------------------------------*/


/*----------------------the function of computing the prejectiong image  -----------------*
*                                                                                         *
*                      此函数用于计算该图像的目标放投影图                                 *
*                      即:计算图像中每一点成为目标的概率                                 *
*                         反投影图中越亮的点表明该点越有可能成为目标                      *
*                        由两部分在组成:1.计算目标的归一化直方图                         *
*                                        2.计算各个像素点成为目标的概率                   *
*                   注:本文在图像上建立的坐标系如下图所示                                *
*                                                                                         *
*                         0---------------> X(352)                                        *
*                         |                                                               *
*                         |                                                               *
*                                                  |                                                               *
*                                                  |                                                               *
*                                                  V y (288)                                                       *
/-----------------------------------------------------------------------------------------*/

void image_projecting ()
{
  object_modeling(Y_data);
  compute_prob_project(Y_data,Y_shadow);

}

/*------------------the function of computing the probility of the pixel -----------------*
*                                                                                         *
*                      此函数用来计算图像中各像素点成为目标的概率                         *
*                                                                                         *
/-----------------------------------------------------------------------------------------*/
void compute_prob_project(unsigned char *p_data ,unsigned char*p_data_project)
{
  int i ;
  unsigned short    *prob=Histogram_object;
  unsigned char     temp;
  for(i=0;i   {

   temp=*(p_data++);
   *p_data_project++=(unsigned char)(*(prob+temp));

  }

}

/*----------------------the function of compute the histogram  ---------------------------*
*                                                                                         *
*                      此函数用来计算目标的归一化直方图                                   *
*                                                                                         *
/-----------------------------------------------------------------------------------------*/

void object_modeling(unsigned char *p_data)
{         
          unsigned short   *prob=Histogram_object;
          int              i,j,t;
      unsigned short   x1=object_location_x1;
          unsigned short   x2=object_location_x2;
          unsigned short   y1=object_location_y1;
          unsigned short   y2=object_location_y2;
          unsigned short   scale_window;

          scale_window=(x2-x1)*(y2-y1);
          memset(prob,0,512);

  for(j=y1;j         {

                for(i=x1;i                 {
                        *(prob+(*(p_data+j*width+i)))+=1;
                }

        }

   for(i=0;i<256;i++)
   {
     *(prob+i)= *(prob+i)*255*3/scale_window;
   }
   printf("The object model is constructedn");
}


/*-------------------the function of drawing a window around the object ------------------*
*                                                                                         *
*                      此函数用来标注目标在图像中的位置                                   *
*                                                                                         *
/-----------------------------------------------------------------------------------------*/

void draw_window (unsigned char *src_data )
{
  int i ;
  unsigned short    x1=object_location_x1;
  unsigned short    x2=object_location_x2;
  unsigned short    y1=object_location_y1;
  unsigned short    y2=object_location_y2;
  unsigned short    window_w=x2-x1;
  unsigned short    window_h=y2-y1;
  unsigned char     *src;

  src=src_data+y1*width+x1;

/****************标注平行于x轴的框子*************************************/

for(i=0;i   {
        *(src+i)=255;
        *(src+width+i)=255;
    *(src+i+(window_h-1)*width)=255;
    *(src+i+window_h*width)=255;
  }

/****************标注平行于y轴的框子*************************************/

for(i=0;i   {
        *(src+i*width)=255;
    *(src+i*width+1)=255;
    *(src+i*width+window_w)=255;
        *(src+i*width+window_w-1)=255;
  }


}

/*----------------------the function of write the output information  --------------------*
*                                                                                         *
*                      此函数用来将所做的题目号和耗费时间加到图像数据中                   *
*                      注:* 请勿修改此项*                                                *
/-----------------------------------------------------------------------------------------*/

void fun_out(unsigned char *buffer_in, float costtime)
{
        int  j ;
        unsigned char num = 17;
        double tt=costtime;
        for (j = 0 ; j < 10; j ++)
        {
                buffer_in[j] = 0;
        }
        buffer_in[0] = num;
        memcpy(&buffer_in[1],&tt,8);
}

/*********************************** end of the file **********************************************/
举报

youyoulan

2014-8-11 11:11:41
@michael_xing 前辈
我想实现PC发送数据给DSP,再由DSP将接收到的数据发回PC。现在发送的部分可以实现,但接收部分出现了问题。具体的程序是:
for(i=0;i<100;i++)
{
       buffer=SciaRegs.SciRxBuffer;
}
以上程序当PC一次发送100个数据时,返回的100个数据就会出错。然后我做了延时改动,
for(i=0;i<100;i++)
{
       buffer=SciaRegs.SciRxBuffer;
        delay();
}
此时,延时的时长必须恰到好处才能实现正确的返回100个数据。比较理想的是通过判断相关的标志位来代替延时,请问该用哪个标志位,怎么写这条指令?
举报

tulin

2014-8-11 11:13:59
@michael_xing
求大神帮助,请问epwm模块,事件触发选择寄存器,如果我想选择多事件触发中断,那么INTSEL位要怎么设置呢?好像它只能设置一种事件来触发中断。。。比如在(TBCTR=0x0000和TBCTR=TBPRD)两个事件都触发,急求!!!!!!再次先谢过了!!
举报

douyin8

2014-8-11 11:17:16
@michael_xing
出现error:struct "PIE_VECT_TABLE" has no field "SCIRXINTA"该如何解决
举报

麦特拉布

2014-8-11 11:19:27
最近学习EMIF_SDRAM,虽然已经成功,但是其中出现的问题实在是令人蛋疼!!!!!!!!!!!!!!!!!!

现在是全局定义。
错误的原因就是三个定义的位置,datacount是将0到1000个数字写入到SDRAM的一个变量,databuffer数组是用来接受从SDRAM中读取的数据的,剩下的两个,一个是SDRAM的首地址,一个是尾地址。
一、现在是正确的情况,运行之后,error=0,标志位i=1;


二、当把定义位置1、2调换以后


运行之后就不能正确的读取SDRAM中的数据了error=3(说明有三次读取的数据有错误),i=2


三、因为这三个的定义我只是在主函数中使用,所以我便将这三个定义转移到了main函数中,作为局部定义使用,同样也会出现和二一样的错误。


求解啊!!!

下面是我的程序:
# include "csl.h"
# include "csl_pll.h"
# include "csl_emif.h"
# include "csl_chip.h"
# include "stdio.h"
# include "csl_gpio.h"


unsigned int datacount=0;
int databuffer[1000]={0};
int *souraddr,*deminaddr;




PLL_Config PLL_SETTING={
        0,
        1,
        6,
        0
};


EMIF_Config EMIF_SETTING={
                  0x221,
                  0xFFFF,


                  0x3FFF,
                  0xFFFF,
                  0x00FF,


                  0x3FFF,
                  0xFFFF,
                  0x00FF,


                  0x1FFF,
                  0xFFFF,
                  0x00FF,


                  0x1FFF,
                  0xFFFF,
                  0x00FF,


                  0x2911,
                  0x0410,
                  0x07FF,
                  0x0131
};


void main ()
{


        unsigned int error=0;
        int i=0;


        CSL_init ();
        CHIP_RSET (XBSR,0X0A01);
        PLL_config (&PLL_SETTING);
        EMIF_config (&EMIF_SETTING);


        souraddr=(int*)0x40000;
        deminaddr=(int *)0x41000;
        while (souraddr         {
                *souraddr++=datacount;
                datacount++;
        }


        souraddr=(int *)0x40000;
        datacount=0;
        while (souraddr         {
                databuffer[datacount++]=*souraddr++;
                if (databuffer[datacount-1]!=(datacount-1))
                {
                        error++;
                }
        }
        if (error==0)
        {
                GPIO_RSET(IODIR,0XFF);
                GPIO_RSET(IODATA,0X80);
                i=1;
        }
        else
        {
                GPIO_RSET(IODIR,0XFF);
                GPIO_RSET(IODATA,0X00);
                i=2;
        }
        while (1);
}

求指导


举报

笔画张

2014-8-11 11:28:13
@michael_xing 在DM642的示例程序中加了一段进行反色处理的代码,但是显示出来之后会有视频亮线,如果直接对整幅图像循环处理,在显示的时候图像会乱序抖动闪烁,有前辈说是因为要分奇数场和偶数场来进行处理,但是不知道缓冲区中那些行是奇数行哪些是偶数行,代码应该如何修改,求助大神,一下为部分代码

while(1){/* loop for 4 seconds */
                 capFrameBuf= (FVID_Frame *)SCOM_getMsg(fromInput1toDIS, SYS_FOREVER);
            
       /* copy data from capture buffer to display buffer */
       /***************************************************/
      for(i = 0; i < numLines; i ++) {                                          
           DAT_copy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch,
                     disFrameBuf->frame.iFrm.y1+ i * disLinePitch,
                     numPixels);
           DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1),
                    disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch >> 1),
                     numPixels>>1);
           DAT_copy(capFrameBuf->frame.iFrm.cr1 +i * (capLinePitch >> 1),
                    disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch >> 1),
                     numPixels>>1);                                      
       }   
       //自己加的代码开始
       for(i=200;i<400;i++)
       {   
            for(j=200;j<400;j++)
            {   
                *(Uint8*)((Uint32)(disFrameBuf->frame.iFrm.y1)+i*numPixels+j)=0xFF-
                *(Uint8*)((Uint32)(disFrameBuf->frame.iFrm.y1)+i*numPixels+j);
             }
             for(j=100;j<200;j++)
             {
                *(Uint8*)((Uint32)(disFrameBuf->frame.iFrm.cb1)+i*(numPixels>>1)+j)=0x80;
                *(Uint8*)((Uint32)(disFrameBuf->frame.iFrm.cr1)+i*(numPixels>>1)+j)=0x80;
              }                  
         }  
     //自己加的代码结束
              /*-----------------------------------------------------------*/
              /*Display the decoded frame.              */                           
                /*-----------------------------------------------------------*/
                DAT_wait(DAT_XFRID_WAITALL);
                CACHE_clean(CACHE_L2ALL,NULL,NULL);
             FVID_exchange(disChan, &disFrameBuf);
举报

杨龙

2014-8-11 11:31:02
好人,有问题再问吧,先赞
1 举报

rosa

2014-8-11 14:53:40
我的小车单独转弯,一个轮前转一个后转可以。。但是一加传感器检测时,只能一个轮子前转,而另一个轮子不转啦。。。怎么回事。。测试时,代码很简单啊。。求帮助。
        while(1)
        {
               
                if(p10==1&&p11==0)
                {
                        turn_right();
                }
                if(p10==0&&p11==1)
                {
                        turn_left();
                }
                if(p10==1&&p11==1)
                {
                        back();
                }
                else                        
                forward();                 

                        
        }
@michael_xing
举报

surround

2014-8-11 16:21:53
最近在做dsp通过68013与pc机进行数据通信的项目!遇到一个很奇怪的问题,想请教一下。
首先我采用的是68013的异步slave fifo的模式。使用BULK传输。fifo缓冲区设定大小为512*4,固件程序中自动处理数据包的长度为512.

68013的异步slave fifo传输模式的逻辑控制是用cpld和dsp共同控制的,cpld中控制读写信号,控制输出使能信号SLOE,控制片选信号CS;DSP程序中控制地址FIFO_ADR0/ADR1,并读取FIFO_FLAGB/FIFO_FLAGC标志位。整个逻辑控制都实现好了!通信也正常,数据收发都很正常。

但是在测试68013通信速度时,出现了问题!我用ccs中profile->clock->view时钟周期计算时间,然后根据发送的字节数计算速度。
现在我就发送512字节,用for循环赋值。
void Dsp_PC(char* buf,int len)
{               
        int i,k;
        
        if(0==GPIO_Input_Read(pin_FLAGB))
        {
                while(1)
                {
                        if(1==GPIO_Input_Read(pin_FLAGB))
                        {   
                                break;
                        }                        
                }                                

        }
        
        if(1==GPIO_Input_Read(pin_FLAGB))
        {        

                GPIO_Output_Config(pin_ADR1,1);
                GPIO_Output_Config(pin_ADR0,0);                                                        
                for(i=0;i                 {               
--->设置断点                        *(unsigned char*)USB_68013CS=buf[i];
                        
                }                                
        }         
                        
        return ;
}


main()
{
      、、、、、一系列的初始化、、、

-->设置断点        asm(" NOP ");   
                       for(i=0;i<1;i++)
                      {
-->设置断点                Dsp_PC(buf,512);   //buf是我自己定义的一个数据,里面存放我发送的数据,512是发送的字节数

                       }
-->设置断点        asm(" NOP ");

}

现在如果在我标注的地方设置断点,那么就是单步执行Dsp_PC中发送的数据,在全部发送完512字节后,用的时钟周期是12000左右,但是如果我只在main函数中的两个空语句asm(" NOP ");处加断点,那么是for循环自行发送512字节,这时的时钟周期是37000,两者差别30倍左右!
请教前辈,问题出在哪???首先这两种方法外部因素全部一样   。 在线等、、
1 举报

michael_xing

2014-8-12 09:11:47
哇塞,各位很积极。谢谢各位对活动的捧场。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分