//*********************************************************************************************************************************//
更新时间 : 2016/9/18
使用平台 : f8377d
ccs版本 : ccs6.1.1
问题描述 :
在使用dsp中通过flash的api来修改flash内存中的内容,但是在同一个文件下添加一个函数后,发现原本可以使用的flash修改api的函数无法实现功能(现象上看感觉上显示程序跑飞了);将添加的新函数移除到另外一个文件中,功能便能够实现。
原因分析 :
代码段在flash的存储是按照顺序排列的,当在同一个文件下添加了新函数后,可能会影响各个函数的排列顺序,是的在调用时出现了问题。从未出现了程序跑飞的现象。具体原因还在查找;
解决办法 :
将添加的函数代码段换一个位置或者移除到其他文件中即可
//*********************************************************************************************************************************//
更新时间 : 2016/9/26
使用平台 : f8377d
ccs版本 : ccs6.1.1
问题描述 :
在DSP中实现一个两组数据乒乓往外传输的一个过程;传输哪一组数据是根据标志位来决定的;按照顺序一次传输;但是在传输过程中会对标志位进行修改(其他功能所致);当将两组数据变为三组数据,并且任然使用两块buffer做乒乓,此时的数据标志位和数据存在一个错位的关系
此时的标志位为SweepMode;通过轮换的判断来确定标志位和所传输的数据;
但是这种代码的结构的优点是:能够很方便的实现代码,并且减少%运算带来的消耗
缺点在于:如果在此段代码之外还有代码会修改SweepMode,那这就埋下了隐患;
所以在使用时尽量要避免这种情况的发生;
此处在将两组数据转换为3组数据出错的原因就在于在SweepMode的赋值导致数据传输的顺序出现错误
所以在使用类似结构的时候一定要避免对同一个标志位多次操作
解决办法 :
根据逻辑修改SweepMode的赋值
//*********************************************************************************************************************************//
更新时间 : 2016/10/11
使用平台 : f8377d
ccs版本 : ccs6.1.1
问题描述 :
用DSP的gpio来模拟spi的输入移位过程;来获取32位的寄存器数据;但是发现移位过程中得到的寄存器值要比实际值左移了一位源代码如下:
问题分析 :结果多左移位一位的原因是;在for循环中,就是多移位了一次;上面的程序存在一个bug;就是当datahmc获取的寄存器的值最高位为1的时候;很可能就是丢弃;所以修改后的代码如下所示:
for(i = 0; i < 31 ; i ++)
{
DELAY_US(5);
datahmc = GPIO.DAT17 |datahmc ;
if( i < 30)datahmc << 1;
}
只要将最后一次不发生移位就可以完整的接受到寄存器的值并不发生溢出。
//*********************************************************************************************************************************//
更新时间 : 2016/10/12
使用平台 : f8377d
ccs版本 : ccs6.1.1
问题描述 :
内部DMA的使用方法和寄存器值得作用:代码段如下 :
这段代码实现的功能:
降tempdata1中的数据按照如下格式传输到tempdata3中
第一次for循环后 tempdata3中的值为:0 1 8 9 16 17... ... 16376 16377
第二次for循环后 tempdata3中的值为:2 310 1118 19... ... 16378 16379
第三次for循环后 tempdata3中的值为:4 5 12 13 20 21 ... ... 16380 16381
第二次for循环后 tempdata3中的值为:6 7 14 15 22 23 ... ... 16382 16383
简而言之就是在原始数据中每次突发2个字 ; 每个突发后原地址增加8
下面是各个调用到函数中的寄存器值得说明 :
*DMA_Dest *DMA_Source
原始数据存储空间地址和目的存数空间的地址;这些地址都要将他们组一个地址转换;转换为32位
BURST_SIZE : 每一次突发传输字节数(突发就是一次传输多个字的意思);
SRC_BURST_STEP : 在一次突发过程中,突发一个字后原地址增加数;比如说如图设置,一次突发传输两个字
在第一个字传输完成后,由于SRC_BURST_STEP为1,所以突发的第二个字的地址就是第一个字的后一个地址
如果SRC_BURST_STEP为2,则表征突发的第二个字是第一个字的后二个字;
DST_BURST_STEP:类比于SRC_BURST_STEP ;
TRSNSFORM_SIZE :总共传输多少个突发,完成一次DMA的传输
SRC_TRSNSFORM_STEP:完成一次突发后原地址增量,它是以第一个突发地址作为参考的;
这个要区别SRC_BURST_STEP 。
DST_TRSNSFORM_STEP : 类比于SRC_TRSNSFORM_STEP;
//*********************************************************************************************************************************//
更新时间 : 2016/10/17
使用平台 : f8377d
ccs版本 : ccs6.1.1
问题描述 :
我需要将一个参数从CPU2传递到CPU1中来;最长用的方法就是通过IPC的ram;但是历程中比较复杂
另外一种方法就是:
直接操作内部的sram;具体操作如下
在cpu2中定义指针
Uint16 *Pdata2 = 0x3f800;
在cpu2中对该地址的寄存器赋值
*Pdata = 10;
在CPU1中同样定义一个指向0x3f800的指针
Uint16 *Pdata1 = 0x3f800;
Uint16 datatemp = 0;
datatemp =*Pdata1;
这样就可以比较方便的取出他的值
但是这种方法有几个需要注意的问题 :
1、一块ram不能两个cpu同时读写;只有一个cpu写;另一个cpu读数据
2、尽量使用程序中为涉及的地址ram块,避免其他的数据将其占用
我使用的内存块如下所示:
并且记得尽量使用它们之间共享的内存才能够使用
并且对于简单的数据传输可以使用;对于复杂的就要考虑一下这种方法是否可行
//*********************************************************************************************************************************//
更新时间 : 2016/10/17
使用平台 : f8377d
ccs版本 : ccs6.1.1
问题描述 :
调用ccs 的dsp外部库实现fft算法时,出现了就按的结果一直增大,几次之后变为无穷大;
原因 :出现在FFT的两个函数:
一个为 : CFFT_F32();
另一个为 :CFFT_32U();
第一个函数需要memory对齐;第二个函数不需要,但是耗时要长很多;
将cmd文件对应得memmap修改为整数;
错误时 CFFTdata1 :> RAMGS3_4;
正确的修改如图所示
//*********************************************************************************************************************************//
更新时间 : 2016/10/17
使用平台 : f8377d
ccs版本 : ccs6.1.1
问题描述 :
加快运算速度DSP28377中有一个fpu库,使用库内部的函数可以比使用string等c语言函数速度要快;
所以在使用了外部库的时候可以去看一看库中的函数可以帮助我们增加运算速度