编译没有问题,但是只要加入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:
好的,也感谢你的反馈