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.

[参考译文] CCS/EK-TM4C1294XL:boot_demo1、带 UART 中断处理程序函数 aren'未按预期工作

Guru**** 2482105 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/708779/ccs-ek-tm4c1294xl-boot_demo1-with-uart-interrupt-handler-function-aren-t-working-as-expected

器件型号:EK-TM4C1294XL

工具/软件:Code Composer Studio


我已克隆"boot_demo"示例并进行了以下更改:
1.删除了 SW1按钮的用法
2.添加了 UART 中断处理程序、用于接收和响应来自 UART 的命令
3.添加了 LED 闪烁

目的是使程序闪烁并等待 UART 命令并执行这些命令。 以下是我要支持的主要命令:
1. LED 闪烁
2. LED 闪烁关闭
3.进入引导加载程序模式

我测试这种情况的方法是、在通过 USB 连接对"boot_serial"示例进行编程后、立即使用 LM Flasher 将我的"boot_demo"编程到地址0x4000。

我有以下问题:
为了使原始 boot_demo1适用于我、我必须更改"boot_demo_ccs.cmd"并具有以下内容:
      #define APP_BASE 0x00004000
      闪存(RX):origin = app_BASE,length = 0x000fc000
   而不是以下行:
      #define APP_BASE 0x00000000
      闪存(RX):origin = APP_BASE,length = 0x00100000

但是、通过使用前两行、UART 中断处理程序和 LED 闪烁不起作用- LED 不闪烁、UART 命令不被处理。
通过使用后两行、它们都可以正常工作、但由 UART 命令"boot"触发的引导加载程序代码不起作用(对"JumpToBootLoader"函数的调用)、并且我无法在该命令后上载 bin。

请参阅下面的 UART 中断处理程序函数-使 UART 侦听器和引导加载工作的正确方法是什么?

----
空 UARTIntHandler (空)

   uint32_t ui32Status;
   ui32Status = ROM_UARTIntStatus (UART0_BASE、TRUE);
   ROM_UARTIntClear (UART0_BASE、ui32Status);
   字符 b[5];
   int i = 0;

   while (ROM_UARTCharsAvail (UART0_BASE))
   {
       B[i]= ROM_UARTCharGetNonBlocking (UART0_BASE);
       i++;
   }
    if (strstr (b、"boot"))
   {
       CHAR*响应="确定";
       UARTSend (响应、strlen (响应));
       JumpToBootLoader();
   }
   否则(strstr (b、"blinkon"))
   {
       shouldBlink = true;
       CHAR*响应="确定";
       UARTSend (响应、strlen (响应));
   }
   否则(strstr (b、"blinkoff")
   {
       shouldBlink = false;
       GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);
       CHAR*响应="确定";
       UARTSend (响应、strlen (响应));
   }
   其他
   {
       CHAR*响应="确定";
       UARTSend (响应、strlen (响应));
   }

----
   

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

    您好!

    boot_demo1的 cmd 文件不应从0x0开始。 出厂的 boot_demo1示例应从0x00004000开始。 当然、您可以更改 APP_BASE 地址。 boot_serial 是需要驻留在0x0的引导加载程序。

    请参考以下 cmd 文件。  请注意.vtable 段分配、该分配应将矢量表重新映射到0x20000000。

    /*********
    *
    * boot_demo_ccs.cmd - boot_dem1的 CCS 链接器配置文件。
    *
    *版权所有(c) 2015-2017 Texas Instruments Incorporated。 保留所有权利。
    *软件许可协议
    *
    **德州仪器(TI)提供此软件仅供
    *仅供 TI 的微控制器产品使用。 该软件归
    * TI 和/或其供应商所有、受适用的版权
    *法律保护。 您不能将此软件与"病毒"开源
    *软件结合使用、以形成更大的程序。
    *
    *此软件按"原样"提供、且存在所有缺陷。
    *任何明示、默示或法定的保证、包括但
    不限于对适销性和适用性
    *特定用途的默示保证均不适用于本软件。 在任何
    *情况
    下、TI 都不应对因任何原因造成的特殊、意外或必然*损害负责。
    *
    *这是 EK-TM4C1294XL 固件包版本2.1.4.178的一部分。
    *
    * /--retain=g_pfnVectors
    
    
    
    /*以下命令行选项作为 CCS 项目的一部分进行设置。 */
    /*如果您使用命令行进行构建,或者出于某种原因想要在
    此处定义*/*,则可以根据需要取消注释并修改这些行。 */
    /*如果您使用 CCS 进行编译、最好
    在 CCS 工程中进行任何此类*///*修改并将此文件单独保留。 */
    * //
    /*--heap_size=0 */
    *--stack_size=256 /*
    --library=rtsv7M3_T_le_eabi.lib */
    
    *应用程序的起始地址。 通常,中断向量*/
    /*必须位于应用程序的开头。 //
    #define APP_BASE 0x00004000
    #define RAM_BASE 0x20000000
    
    //系统内存映射*/
    
    MEMORY
    {
    /*存储在内部闪存中并从内部闪存执行的应用程序*/
    闪存(RX):origin = app_BASE,length = 0x000fc000
    /*应用程序使用内部 RAM 进行数据*/
    SRAM (rwx):origin = 0x20000000,length = 0x00040000
    }//
    
    内存
    
    中的段分配*/ SECTIONS
    {
    .intvecs:> app_base
    .text:> FLASH
    .const:> FLASH
    .cinit:>闪存
    .pinit:> FLASH
    init_array:> FLASH
    
    .vtable:> RAM_base
    .data :> SRAM
    .bss:> SRAM
    .sysmem:> SRAM
    .stack:> SRAM
    }
    
    __stack_top =__stack + 1024; 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、谢谢、我发现了这个问题、我使用了一个串行写入器来保存 COM 端口(我用来发送"boot"命令的应用程序)、这就是 UART 配置失败的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您的问题得到解决。