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

程序中增加数组,导致AD采样时间异常问题

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

rookiecalf:

从你描述的这个地方看不出什么问题,这是正常的cmd修改。不知道你还有什么其他操作没有。

另外你只去掉三个数组,保留修改后的cmd看看,确认一下是那部分引起。

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

user3900194:

是不是因为你将RAM空间4/5/6合并到一起的缘故?,你觉得ram空间不狗的话,你可以把变量放到flash空间里

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

Qingqing Lin:

回复 rookiecalf:

只去掉三个数组,保留修改后的cmd,运行是正常的,不知道大数组添加以后引起了哪些变化,使得那个AD的while语句执行了很长时间?

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

Qingqing Lin:

回复 user3900194:

你好, 这样更改和我上面的改法好像一样。可以把.ebss段都放到Flash里吗?这样程序运行时间会不会受影响?

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

Qingqing Lin:

回复 rookiecalf:

ADC初始化的使用有用到DELAY_US函数,程序部分倒是没有用到,请问下需要将这个函数用#pragma CODE_SECTION(函数名,"ramfuncs");copy到RAM里运行吗?

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

user3900194:

回复 Qingqing Lin:

我只用过pragma CODE_SECTION(函数名,"ramfuncs"),放到flash,试试看嘛,运行时间影响很小的,最终也是copy到RAM中运行。

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

rookiecalf:

回复 Qingqing Lin:

Qingqing Lin

你好, 这样更改和我上面的改法好像一样。可以把.ebss段都放到Flash里吗?这样程序运行时间会不会受影响?

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

user3900194:

回复 rookiecalf:

你把变量类型可以更改一下,我也是定义了数组,我定义的变量的类型为const,这个可以放在flash中,我现在这样应用是没有问题,你参考下。

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

Qingqing Lin:

回复 user3900194:

const类型好像是常量吧,如果在程序运行过程中需要更新的变量,能定义为const类型吗?

TMS320F28335;CCS 5.5

离线模式:用F28335.cmd

用#pragma CODE_SECTION(函数名,"ramfuncs"); 将所有函数都copy到RAM里运行。

程序采样PWM触发ADC采样,每50us一个PWM中断,同时AD采样一次。用GPIO高电平看进PWM中断到AD采样完成的时间,程序如下:

/*************************************************************/

GpioDataRegs.GPBSET.bit.GPIO58 = 1;   //GPIO置高

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;  //GPIO置低

/*************************************************************/

PWM是增减模式,在计时器为0时进中断,计数器到达峰值时启动ADC,正常情况下,上面程序的高电平时间非常短,观察到的时间约为380ns。

为了查看一些控制量,程序里添加了3个数组:

float see1[400], see2[800], see3[800];

添加上面3个数组之后,.ebss段的大小为0x2263,,而默认长度只有0x1000,因此需要改CMD文件

RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

更改为

RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */

.ebss               : > RAML4       PAGE = 1

DMARAML4 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1

编译正确,烧写之后运行,查看GPIO高电平时间,发现时间很长,大概42us。

在修改cmd文件之后,把上面三个数组完全注释掉,重新烧写运行,查看GPIO高电平时间大概380ns。

这么来看,好像就是这3个数组的加入,使得AD采样时间发生异常。下面两张图就是观察到的GPIO高电平时间,上面的图是正常情况,下面的是异常情况。

另外,如果是在线模式,使用28335_RAM_lnk.cmd,则添加3个数组后程序运行也正常。

在这儿恳请各位专家和大神帮帮忙,看看是哪边出现的问题?感激不尽!谢谢了!这个问题困扰太久了。

再次表示感谢!

Qingqing Lin:

回复 rookiecalf:

我试了一下,如果只加see1数组,程序还是正常的,再加一个see2数组,就不正常了。

赞(0)
未经允许不得转载:TI中文支持网 » 程序中增加数组,导致AD采样时间异常问题
分享到: 更多 (0)