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.

28035芯片关于delay_us()函数复制到RAM后,使用COMPA控制PWM占空比失效的问题

Other Parts Discussed in Thread: UCD3138, C2000WARE

由于使用了F28035_CLA_C.CMD,发现在InitAdc()函数总是的跳至ILLEGAL_ISR,经试验后也发现DELAY_US(ADC_usDELAY);的问题。于是在我的程序中按照 此链接 https://e2echina.ti.com/question_answer/microcontrollers/c2000/f/56/t/19710 中提示:

1.首先在DSP2803x_Examples.h文件中开始部分加入以下一条语句

#pragma CODE_SECTION(DSP28x_usDelay, "ramfuncs");

2.然后再main里面再加以下语句

memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize);

InitFlash();

最终不再进入ILLEGAL_ISR中。但是新的问题是,我的COMPA无法再控制PWM占空比,其输出始终是一个很小占空比。我的EPWM1配置如下:

EPWM1配置如上。希望Ti的工程师能够帮助我解决这个问题,非常感谢

  • 这是main函数中的配置

  • 你好,首先在flash中使用delay_us函数确实需要复制到ram中运行,否则会进入非法中断,详细做法你也可以参考这个帖子,帖子中可以用memcpy代替:

    https://e2echina.ti.com/question_answer/microcontrollers/c2000/f/56/t/185635

    关于CAMPA失效的问题,能否在运行中查看一下寄存器的值是否有更新?

    另外,我看到程序CLA是被注销的?如果不使用CLA的话建议可以换成普通的cmd文件。

  • 感谢您的解答。我现在就是参照的那个帖子,进行CLA相关配置的了。但是我CLA使用上又碰到了另外几个问题,希望您有空的时候能够帮我解答一下。

    1.我现在没有像您给的链接那样,特定地把某个函数搬移到Flash中去。我直接将memcpy放在MAIN函数中,像这种没有特别地指定要搬移的函数或者变量时,程序运行时会将MAIN中所有程序都搬移过去吗?还是应该怎么理解呢。

    2.我在使用CLA配置的程序读取ADC结果寄存器的值时,发现我用到的ADC结果寄存器始终存在着(50个点左右的偏差,即没有上电,理论值为0时),但是将没有CLA的程序下载进去再进行采样时,偏差则下降到10个点左右。虽然芯片才计算时,可以人为地去除这个偏差,再进行计算,但还是想搞清楚这是什么原因导致的,有没有办法能够解决呢?

    3.关于CLA支持的库文件的使用,比如我想在配置好的CLA文件上运行支持的库时,是不是只需要将这些库在工程属性中包含进去(如下图),再在文件中将对应的头文件包含,就可以使用库内对应的函数了?还是需要别的操作呢? I would appreciate your patience。Thangks a lot!

    Best wishs.

  • 另外再请教一个问题,当才c2000系列芯片意外锁死时(下载不进去程序了),有没有办法能够解锁呢?(我知道UCD3138系列时有的),如果有的话,还请分享一下方法和教程。万分感谢

  • 1、

    user5997033 说:
    没有特别地指定要搬移的函数或者变量

    是指没有定义CODE_SECTION吗?

    user5997033 说:
    memcpy放在MAIN函数中
    memcpy函数本身就是要放到main函数中去的。

    2、有没有用例程测试一下是否有上述问题?C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f2803x\examples\c28\cla_adc

    3、你看下build - link order中是否有包含这个库,如果有的话就可以了,没有的话还要在link order中添加以下。不过你这个.a文件是自己写的库吗?

    4、意外被锁,如果不知道密码的话是没办法解锁的,只能考虑更换板子。

  • 再次感谢您的答复。现接着之前的几个疑问和您讨论下。

    1. 是的,我现在的操作将memcpy函数放在MAIN函数中,但是没有像下图那样,没有特别地为某个函数定义CODE_SECTION。但是我的MAIN.C文件中除了有MAIN函数外,还有一些中断函数(比如ADC中断、PWM中断这些)。像我这样只在MAIN中执行了memcpy函数,那就是MAIN中所有语句都搬移到RAM中去了吗?这里应该怎么理解呢。

    2.ADC采样出现偏差这个,我后面再用您说的例程测试一下先。

    3.任何库的使用(比如IQMATH、数字电源库之类),都是只需要在build - link order中添加就可以了吗?头文件包含之类的基础操作应该还是要的吧。。这个libc.a文件我也不知道是哪里来的。。。会不会是例程自带的呢?因为我的程序是在例程的基础上改过来的。

    在此感谢您的耐心解答,谢谢。

    Best wishs.

  • 1、#pragma CODE_SECTION的作用是将括号内的中断函数关联到指定的SECTION “ramfuncs”中,如果你没有指定的话我认为是没有搬运的。
    3、build - link order中添加,也要在工程属性中包含进去(你图片中的做法)。
  • 客气了,祝你后期调试顺利。
  • Green 您好,我调试中又遇到一些芯片工作不正常的问题,在此向您请教一下。我先简单介绍一下我的配置的:

    1.使用EPWM2触发CLA中task2执行控制算法,同时EPWM2触发ADC中断2,执行中断程序,由于我想判断算法是否算的过来,故使用task2中算法执行中第一句执行EPwm2Regs.AQCSFRC.bit.CSFB = 0x2,在task2中算法执行中倒数第二句执行EPwm2Regs.AQCSFRC.bit.CSFB = 0x1强制将PWM拉低,然后观测EPWM2B的电平信号,结果芯片跑起来后,EPWM2B的电平始终是高;若将拉低语句放在前面,芯片跑起来后,EPWM2B的电平始终是低,即在CLA中感觉就会执行开始的语句,后面的拉高或者置低都不会执行(尽管我已经将大部分控制算法注释掉)。

    2.类似地,我在ADC_ISR中作同样的操作,这个时候却发现EPWM2B的电平能够出现方波了,但是其出现的频率并不是固定的(方波信号周期一会儿是PWM周期,一会又是2倍的PWM周期),理论上应该是每个PWM都触发一次,那这个电平信号应该是周期和PWM一致,具有一定的占空比的方波。

    出现这个现象,那就说明了我的ADC中断工作都不正常,并不像我配置的那样工作,类似地所以我现在怀疑CLA程序触发机制也同样不正常。所以我现在还是怀疑是我CLA的配置上哪里出现问题,使得其工作不正常,不知您有没有什么好的建议和方法帮我排查一下呢?或者说这个可能什么原因导致的呢?(PS,现在用的芯片内部时钟)

    这里我再附上我的CLA配置截图

    希望您有空的时候能能帮助我提点建议,非常感谢!