TMS320F28379D: ccs调试时加入断点导致数据出错

Part Number: TMS320F28379D

我打算用ecap模块来捕获方波的频率,并按照ecap_ex2_capture_pwm例程来修改了代码。在调试过程中我发现如果将断点打在某些位置会导致捕获到的数据出错,类似以下位置:

但如果将断点打在延时函数后,就不会产生错误。

这种情况不是第一次出现了,我之前在调试串口通信时发现如果断点打在串口发送函数之后,会导致发送的数据丢失最后两个比特。我很疑惑为什么会产生这种情况,对于串口,我认为是在中断时串口的发送缓冲区里的数据并未发出,所以会导致比特丢失。但对于ecap模块的这个情况,我理解不了错误产生的原因。

我的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "F28x_Project.h"
#include "driverlib.h"
#include "device.h"
#include "uart.h"
#include "user_ecap.h"
volatile uint32_t cap1Count2;
volatile uint32_t cap1Count3;
volatile uint32_t cap1Count4;
volatile uint32_t cap2Count2;
volatile uint32_t cap2Count3;
volatile uint32_t cap2Count4;
volatile uint16_t cap1_flag;
volatile uint16_t cap2_flag;
volatile uint16_t f1_flag;
volatile uint16_t f2_flag;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

希望能有大佬帮忙分析以下。

不胜感激!

  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好

    1.外围设备的实时特性: - ECAP 模块和 UART 都是独立于 CPU 运行的实时外设 -当你遇到一个断点, CPU 停止执行代码,但这些外设继续运行基于他们的仿真模式,如 eCAP 你可以保持 TSCTR 停止时断点, TSCTR 运行到0,或自由运行。

    -这可能导致与时间有关的问题和数据损坏

    2. UART 数据丢失:
    -对于 UART 来说,当你在串行发送函数之后遇到一个断点时,最后的位会丢失,因为:
    - CPU 在断点停止
    - UART 外设继续从其缓冲区传输数据
    -如果缓冲区在您到达断点时没有完全传输,剩余的数据可能会丢失或损坏
    -这对于最后的位尤其如此、因为它们可能尚未完全载入 UART 移位寄存器

    3. ECAP 模块问题:
    - ECAP 模块用于捕获事件的精确计时
    -当你遇到一个断点时:
    基于 eCAP 模块设置的仿真模式影响 TSCTR。 在默认情况下、如果 CPU 暂停、在到达断点时 TSCTR 将停止。
    这可能会导致 CPU 对 ECAP 事件的处理与实际捕获事件之间发生时序错位

    -捕获的数据可能会失效,因为 CPU 在断点停止时无法实时处理 ECAP 事件。

    4.调试的最佳做法:
    -对于 UART:
    -等待传输完成,然后再设置断点
    -使用状态标志确认传输完成
    -对于 ECAP:
    -尽量避免在活动捕获操作期间出现断点
    -考虑使用其他调试方法,如:
    -数据记录到内存

    -将仿真模式更改为自由运行,即使 CPU 已暂停
    -使用调试缓冲区
    -在捕获序列完成后设置断点