` 与行工前辈一起畅谈DSP 高手问答第7期 小编导读: 本期高手问答(8月11日-8月18日),我们请来了行工@michael_xing 为大家解答有关DSP的问题。 行工简介: michael_xing就是行江涛前辈,大家应该不陌生,经常在开云(中国)官方解答问题,是DSP的技术牛人。 行工2008年于西安电子科技大学硕士毕业,毕业之后一直在DSP领域进行研究和开发。曾经任职于美国3DSP公司的嵌入式软件开发职位,中兴通讯的系统软件开发职位等,主要负责系统仿真、DSP和MCU等嵌入式算法和控制开发。 ???
同往常一样,我们的高手问答,还是回帖提问,记得同时@michael_xing 社区高手招募 ************************************************************************** Elecfans高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。 ************问答精华***************************** `
![]() |
@michael_xing 请问前辈DSP TMS320F28232 是不是浮点型芯片?一个在28232上可以运行的程序,换成28335后程序不改动上是不是也可以跑? |
烧写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,密码位没被占用 。 |
@michael_xing 小弟完全未接触过音频编解码,最近因为需要了解了一下音频编解码的芯片,其中均集成了ADC和DAC,想请教一下行工,音频编解码与ADC和DAC是什么关系?(我理解是:ADC是编码的基础,DAC是解码的基础,解码其实就是将数字量经DAC后生成了模拟量在经运放等恢复音频,不知对否?) |
@michael_xing 请问下,DSP2812怎么实现3路的模拟信号输出,而且该3路模拟信号是可控,可调的。 如果用SPI,怎么实现3路输出? 或者其他用PWM波然后再经过什么可以实现这样的功能?先谢谢前辈的指导了。 |
@michael_xing 当T1CTPRIP—PDPINTA口电平被拉至低电平后,PWM1-6没有PWM波形输出,如何设置能够使得当T1CTRIP-PDPINTA恢复成高电平后,继续产生PWM波形?求大神指导,我现在的状况是,一旦T1CTRIP-PDPINTA口在某一瞬间降为低电平,以后就算恢复成高电平也没有PWM输出了,只能再次上电复位@michael_xing 求大神指导 |
@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模块时钟 还有其它问题吗? 不知道问题出在哪里呢?希望能得到指导。谢谢前辈。 |
@michael_xing 大虾,我在调试DSP(6701)的时候,发现程序下到SDRAM内跑的时候,只能按INT型数据跑,如果按字节读写的时候就会乱。还有我调试时使用fopen,printf函数时,就会死机。我研究电路图发现,SDRAM是由两个16位宽的尔必达EDS5116ABTA拼接成32位。但是SDRAM的高16位和低16位UDQM和LDQM同时共用DSP的BE0和BE1,高16位的SDRAM没有接BE2和BE3。请教大虾,这是不是就是我出问题的原因??? |
通过dsp f2812 的gpioA组引脚采集一幅静态数字图像,采集后存储到外部存储单元sram中,该怎样设置gpio引脚,该怎样配置,摄像头用ov6620.@michael_xing 大虾求助 |
@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++; } } } |
求助@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 **********************************************/ |
@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个数据。比较理想的是通过判断相关的标志位来代替延时,请问该用哪个标志位,怎么写这条指令? |
@michael_xing 求大神帮助,请问epwm模块,事件触发选择寄存器,如果我想选择多事件触发中断,那么INTSEL位要怎么设置呢?好像它只能设置一种事件来触发中断。。。比如在(TBCTR=0x0000和TBCTR=TBPRD)两个事件都触发,急求!!!!!!再次先谢过了!! |
@michael_xing 出现error:struct "PIE_VECT_TABLE" has no field "SCIRXINTA"该如何解决 |
|
@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); |
我的小车单独转弯,一个轮前转一个后转可以。。但是一加传感器检测时,只能一个轮子前转,而另一个轮子不转啦。。。怎么回事。。测试时,代码很简单啊。。求帮助。 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 |
最近在做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倍左右! 请教前辈,问题出在哪???首先这两种方法外部因素全部一样 。 在线等、、 |
哇塞,各位很积极。谢谢各位对活动的捧场。 |
3638 浏览 1 评论
829 浏览 0 评论
5071 浏览 0 评论
基于 DSP5509 进行数字图像处理中 Sobel 算子边缘检测的硬件连接电路图
6521 浏览 0 评论
1015 浏览 0 评论
电子发烧友网
电子发烧友开云(中国)官方