单片机/MCU论坛
直播中

余温重顾

10年用户 972经验值
擅长:可编程逻辑 嵌入式技术 EMC/EMI设计
私信 关注
[问答]

HighTec编译的HEX文件烧录进去开发板时,程序并没有在运行是怎么回事?

我目前正在使用DAvE2 + HighTec + Memtools等工具正在对TC1796的开发版进行测试,但我发现,HighTec编译的HEX文件烧录进去开发板时,程序并没有在运行,RST指示灯一直亮着(似乎空片的时候,它也是常亮的) 。
我仅仅使用了DAvE2生成的*.h和*.c文件,其他文件似乎也有用,但我不知道该如何使用,请问能指导我一下吗?

回帖(1)

小香干

2025-8-6 17:46:20

针对您在使用HighTec编译的HEX文件烧录到TC1796开发板时程序未运行、RST指示灯常亮的问题,以下是详细的排查和解决步骤:




1. 确认复位状态来源



  • RST灯常亮表示芯片处于复位状态(硬件或软件复位)。优先排查:

    • 硬件复位电路:检查复位按钮是否卡住、复位线路是否短路。

    • 电源稳定性:用万用表测量VDD电压(TC1796需3.3V±5%),若电压不稳或过低会触发复位。

    • 时钟信号:用示波器检查晶振引脚(如EXTCLK、OSCIN)是否起振(频率范围符合手册要求)。





2. 验证软件配置关键点


(1) 启动文件(Cstart)



  • 问题:HighTec需正确链接TC1796的启动文件(如cstartt.c),该文件初始化堆栈、RAM、时钟和中断向量表。

  • 解决

    1. 在HighTec工程中检查启动文件是否包含(路径通常为${HighTec_DIR}/tricore/cstart)。

    2. 确认启动代码调用了_START()函数(入口点)。

    3. cstartt.c中确保禁用了看门狗:
      // 禁用看门狗示例(通常位于_CoreInit()函数)
      #define WDT_PASSWORD 0xD0 // 解锁密码
      WDT_CON0 = WDT_PASSWORD | 0x8; // 设置WDTR=1(禁用看门狗)



(2) 链接器脚本(LSL)



  • 问题:HEX文件需匹配TC1796的Flash地址(程序起始地址为0xA00000000x80000000)。

  • 解决

    1. 检查HighTec工程的.lsl文件:

      • 确认memory段定义:
        memory mpu0 // TC1796的PFlash0
        {
        mau = 8;
        size = 2M;
        map (dest=bus:sri, dest_addr:0xA0000000, size:2M);
        }

      • 确认入口点指向复位向量:
        section_layout ::linear
        {
        group (ordered) ...
        {
          // 向量表位于0xA0000000
          "_RESET" (addr = 0xA0000000) // 复位向量
        }
        }


    2. 生成MAP文件检查_RESET地址是否正确。



(3) DAvE2配置同步



  • 问题:DAvE2生成的代码需在HighTec中被正确调用。

  • 解决

    • main()中显式调用DAvE初始化函数(通常为DAvE_Init()):
      #include "DAvE_Init.h" // 确保包含头文件
      int main(void) {
      DAvE_Init(); // 初始化时钟、外设
      while(1) { /* 主循环 */ }
      }

    • 检查DAvE配置:

      1. 在DAvE2中确认时钟树(PLL、分频器)设置符合硬件。

      2. 若使用外部晶振,检查OSC配置(启动模式、频率)。






3. MemTools烧录设置



  • 问题:烧录地址错误或校验失败。

  • 解决

    1. 在MemTools中选择正确设备:TC1796

    2. 设置HEX文件加载地址与LSL一致(如0xA0000000)。

    3. 烧录后执行校验(Verify),确保数据写入正确。

    4. 若使用JTAG,检查接口速率(降低JTAG速度测试)。





4. 调试技巧


(1) 最小化测试程序



  • 创建仅控制GPIO的测试程序(避开复杂外设):
    #include "IfxPort.h"
    int main(void) {
      // 配置P2.0为输出(假设LED连接此引脚)
      IfxPort_setPinModeOutput(&MODULE_P02, 0, IfxPort_OutputMode_pushPull);
      while(1) {
          IfxPort_togglePin(&MODULE_P02, 0); // 翻转LED
          delay(); // 简单延时
      }
    }

  • 通过LED闪烁确认程序是否运行。


(2) Lauterbach Trace32调试(如支持)



  • 连接调试器,检查:

    • PC寄存器:是否停在0xA0000000(复位向量)?

    • SP寄存器:是否从向量表正确加载?

    • 关键外设寄存器(如SCU_RSTSTAT)查看复位原因。





5. 其他可能原因



  • 看门狗复位

    • 若启动文件中未禁用看门狗,且主循环未喂狗,会导致复位。

    • 解决:在main()初始化时禁用看门狗:WDT_CON0.B.DR = 1;


  • 中断向量表未对齐:TC1796要求向量表地址对齐到1KB边界。

  • 启动模式引脚:检查TCX0、TCX1引脚的电平(决定启动源),需匹配DAvE配置。




操作流程总结



  1. 硬件检查:电源、复位电路、时钟信号。

  2. 最小程序测试:仅控制GPIO,排除复杂外设影响。

  3. 验证启动文件:检查cstartt.c是否禁用看门狗、初始化栈和时钟。

  4. 核对LSL脚本:确认Flash地址和入口点。

  5. 调用DAvE初始化:在main()中显式调用DAvE_Init()

  6. MemTools烧录设置:确保设备选型、加载地址正确。

  7. 调试器诊断:用Trace32检查PC、复位状态寄存器。


若仍无法解决,请提供:



  • 启动文件(cstartt.c)的关键部分。

  • 链接器脚本(.lsl)的内存布局。

  • 复位后SCU_RSTSTAT寄存器的值(通过调试器读取)。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分