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.

TMS320F280025C: 例程在RAM里运行正常,下载到ROM里不正常。求助。

Part Number: TMS320F280025C
Other Parts Discussed in Thread: C2000WARE

我前几天下载了C2000,导入了一个280025的例程epwm_ex2_updown_aq,下载到RAM里运行正常,但是下载到ROM提示成功但没有反应,不出波形。在线调试,发现问题好像是SysCtl_setClock(DEVICE_SETCLOCK_CFG)这句话导致的,注释掉这句话,可以出波形,但PWM频率完全不准。然后我尝试打开SysCtl_setClock定义,只在sysctrl.h中找到了extern bool     SysCtl_setClock(uint32_t config)这句,还是看不到这个函数到底怎么执行的。请问贵方能否提供解决办法或者给一些建议,非常感谢!!

  • 你好,首先要确认一下,你是如何将程序设置为下载到rom的?以及,你的硬件是否能确认可以正常输出PWM?

    因为一般来说TI提供的例程都不会有什么大问题,一般是使用的时候设置或者硬件出问题的比较常见。

  • 准确的说是用28002x_generic_ram_lnk.cmd时正常,用示波器可以看到正常的PWM波形;用28002x_generic_flash_lnk.cmd把程序写进去后,拿掉仿真器则不能出波形。程序好像是SysCtl_setClock(DEVICE_SETCLOCK_CFG)这句话导致的,注释掉这句话,可以出波形,但PWM频率完全不准。我今天找到了SysCtl_setClock函数的程序,在sysctl.c中,这个文件不在工程文件夹中,在c2000中,工程通过include将C:\ti\c2000\C2000Ware_3_04_00_00\driverlib\f28002x\driverlib都包含进去了,不知道为什么不行,请贵方提供点帮助,非常感谢!

  • 你是手动将cmd文件从ram.cmd更换为flash.cmd的吗?有没有试过编译的时候点击小锤子旁边的倒三角,在里面切换编译模式为CPU1_FLASH?

    你提到的那句代码是用来设置PLL锁相环和时钟分频,也就是用来设置芯片主频的,不应该注释掉。

  • 对,我是通过设置exclude from build手动将cmd从ram.cmd更改为flash.cmd,我用28335也都是这么用的,这个例程这样操作不行是么?那我在编译里模式改位CPU1_FLASH就可以了么?那句代码肯定是不应该注释掉的,那是我为了查明原因临时注释掉的。

  • 是的,你可以看一下项目属性中的Predefined Symbols,如果只是exclude/include from build的话Pre-define NAME中不会出现_FLASH,对应的程序中的这段代码就不会参与编译

    #ifdef _FLASH
    //
    // Copy time critical code and flash setup code to RAM. This includes the
    // following functions: InitFlash();
    //
    // The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols
    // are created by the linker. Refer to the device .cmd file.
    //
    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);

    //
    // Call Flash Initialization to setup flash waitstates. This function must
    // reside in RAM.
    //
    Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);
    #endif

    因为新例程大多会设置预编译,还有其他地方一些预编译的地方也是如此。

  • 谢谢您的回复,我按找您的说法操作,程序下进flash还是不能正常出波形。带着仿真器运行也没有波形,暂停则提示:no source available for" SysCtl_delay() at .........workspace_v10\epwm_ex2_updown_aq\CPU1_FLASH\epwm_ex2_updown_aq.out:{3} 0xc057{4}.

    请问我这是什么问题?

  • 你的意思是,通过切换编译方式的方法反而会造成ram和flash都无法运行的情况?

  • 谢谢你的回答。问题现象是,选择RAM方式,用不用仿真器都可以出波形,选择flash用不用仿真器都不行。发现在用flash单步调试,遇到SysCtl_delay()就走不动了,暂停就提示就是no source available for SysCtl_delay()..,我现在把程序中所有遇到SysCtl_delay()的地方全部注释掉,程序就可以写进flash了,也可以正常发出波形了。所以请教下,这个SysCtl_delay()的问题可能出现在哪里?

  • 你好,因为一般情况例程都是经过多次调试修改才发布的,所以不会有问题。我今天在我的TI开发板上也进行了这个例程的ram和flash烧写测试,测试结果也验证了这个例程是可以正常运行的,烧写、运行、退出仿真等等都没有出现你的问题。

    所以我这边建议

    1、你的C200WARE是否已经是最新版本4.01?如果不是的话可以尝试更新最新版本

    2、尝试一下其他例程(推荐是gpio_ex2_toggle.c例程,因为控制GPIO口翻转的最方便观测),如果其他例程也有类似的问题,那可能就是你的板子问题,比如晶振

    3、不知道你对例程是否做过修改?如果有的话把修改的地方说明一下

  • 1.我用的CCS10,最开始下的C2000 4.1版本用不了,现在用的3.4版本。2.我例程我确实改动过,但就是把中断注释掉了,然后把PWM模块的初始值改了,只发送固定的PWM波。

    // Interrupt_enable(INT_EPWM1);
    // Interrupt_enable(INT_EPWM2);
    // Interrupt_enable(INT_EPWM3);

    至于板子硬件问题,找了很久也没有发现哪里有问题,但至少晶振应该没问题吧,晶振有问题芯片不能工作吧

  • 是的,所以这边是建议先测一下其他例程能否正常运行,如果试下来其他例程运行正常,那可能是代码的问题了。