This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6747程序连上仿真器在线实验,结果完全正确,用aisgen烧进flash后,运行结果与连上仿真器不一样。

我的程序用D800K005转化为bin文件烧写进flash后,发现程序运行不对。我DSP程序是这样的,首先控制AD采集数据,然后通过emifa 的cs4口传输到DSP,由于数据比较大,我把采集到数据放在连接在emifb的SDRAM中,运行处理程序时再取用SDRAM中的数据。上述程序用仿真器连接实验完全没问题,但是在烧到flash就出错了。程序我可以确定在运行,中断也没什么问题,我怀疑是AD采集的数据没有通过emifa传输到DSP,或者是数据没有放到SDRAM,不知道我的想法对吗?烧进flash中,我除了配置aisgen还需要做什么,请专家给点意见?万分感谢!

我的D800K005配置如下图

  • 请问你用的nand flash在bootloader支持的nand flash list中吗?

    Appendix B Details of Supported NAND Devices
    http://www.ti.com/lit/an/sprabb1c/sprabb1c.pdf 

  • 或者可以先boot一个简单的测试小程序,看是否跟你怀疑的数据没有放到SDRAM代码有关

  • 不加gel文件连接仿真器,打开原工程,download symbol进行调试:

    http://processors.wiki.ti.com/index.php/Debugging_Boot_Issues?keyMatch=boot%20device&tisearch=Search-EN#CCS_Crashing_when_Connecting

  • 在nand flash list中

  • 在列表里的话,就是支持,那跟flash型号本身没有关系。

    你看一下GEL文件的初始化设置有没有在AISgen工具设置好。

  • 我烧写进去一个led闪灯例程进去,发现没问题。SRAM这个怎么测试呢,是否正确怎么观察呢?

  • 用仿真器跟踪加载的程序运行情况,上面Tony给出跟踪的方法了。
    http://processors.wiki.ti.com/index.php/Debugging_Boot_Issues#.22Load_Symbols.22_instead_of_.22Load_Program.22

     

  • 你好,

    1、是不是aisgen生成的bin文件的功能就类似与gel文件,是不是把aisgen按照gel文件配置,就可以正常从flash启动?

    2、我用仿真器跟踪了我程序运行,发现烧进flash后,程序的中断有问题,中断没有执行。中断在线跑是没什么问题的。

  • 1. gel文件里的初始化配置在aisgen工具中有的就可以在aisgen中配置,如果没有的话,要放到代码了?

    2. 是什么中断?是中断标志位没产生还是产生了没有跳转到中断子程序?

  • 您好,

    用的是定时器中断,我发现一个奇怪的问题,我上电后中断没运行,但是我按下开发板上的重启键,有时按一下就可以了,有时需要多按几次,然后板子就正常了,中断就没问题了。这可能是什么原因,请专家指导下。

  • 请检查一下RESET信号是否足够长?reset信号的有效时间从power supply, oscin全都起来后开始计算。

  • 我不太清楚是为什么上电后中断不执行,按下复位一下就可以。这个是我程序的问题吗?您说的让我检查reset时间,我没太理解。

    这是我的主函数:

     Uint16 j;
      mode=0;  //保存模式 mode=1
    /*初始化6747核*/
     C6747_init(); 
     PINMUX9=0x00800800;      //0800   GP2-14 定义为AD_CONVST    GP2_11定义为LED 做为程序运行的指示
     PINMUX11 = 0x00001100;   //UART1_TXD,UART1_RXD
     PINMUX10 = 0x00000808;   //AM2302单总线输入口GP3-1 
     GPIO_DIR23&=~0x00004800; //设置IO为输出
     initdata();
     tr_data1.f=0;
     tr_data2.f=0;
     tr_data3.f=0;
     for(j=0;j<4;j++)
       {
        plangchar[j]=tr_data1.c[j];
        solidchar[j]=tr_data2.c[j];
         distchar[j]=tr_data3.c[j];
       }
     delay_loop(1000);
     Disp_DHR();         //环境温湿度检测 环境温度TT,环境湿度RT
     if(mode==0)
     {
     uart_TD(1,0);
     }
     initTIMER0();      //初始化定时器0 
     TIMER0_EMUMGT=0x1;
     CSR=CSR|0x1;       //开总中断
     asm(" NOP 2 ");
     GPIO_OUT_DATA23|=0x00004800;//打开LED GP2-11引脚   打开 AD_CONVST GP2-14引脚    0x00000800
     asm(" NOP 2 ");
     noiseRef();        //环境噪声水平监测
    定时器中断初始化函数
     void initTIMER0(void)
    {  
    // 设置中断控制寄存器
    CSR&=0xfffe;
    asm(" NOP 2 ");

        TIMER0_TGCR=0x00000015;  //采用32位独立定时器12
    TIMER0_TIM12=0; 
    TIMER0_PRD12=0x0000140; //周期值,改变其值的大小可以改变灯的亮灭频率
    // TIMER0_PRD12=0x0000180; //周期值,改变其值的大小可以改变灯的亮灭频率
    TIMER0_INTCLSTAT=0x3;//开定时器中断
    TIMER0_TCR=0x00000080;//开定时器0
    INTmux1=0x400;                          // 指定ADINT到中断5
                           // 关中断 GIE=0
    ISTP=0x80000000;                    // 重置中断向量表到0C00h
    ICR=0xfff0;
    ISR=0x0;                            // 清除等待的中断
    IER=0xffff;                    // 使能ADINT中断
    // CSR=CSR|1;                     // 开中断/* */
    }


  • ju huang 说:
    2、我用仿真器跟踪了我程序运行,发现烧进flash后,程序的中断有问题,中断没有执行。中断在线跑是没什么问题的。

    是只是中断有问题吗?还是根本没有boot起来。这时连上仿真器查看boot配置寄存器,是你所设置的NAND bootmode吗?

  •  00000000000000001111001101111111这是BOOTCFG寄存器的值,是符合我设置的nand bootmode
  • ju huang 说:

    我不太清楚是为什么上电后中断不执行,按下复位一下就可以。这个是我程序的问题吗?您说的让我检查reset时间,我没太理解。

    这是我的主函数:

     Uint16 j;
      mode=0;  //保存模式 mode=1
    /*初始化6747核*/
     C6747_init(); 
     PINMUX9=0x00800800;      //0800   GP2-14 定义为AD_CONVST    GP2_11定义为LED 做为程序运行的指示
     PINMUX11 = 0x00001100;   //UART1_TXD,UART1_RXD
     PINMUX10 = 0x00000808;   //AM2302单总线输入口GP3-1 
     GPIO_DIR23&=~0x00004800; //设置IO为输出
     initdata();
     tr_data1.f=0;
     tr_data2.f=0;
     tr_data3.f=0;
     for(j=0;j<4;j++)
       {
        plangchar[j]=tr_data1.c[j];
        solidchar[j]=tr_data2.c[j];
         distchar[j]=tr_data3.c[j];
       }
     delay_loop(1000);
     Disp_DHR();         //环境温湿度检测 环境温度TT,环境湿度RT
     if(mode==0)
     {
     uart_TD(1,0);
     }
     initTIMER0();      //初始化定时器0 
     TIMER0_EMUMGT=0x1;
     CSR=CSR|0x1;       //开总中断
     asm(" NOP 2 ");
     GPIO_OUT_DATA23|=0x00004800;//打开LED GP2-11引脚   打开 AD_CONVST GP2-14引脚    0x00000800
     asm(" NOP 2 ");
     noiseRef();        //环境噪声水平监测
    定时器中断初始化函数
     void initTIMER0(void)
    {  
    // 设置中断控制寄存器
    CSR&=0xfffe;
    asm(" NOP 2 ");

        TIMER0_TGCR=0x00000015;  //采用32位独立定时器12
    TIMER0_TIM12=0; 
    TIMER0_PRD12=0x0000140; //周期值,改变其值的大小可以改变灯的亮灭频率
    // TIMER0_PRD12=0x0000180; //周期值,改变其值的大小可以改变灯的亮灭频率
    TIMER0_INTCLSTAT=0x3;//开定时器中断
    TIMER0_TCR=0x00000080;//开定时器0
    INTmux1=0x400;                          // 指定ADINT到中断5
                           // 关中断 GIE=0
    ISTP=0x80000000;                    // 重置中断向量表到0C00h
    ICR=0xfff0;
    ISR=0x0;                            // 清除等待的中断
    IER=0xffff;                    // 使能ADINT中断
    // CSR=CSR|1;                     // 开中断/* */
    }




    因为你说要多次按重启键才能起来,我想是不是reset时间不够长导致DSP没跑起来。 

  • 这是在能boot成功之后读的,还是不能boot成功时读的?我要的是不能成功boot时的值。

    复位一下就能成功boot,说明你板子的上电顺序,复位时序上可能存在问题。

  • 首先非常感谢您的耐心解答。

    我把我的问题整理一下:

    1,、bootcfg的值无论程序是否正确运行,一直是0xF37F,符合我选择的nandboot模式

    2、我用一个简单的led闪烁程序发现正确,应该可以验证我的boot方法是正确的。

    3、我把自己程序烧写好,用load simbols跟踪,发现程序都能正确运行完开始一部分,可以说明我是boot启动成功了的。但是接下来进入定时器中断出了问题,这个是时而可以,时而不行,如果不行时reset一下就可以了(有时候需要多reset几次),感觉程序不稳定怎么的。我把能进入定时器中断子程序和不能进入定时器的相关寄存器比对了一下,发现寄存器值都是一样的。不能进入中断子程序时TIM12的值也变化。

    4、您指的复位时序有问题是指软件问题,还是硬件问题。能通过修改程序改变复位时间吗?

    5、请您看下我的中断程序,我的程序时参照研旭开发板例程。

     initTIMER0();      //初始化定时器0 
     TIMER0_EMUMGT=0x1;
     CSR=CSR|0x1;       //开总中断
     asm(" NOP 2 ");
     GPIO_OUT_DATA23|=0x00004800;//打开LED GP2-11引脚   打开 AD_CONVST GP2-14引脚    0x00000800
     asm(" NOP 2 ");

    void initTIMER0(void)
    {
    // 设置中断控制寄存器
    CSR&=0xfffe;
    asm(" NOP 2 ");

    TIMER0_TGCR=0x00000015; //采用32位独立定时器12
    // TIMER0_PRD12=0x0000140; //周期值,改变其值的大小可以改变灯的亮灭频率
    TIMER0_PRD12=0x0000180; //周期值,改变其值的大小可以改变灯的亮灭频率
    TIMER0_INTCLSTAT=0x3;//开定时器中断
    TIMER0_TCR=0x00000080;//开定时器0
    INTmux1=0x400; // 指定ADINT到中断5
    asm(" NOP 2 "); // 关中断 GIE=0
    ISTP=0x80000000;
    asm(" NOP 2 "); // 重置中断向量表到0C00h
    ICR=0xffff;
    asm(" NOP 2 ");
    ISR=0x0; // 清除等待的中断
    asm(" NOP 2 ");
    IER=0xffff; // 使能ADINT中断
    // CSR=CSR|1; // 开中断/* */
    }

     void interrupt LEDINT() //中断响应函数
    {

        
        GPIO_OUT_DATA23&=~0x00004000;
        delay_loop(1);
        GPIO_OUT_DATA23|=0x00004000; 
        ReadAD();
        CSR&= 0xfffe;              // 关中断 GIE=0
    asm(" NOP 1 ");
    ICR = 0xFFF0; 
        TIMER0_INTCLSTAT=0x3;   // 清除定时器中断标志
        asm(" NOP 1 ");
        CSR=CSR|0x1;  // 开中断 
    }

  • ju huang 说:
     void interrupt LEDINT() //中断响应函数
    {

        
        GPIO_OUT_DATA23&=~0x00004000;
        delay_loop(1);
        GPIO_OUT_DATA23|=0x00004000; 
        ReadAD();
        CSR&= 0xfffe;              // 关中断 GIE=0
    asm(" NOP 1 ");
    ICR = 0xFFF0; 
        TIMER0_INTCLSTAT=0x3;   // 清除定时器中断标志
        asm(" NOP 1 ");
        CSR=CSR|0x1;  // 开中断 
    }

    上面黄色部分是不需要做的, 删掉。