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.

[参考译文] TMS320F28379D:复位时 ISR 非法

Guru**** 2343770 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1479817/tms320f28379d-illegal-isr-upon-reset

器件型号:TMS320F28379D

工具与软件:

尊敬的专家:

我正在尝试将 RAM 中的 ADC_ISR 代码从闪存中复制、以获得更高的速度。 为了执行此操作,我 在 main ()中添加了"#define _flash",以将 InitFlash ()包含在 InitSysCtrl ()中。

然后、在 ADC_ISR 之前添加"#pragma CODE_SECTION (ADC_EOC、"ramfuncs")"。 在调试过程中、我只是根据链接器文件检查 ADC_ISR 是否已加载到指定地址中、并且是否在预期中找到该地址、您可以在第一个映像中看到它! 它从0x8000开始、这是 LS0RAM 的 strat 地址。 一旦运行被按下、一切看起来都很完美-根据模拟信号采集模拟信号和角蛋白并由 ePWM1触发 ADC。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "F28x_Project.h"
#include <math.h>
#include <stdio.h>
#define _FLASH
extern void InitSysCtrl(void);
extern void InitPieCtrl(void);
extern void InitPieVectTable(void);
#define TWO_PI 6.283185307179586476925286766559
interrupt void ADCs_EOC(void);
void Initialize_GPIO(void);
void Custom_Init(void);
void PWM1_Init(void);
void Init_ADCs(void);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

e2e.ti.com/.../5123.blink.zip

下图显示了 ADCIER、它从0x8000开始。

在微控制器复位之前、一切看起来都是正常的! 我希望它能继续发挥预期的功能(ePWM、获取模拟、PWM 三角 ADC)、但它停止了这种做法、最后得到 ILLEGAL_ISR!

我怀疑内存、 发现代码与前一个视图不同。 我不知道这是否是罪魁祸首、但只是分享意见。

请帮助我解决这个问题。

此致、

Rajesh。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rajesh:

    我正在 NMI 专家中循环查看您的问题。

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的  Delaney:

    我还有另一个与 CLA 相关的问题、如果你不介意、请查看这个范围。

    TMS320F28379D:无法触发 CLA - C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛

    此致、

    Rajesh。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rajesh:

    您是否能够单步执行代码并将其范围缩小到触发 ITRAP 的位置?

    是否确定设备已重置? 您是否知道它是因为 ITRAP ?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、普拉坦:

    是、器件在复位时进入非法子例程(按下 launchpad 按钮)。

    我不确定是否是 ITRAP 使计算机进入非法 ISR。 我能看到的是、按下复位后、CPU 会指向地址0x082064、该地址对应于 ILLEGAL_ISR、调试模式退出运行模式。 按下 RUN 时、cCPU 在没有 PWM 和 ADC 运行的情况下运行!

    此致、

    Rajesh。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rajesh:

    你想达到什么目的?

    如果您的目标是触发 Xrsn (器件复位)并开始运行应用程序、请检查该应用程序是否在闪存中编程、以及引导模式是否设置为闪存引导模式。 可以使用引导模式引脚将引导模式设置为闪存引导模式、请查看参考手册以了解更多详细信息。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Prarthan、您好!

    我认为这里存在一些混淆。

    在本线程的最初帖子中、我提到过目标是从闪存中复制 RAM 中的一段程序(ADC ISR)、以实现更好的延迟。

    引导模式引脚配置为制造商提供的默认位置、我认为它位于与闪存相对应的位置;

    如前所述、当 ISR 未复制到 RAM 时、运行过程将不会出现毛刺脉冲(省略"# pragma code section (rammfunc)"行)

    我希望我能更好地解释这一目标。 我在原始帖子中分享了该项目、供您参考。

    此致、

    Rajesh。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rajesh:

    请参阅注释 https://www.ti.com/lit/an/spra958l/spra958l.pdf

    我没有看到从闪存到 RAM 的 ADC ISR 的运行时副本。 您能否参考上面的应用手册并为此添加 memcpy 函数。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Prarthan:

    "#define _FLASH"是在调用 InitSysCtrl()时用于合并闪存相关初始化的程序顶部定义的。 不管怎样、我也尝试根据您的建议使用 memcpy 运行。 但是、我看不到任何改善。

    此致、

    Rajesh。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我只是换了一行 #pragma CODE_SECTION (ADC_EOC、"ramfuncs") 或者会与  #pragma CODE_SECTION (ADCS_EOC、".TI.ramfunc")  现在运转正常。

    但是、我看到了几个 ITRAP0 存储器行的地址   ADC_ISR   复制。  

    下面是反汇编代码:

    这是 main.c

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include "F28x_Project.h"
    #include <math.h>
    #include <stdio.h>
    #define _FLASH
    extern void InitSysCtrl(void);
    extern void InitPieCtrl(void);
    extern void InitPieVectTable(void);
    extern void InitFlash(void);
    extern void SeizeFlashPump(void);
    extern unsigned int RamfuncsLoadStart;
    extern unsigned int RamfuncsLoadEnd;
    extern unsigned int RamfuncsRunStart;
    #define TWO_PI 6.283185307179586476925286766559
    interrupt void ADCs_EOC(void);
    interrupt void TimerOvf(void);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    那么、ITRAP0行在程序正常中是否有?

    此致、

    Rajesh。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    否、 这是不正常的。

    ITRAP0行要在程序正常

    我尝试使用最新的 main()运行您的项目、它运行良好。

    即使在复位后、反汇编代码也没有问题。

    谢谢