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.

[参考译文] TM4C1230E6PM:编程问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/836826/tm4c1230e6pm-programming-problem

器件型号:TM4C1230E6PM

你(们)好,先生

我们 使用 TM4C1230E6PM 满足 上述 问题,需要 您 的帮助 来检查 并  提供 一些 建议,tks!

该芯片遇到编程问题、即如何从启动代码跳转到应用层程序2000的地址、跳转代码是用 C 语言编写的、而不是汇编语言。 如何编写用 C 语言编写的跳转指令? 我们尝试在 Keil C 中使用通用 C 语言程序跳转指令、仿真将具有硬件错误中断。

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

    您好 Darren、

     我想您可以在 TivaWare 引导加载程序示例中使用此类代码。 boot_demo1示例是将跳回到引导加载程序的应用程序。 下面是 用于跳转至矢量表中0x2C 处的 SVC 矢量的代码。  

    void
    JumpToBootLoader (void)
    {
    //
    //我们必须确保在进入之前关闭 SysTick 及其中断
    //引导加载程序!
    //
    ROM_SysTickIntDisable();
    ROM_SysTickDisable();
    
    //
    //禁用所有处理器中断。 而不是禁用它们
    //一次一个,直接写入 NVIC 即可禁用所有功能
    //外设中断。
    //
    HWREG (NVIC_DIS0)= 0xffffffff;
    HWREG (NVIC_DIS1)= 0xffffffff;
    HWREG (NVIC_DIS2)= 0xffffffff;
    HWREG (NVIC_DIS3)= 0xffffffff;
    
    //
    //将控制权返回给引导加载程序。 这是对 SVC 的调用
    //引导加载程序中的处理程序。
    //
    (*(void (*)(void))(*(uint32_t *) 0x2C))();
    } 

    如果应用程序从0x2000开始、下面是跳转到应用程序的汇编代码

    //将矢量表设置为闪存中应用程序的开头。
    HWREG (NVIC_vtable)= ui32StartAddr;
    
    //从应用程序的矢量表加载栈指针。
    //
    __asm (" LDR r1、[r0]\n"
    " mov SP、R1");
    
    //从应用程序的矢量表加载初始 PC 并分支到
    //应用程序的入口点。
    //
    __asm (" LDR r0、[r0、#4]\n"
    " BX R0\n");