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

28335加入DELAY_US就会出错

编译没有问题,但是只要加入DELAY_US(100),想实现的功能就实现不了。连矩阵按键控制LED灯亮灭都不行,主函数代码如下:

#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File

#include "leds.h"
#include "key.h"

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
int i= 0;
char key = 0;

InitSysCtrl();

LED_Init();
KEY_Init();

while(1)
{
key = KEY_Scan(0);

switch(key)
{
case KEY1_PRESS: LED2_TOGGLE;break;
case KEY2_PRESS: LED3_TOGGLE;break;
case KEY3_PRESS: LED4_TOGGLE;break;
case KEY4_PRESS: LED5_TOGGLE;break;
case KEY5_PRESS: LED6_TOGGLE;break;
case KEY6_PRESS: LED7_TOGGLE;break;
}

i++;
if(i==2000)
{
i = 0;
LED1_TOGGLE;
}
DELAY_US(100);

}
}

Susan Yang:

请问是否有进行在线debug?您现在想要实现的功能是什么?

建议您在while循环后,加上
//
// Software breakpoint
//asm(" ESTOP0");
来试试

,

user6644050:

进行了在线的Debug。
想实现的功能是:按下矩阵按键控制LED灯闪烁。
Debug时,有时候还会报错No source available for "0x3ff9fa",但似乎不影响程序烧录

void main()
{int i= 0;char key = 0;
InitSysCtrl();
LED_Init();KEY_Init();
while(1){key = KEY_Scan(0);
switch(key){case KEY1_PRESS: LED2_TOGGLE;break;case KEY2_PRESS: LED3_TOGGLE;break;case KEY3_PRESS: LED4_TOGGLE;break;case KEY4_PRESS: LED5_TOGGLE;break;case KEY5_PRESS: LED6_TOGGLE;break;case KEY6_PRESS: LED7_TOGGLE;break;}
i++;if(i==2000){i = 0;LED1_TOGGLE;}DELAY_US(100);
}//// Software breakpoint//asm(" ESTOP0");
}
是这样添加代码吗

,

Susan Yang:

是的,您可以参考TI例程内的写法

,

user6644050:

可惜还是不好使

,

Susan Yang:

在线调试时,功能是否可以正常运行?

,

user6644050:

在线调试时,功能就不能正常运行

,

Susan Yang:

能否详细说下?执行情况如何?去除DELAY_US(100);是可以正常的?

,

user6644050:

好的。上面的代码就是我的主函数。
当我不把delay_us注释掉时,所有的LED灯都是熄灭状态
当我把delay_us注释掉以后,我的LED1会不停闪烁,但是当我按下按键以后,LED1会熄灭,直到我松开按键之前都不会再亮,与此同时其他LED灯也是熄灭状态。与一开始设想的控制结果不符

,

Green Deng:

实在不行可以换成delay_loop();

void delay_loop()
{volatile long i;for (i = 0; i < 100; i++) {}
}

,

user6644050:

前两天了论坛维护了,所以不能及时回您。您的方法确实能做到简单的延时,但是还是不如DELAY_US来得准确简单,我将程序中(包括.c  .h)程序中的DELAY_US全部替换为for循环,我想要的功能就能正常实现了。 但还是不明白为什么DELAY_US用不了,我的文件库中也包括了DSP2833x_usDelay.asm 难道是我添加错了吗

,

user6644050:

前两天了论坛维护了,所以不能及时回您。我将程序中(包括.c  .h)程序中的DELAY_US全部替换为for循环作为简单延时,我想要的功能就能正常实现了。 但还是不明白为什么DELAY_US用不了,我的文件库中也包括了DSP2833x_usDelay.asm 难道是我添加错了吗

,

da qin zheng sheng:

可以使用定时器

,

Green Deng:

你有没有单步调试过?看看具体代码运行的时候是什么问题?比如是卡在哪句语句了?还是部分程序没有执行等等

,

user6644050:

谢谢您的回复,可是有一些TI公司自带的函数里就用的DELAY_US,比如ADC中的InitAdc() 也用不了,这实在是太奇怪了

,

user6644050:

void main(){ int i=0; float adc_vol;

InitSysCtrl();

InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable();

LED_Init(); TIMER0_Init(150,200000);//200ms SHUMAGUAN_Init(); //ADC_Init();

while(1) {// adc_vol=(float)Read_ADCValue()*3.0/4096; SMG_DisplayFloat(15.20,2);// SMG_DisplayInt(Read_ADCValue());

}}这是简单的ADC的主程序,当我把ADC_Init取消注释以后,后面的程序就不执行了。因为ADC_Init里有TI自带的函数 InitAdc(),里面用到了DELAY_US。当我把ADC_Init注释掉以后,后面的程序就能够执行了

,

da qin zheng sheng:

e2echina.ti.com/…/dsp28335-delay_us

,

user6407498:

我之前遇到过这个问题,是因为没有将DELAY_US函数转移到ram中运行导致的,可以按照楼上的说明逐步操作,应该就可以解决问题了

,

Green Deng:

我也考虑过搬移到ram中的问题,但是看到回复中提到他的程序是在线仿真过程中遇到的问题,所以就排除这个原因了

,

user6644050:

感谢感谢,我都想给自己两下 添加DSP2833x_MemCopy.c 在源文件后就解决了

,

user6644050:

感谢感谢,少添加DSP2833x_MemCopy.c导致的

,

user6644050:

实在抱歉,由于我刚开始接触DSP28335,所以一开始对问题描述地不是很清楚,在添加DSP2833x_MemCopy.c后就解决了 感谢您花费时间来回答我的问题 谢谢

,

Green Deng:

好的,也感谢你的反馈

赞(0)
未经允许不得转载:TI中文支持网 » 28335加入DELAY_US就会出错
分享到: 更多 (0)