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.

[参考译文] 编译器/TM4C123GH6PGE:USB_stick_更新示例不起作用

Guru**** 2460850 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/647188/compiler-tm4c123gh6pge-usb_stick_-update-example-not-working

器件型号:TM4C123GH6PGE
主题中讨论的其他器件:DK-TM4C123G

工具/软件:TI C/C++编译器

你好。

我无法更新到 USB 记忆棒。 !!

让我知道问题是什么。 ?

问题如下。

我使用 rvmdk (Keil 工具)作为我的开发环境。

(注) USB 记忆棒 FAT32格式。 、DK-EVB (DK-TM4C123G)

步骤1:将生成的 usb_stick_demo.bin 文件重命名为 FIRMWAREBIN.bin。

步骤2:复制根目录下的 USB 记忆棒存储器 FIRMWAREBIN.bin 文件。

步骤3:构建 USB_stick_update 示例以写入 DK-EVB。

步骤4:OLED 显示屏没有字母。

步骤5:将 USB 记忆棒内存连接至 USB OTG 连接器。

步骤6:按下 DK-EVB 上的选择按钮。

结果:3分钟后没有反应。

我尝试使用 Blake 指针分析源。

UpdateerUSB ()函数调用不会使用 USBHCDMain ()离开无限循环。

此致。

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

    Jame、您好!

     在步骤5之后、您是否第一次运行 USB_stick_update 程序?

     下面是我使用的步骤、它对我很有效。  

    步骤1:将生成的 usb_stick_demo.bin 文件重命名为 FIRMWAREBIN.bin。

    步骤2:复制根目录下的 USB 记忆棒存储器 FIRMWAREBIN.bin 文件。

    步骤3:构建 USB_stick_update 并将其加载到闪存中

    步骤4:运行 USB_stick_update 程序。 请注意、此时显示屏幕应该为空白。

    步骤5:插入 USB 内存

    步骤6. 复位器件。  在 CCS 中、转到 Run->Reset->System Reset

    步骤7:再次运行程序。

    运行步骤7后、您应该会看到显示内容如下的文本。

     您可以按 SELECT/WAKE 按钮、USB_STOP_DEMO 程序将调用更新程序来重新加载程序。

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

    你(们)好,查尔斯

    charls replay Q1>步骤5后、您是否第一次运行 USB_stick_update 程序?
               a1>是的、它是在 Step1之前完成的 USB_stick_update 程序 DK_EVB 写入。

    字符重播 Q2>步骤6。 复位器件。 在 CCS 中、转到 Run->Reset->System Reset
               a2>我不知道您对步骤6的含义。 ?
                  -步骤6的含义设置为在程序完成后自动重置 DK-EVB!
               (如果是我)
               在 rvmdk (Keil)中,目标选项->调试-> Stellaris ICD 设置->弹出窗口(Stellaris 调试接口 DLL)
               Falsh ->(v)程序、(v)验证、(v)重置并运行

    charls replay Q3>步骤7:再次运行程序。
               a3>再次将 USB_stick_update 程序写入 DK-EVB!!

    Q4>我不知道为什么要执行步骤6和步骤7。 ?
    此应用程序(USB_stick_update)解释了强制从记忆棒进行新固件更新。
    源代码(USB_stick_update)中也对此进行了介绍、称为"Press select button (按选择按钮)"。

    if (ROM_GPIOPinRead (GPIO_PORTM_BASE、GPIO_PIN_4)=0)

    UpdateerMain();


    (注意)
    感谢您努力解释拍摄的图像。
    "按选择按钮启动 USB 记忆棒更新程序"

    但是、这与仅将"USB_stick_demo"程序写入 DK-EVB 相同。

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jame、您好!
    步骤5后、firmware.bin 从 USB 记忆棒加载到从0x4800开始的闪存中。 此时、闪存将具有 USB_stick_update (从0x0开始)和 USB_stick_demo (从0x4800开始)。 我要求您执行步骤6以重置器件、以便 USB_stick_update 将再次重新运行、但在检测到已有应用程序映像时、它将跳转并运行 firmware.bin。 这就是为什么您将看到要求您按下选择按钮的显示屏。 如果按下选择按钮、则当前运行的 firmware.bin 应将控制传输回 USB_stick_update、以便 USB_stick_update 将再次重新加载 firmware.bin。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     你(们)好,查尔斯

    charls replay >我要求您执行步骤6重置设备,以便 USB_stick_update 将再次运行

    a1> 我不使用 CCS 工具。 但是、我了解了系统复位设置的含义

    Q1> 是这样吗?

    Q2>您是否未继续执行步骤7?

    在步骤7中、"USB_stick_update"通过 ICD 再次写入。    显示屏幕不变。

    charls replay > 、但在检测到已经存在应用程序映像时、它将跳转并运行 firmware.bin。

    Q3>文件名 FIRMWARE.bin -> FIRMWAREBIN.bin 是否出错?

    charls replay >  这就是为什么您会看到要求您按选择按钮的显示屏。

     a3>执行步骤7后、我了解到我可以在显示屏上看到按钮

       n 该状态下、如果您按下选择按钮、则意味着重写 USB_stick_update。

    Q4>程序方法是否有问题?

    步骤1:重命名 usb_stick_demo.bin -> FIRMWAREBIN.bin
    步骤2:复制根下的 USB 记忆棒存储器" FIRMWAREBIN"文件
    步骤3:“USB_stick_update”写入
    步骤4:显示屏幕空白
    步骤5:重新安装 USB 记忆棒内存
    步骤6:再次写入"USB_stick_update"

    步骤7:等待三分钟

    步骤8:按重置按钮,然后按设备(DK-EVB)

    -无显示"按选择按钮启动 USB 记忆棒更新程序"

    Q5>我已将其整理到存储器映射中。

        我理解是对的吗?

    [附加捕获图像]

    通过 ICD 1步写入" USB_stick_updata"
    通过 USB 记忆棒存储器两步写入" USB_stick_demo (FIRMWAREBIN.bin)

    此致。

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

     你(们)好,查尔斯

    USB_stick_Update 这是一个不起作用的审阅。

    USB 记忆棒是否仅使用德州仪器 USB?

    目前、USB 记忆棒已插入 SanDisk 供应商。

    因为以下日志消息。

    问题是什么?

    -我的想法太快了,我想知道这是否是初始化问题。

    我们应该如何解决这个问题?  

    此致。

    在" USB_host_msc "示例中、USB 记忆棒工作正常。

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

    Jame、您好!

     回复您在2017年12月5日晚上8:04的回复。

     首先、它是 firmware.bin、而不是 FIRMWAREBIN.bin。 如果您使用 FIRMWAREBIN.bin、它将不起作用。  

     您是否到达显示屏显示"Press the select button to start the USB stick updater"的位置? 如果您的答案是肯定的、则演示程序已加载到0x4800。 因此、如果您已经了解了这一点、这将被视为有效。

     请查看下面的代码。 演示代码现在将等待您按下选择按钮。 代码包含一些去抖逻辑、但一旦按下、最终会使用 SVC 调用语句(*(void (*)(void)(*(void)(*(uint32_t *) 0x2C))将控制权转移到 USB_demo_updateer;在将控制权转移到 USB_stick_updateer 之前、应该打印" USB 记忆棒正在等待更新程序"。 但您可能无法在屏幕上看到这一点、因为一切发生得太快。 一旦 USB_stick_updateer 开始运行、它将再次复制新的 firmware.bin、然后将重置器件。 重置设备后、您将无法在显示屏上看到该消息。

     BTW、您的矢量表是正确的。  

    while (1)
    {
    //
    //查看是否按下按钮。
    //
    if (ROM_GPIOPinRead (GPIO_PORTM_BASE、GPIO_PIN_4)=0)
    {
    //
    //自按下按钮以来递增计数。
    //
    ui32Count++;
    
    //
    //如果计数已达到4,则该按钮已被去除回弹
    //被按下。
    //
    if (ui32Count = 4)
    {
    中断;
    }
    }
    其他
    {
    //
    //重置计数,因为未按下按钮。
    //
    ui32Count = 0;
    }
    
    //
    //延迟约10ms。
    //
    SysCtlDelay (16000000 /(3 * 100));
    }
    
    //
    //等待选择按钮被释放~40ms (为了
    //对释放进行去抖)。
    //
    ui32Count = 0;
    while (1)
    {
    //
    //查看是否按下按钮。
    //
    if (ROM_GPIOPinRead (GPIO_PORTM_BASE、GPIO_PIN_4)!= 0)
    {
    //
    //自释放按钮以来递增计数。
    //
    ui32Count++;
    
    //
    //如果计数已达到4,则该按钮已被去除回弹
    //正在发布。
    //
    if (ui32Count = 4)
    {
    中断;
    }
    }
    其他
    {
    //
    //重置计数,因为已按下按钮。
    //
    ui32Count = 0;
    }
    
    //
    //延迟约10ms。
    //
    SysCtlDelay (16000000 /(3 * 100));
    }
    
    //
    //指示正在调用更新程序。
    //
    GrStringDrawCenter(&sContext,“USB 记忆棒”,-1,
    GrContextDpyWidthGet (&sContext)/ 2、20、true);
    GrStringDrawCenter(&sContext,"updater is Now",-1,
    GrContextDpyWidthGet (&sContext)/ 2、30、true);
    GrStringDrawCenter(&sContext,“正在等待 A",-1,
    GrContextDpyWidthGet (&sContext)/ 2、40、true);
    GrStringDrawCenter(&sContext,"USB stick.",-1,
    GrContextDpyWidthGet (&sContext)/ 2、50、true);
    
    
    //
    //刷新任何缓存的绘图操作。
    //
    格林图(&S);
    
    //
    //调用更新程序,以便它搜索记忆棒上的更新。
    //
    (*(void (*)(void))(*(uint32_t *) 0x2C))();
    
    //
    //更新程序应进行控制,因此永远不应达到此目的。
    //以防万一,永远循环。
    //
    while (1)
    {
    } 

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

    你(们)好,查尔斯

    我对 文件的名称总共必须是11个字符、基本名称8个字符、扩展名3个字符感到困惑。

    #define USB_update_filename "FIRMWAREBIN"

    ui32FileSize = SimpleFsOpen (USB_update_filename);

    文件名与固件正确配合使用。 谢谢你。

    Q1> BTW 是什么意思?

    Q2>我想将其应用于当前应用。

        我尝试将 USB_stick_demo 更改为 Hello 示例。

        我在源代码中添加了以下内容

         "(*(void (*)(void))(*(uint32_t *) 0x2C)));" // SVCall

        但它不起作用。 (Hello.bin -> firmware.bin)

        我应该如何应用它?

    此致。

    //
    //
    //打印"Hello World!" 显示。
    ////
    *****************
    int
    main (void)
    {
    tContext sContext;
    tRectangle sRect;
    
    //
    //为中断处理程序启用怠惰堆栈。 这允许使用浮点
    //在中断处理程序中使用的指令,但代价是
    //额外的堆栈用法。
    //
    ROM_FPULazyStackingEnable();
    
    //
    //将时钟设置为直接从晶体运行。
    //
    ROM_SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz |
    SYSCTL_OSC_MAIN);
    
    //
    //初始化 UART。
    //
    ConfigureUART();
    
    UARTprintf ("Hello、world!\n");
    
    //
    //初始化显示驱动程序。
    //
    CFAL96x64x16Init();
    
    //
    //初始化图形上下文。
    //
    GrContextInit (&sContext、&g_sCFAL96x64x16);
    
    //
    //用蓝色填充屏幕的前24行以创建横幅。
    //
    sRect.i16XMin = 0;
    sRect.i16YMin = 0;
    sRect.i16XMax = GrContextDpyWidthGet (&sContext)- 1;
    sRect.i16YMax = 23;
    GrContextForegroundSet (&sContext、ClrDarkBlue);
    GrRectFill (&sContext、&sRect);
    
    //
    //在横幅周围放置一个白色框。
    //
    GrContextForegroundSet (&sContext、ClrWhite);
    GrRectDraw (&sContext,&sRect);
    
    //
    //将应用程序名称放在横幅中间。
    //
    GrContextFontSet (&sContext、g_psFontCm12);
    GrStringDrawCenter(&sContext,“hello”,-1,
    GrContextDpyWidthGet (&sContext)/ 2、10、0);
    
    //
    //使用 Computer Modern 40 Point 字体打招呼。
    //
    GrContextFontSet (&sContext、g_psFontCm12/*g_psFontFixed6X8*/);
    GrStringDrawCenter(&sContext,"Hello World!",-1,
    GrContextDpyWidthGet (&sContext)/ 2、
    (((GrContextDpyHeightGet (&sContext)- 24)/ 2)+ 24、
    0);
    
    //
    //刷新任何缓存的绘图操作。
    //
    格林图(&S);
    
    //
    //调用更新程序,以便它搜索记忆棒上的更新。
    //
    (*(void (*)(void))(*(uint32_t *) 0x2C))();
    
    
    //
    //我们已完成。 四处闲逛、什么也不做。
    //
    while (1)
    {
    }
    } 

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

    [引用 user="Jame shin"] Q1> BTW 是什么意思?

    BTW 是"顺便"的缩写。

    [引用 user="Jame shin"]

    Q2>我想将其应用于当前应用。

        我尝试将 USB_stick_demo 更改为 Hello 示例。

        我在源代码中添加了以下内容

         "(*(void (*)(void))(*(uint32_t *) 0x2C)));" // SVCall

        但它不起作用。 (Hello.bin -> firmware.bin)

        我应该如何应用它?

    [/报价]

    正如我在上一篇文章中解释的那样,所有事情都发生得非常快,只要调用 SVC (*(void (*)(void)(*(uint32_t *) 0x2C)))(),更新程序就会重置器件并开始下载新的 firmware.bin。 当重置发生时、您将无法在屏幕上看到"Hell World"。

    在呼叫 SVC 之前、我稍微修改了您的代码、并在显示屏上看到"Hello World"。

    GrStringDrawCenter(&sContext,"Hello World!",-1,
    GrContextDpyWidthGet (&sContext)/ 2、
    (((GrContextDpyHeightGet (&sContext)- 24)/ 2)+ 24、
    0);
    
    int i=0;
    对于(i=0;i<10000000;i++); 

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

    你(们)好,查尔斯

    我将显示 Hello World、并在代码中添加延迟 for 语句

    因此、从一开始"USB_stick_update"就已经过审核。

    有三个 if 条件语句。

    1.应用程序启动堆栈指针或 PC 无效、因此强制更新。
    2.检查应用程序是否已请求更新
    3.检查按钮是否按下,如果按下,则强制更新。

    (注意)在每个初始步骤中擦除所有新存储器。

    对于 ME、请在 rvmdk (Keil) Options for Target -> Debug ->中
    Stellaris ICD 设置-> Falsh ->(v)程序,(v)验证,()重置并运行

    Q1> 0xFFFF.FFFF、因为所有闪存内容都已被擦除。

        因此 、输入 SP + PC Point Check Routin

        调用 UpdateerMain ()函数

         但是、它不会显示。 为什么?

    Q2> 对#ifedf #endif 应用1条件并对正常运行应用3条件。 为什么?

         步骤1:重命名 usb_stick_demo.bin -> FIRMWARE.bin
         步骤2:“USB_stick_update”写入
         步骤3:继续按下器件中的步骤3-1“复位+选择”按钮(DK-EVB)
              步骤3-2. 重置未按下
              步骤3-3. 选择不按下

        调用 UpdateerMain ()函数

    它将正确显示为附加的图像。

    main (void)
    {
    uint32_t * pui32App;
    
    //初始化 UART。
    //
    ConfigureUART();
    
    //UARTprintf ("更新 wating\n");
    
    //
    //查看第一个位置是0xffffffffff 还是不是这样的位置
    //看起来像堆栈指针,或者第二个位置是0xffffffff 或
    //看起来不像复位矢量的内容。
    //
    pui32App =(uint32_t *) app_start_address;
    UARTprintf ("app_start_address:0x%x \n"、pui32App);
    #if 0
    if ((pui32App[0]= 0xffffffff)||
    ((pui32App[0]& 0xFF00000)!= 0x20000000)||
    (pui32App[1]=0xffffffff)||
    ((pui32App[1]和0xfff00001)!= 0x00000001))
    {
    //
    //应用程序启动堆栈指针或 PC 无效,因此强制更新。
    //
    UARTprintf ("SP PC Check \n");
    UpdateerMain();
    }
    
    #endif
    
    
    UARTprintf ("force_update_ADDR:0x%x \n"、(Int32_t *) force_update_ADDR);
    UARTprintf (" force_update_value 0x%x \n"、HWREG (force_update_ADDR));
    //
    //检查应用程序是否已请求更新
    //
    
    if (HWREG (FORCE_UPDATE_ADDR)== FORCE_UPDATE_VALUE)
    {
    UARTprintf ("App req 更新\n");
    HWREG (FORCE_UPDATE_ADDR)= 0;
    UpdateerMain();
    }
    
    
    //
    //启用用户按钮的 GPIO 输入。
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);
    ROM_GPIODirModeSet (GPIO_PORTM_BASE、GPIO_PIN_4、GPIO_DIR_MODE_IN);
    MAP_GPIOPadConfigSet (GPIO_PORTM_BASE、GPIO_PIN_4、GPIO_Strength _2mA、
    GPIO_PIN_TYPE_STD_WPU);
    //UARTprintf ("密钥 boutton Init\n");
    
    //
    //检查是否按下按钮,如果按下,则强制更新。
    //
    if (ROM_GPIOPinRead (GPIO_PORTM_BASE、GPIO_PIN_4)=0)
    {
    UARTprintf ("更新选择按钮检测\n");
    UpdateerMain();
    }
    
    //
    //如果我们到达这里,这意味着没有应该出现的任何情况
    //原因更新为 true。 因此、调用应用程序。
    //
    UARTprintf ("CallApplication (0x4800)\n");
    CallApplication (APP_START_ADDRESS);
    
    } 

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

    [引用 user="Jame shin"]

    (注意)在每个初始步骤中擦除所有新存储器。

    对于 ME、请在 rvmdk (Keil) Options for Target -> Debug ->中
    Stellaris ICD 设置-> Falsh ->(v)程序,(v)验证,()重置并运行

    Q1> 0xFFFF.FFFF、因为所有闪存内容都已被擦除。

        因此 、输入 SP + PC Point Check Routin

        调用 UpdateerMain ()函数

         但是、它不会显示。 为什么?

    [/报价]

    我认为我不理解您的问题。 USB_stick_updateer 将检查 SP/PC 是否对"应用程序"有效。 如果 SP/PC 无效、则更新程序将强制更新。 在我看来、当您说"所有新存储器在每个初始步骤都会被擦除"时、您会说您擦除闪存。 如果您擦除闪存、那么您也擦除了 USB_stick_updateer 程序。 请说明擦除闪存时您尝试执行的操作。 如果擦除闪存、则需要首先重新加载 USB_stick_updateer。

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

    你(们)好,查尔斯

    我将简明扼要地加以说明。

     - Eraser Fresh 是初始化的原因。

    在 Q1的情况下)

    1.我先擦除新鲜的。 然后将 USB_stick_update 写入 DK-EVB。

    2. SP/PC 无效,则更新程序将强制更新。

    我们将调用 UpdateerMain ()函数。

       结果、则不会显示该结果。

    在 Q2的情况下)

    1.在源代码中插入#if 0 ~#endif、  构建它。

    #if 0

       if ((pui32App[0]= 0xffffffff)||
       ((pui32App[0]& 0xFF00000)!= 0x20000000)||
       (pui32App[1]=0xffffffff)||
       ((pui32App[1]和0xfff00001)!= 0x00000001))
       {
       //应用程序启动堆栈指针或 PC 无效,因此强制更新。

       UpdateerMain();
       }

    #endif

    2.我先擦除新鲜的。 然后将 USB_stick_update 写入 DK-EVB。

    3.同时按下"RESET + SELECT"(复位+选择)按钮以释放 RESET (复位)按钮。

    4.所以,我们将调用 UpdateerMain ()函数。

      结果、将显示消息。

    Q1和 Q2是相同的、为什么会有差异?  

    此致。

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

    [引用 user="Jame shin"]

    在 Q1的情况下)

    1.我先擦除新鲜的。 然后将 USB_stick_update 写入 DK-EVB。

    2. SP/PC 无效,则更新程序将强制更新。

    我们将调用 UpdateerMain ()函数。

       结果、则不会显示该结果。

    [/报价]

    未显示什么内容? 您能更具体吗? 您预计会显示什么文本? 如果您使用文本"Press the select button to start the USB stick updater"询问 LCD 显示屏、则这是 USB_stick_demo 应用程序的一部分、而不是 USB_stick_update 程序。 USB_stick_update 不会在 LCD 显示屏上打印任何内容。 一旦 USB_stick_update 运行且您插入了根目录上固件.bin 的 USB 闪存驱动器、它将启动下载操作。  下载完成后、如果您重置器件。 如果您再次运行、 显示屏上将显示"Press the select button to start the USB stick updater"(按选择按钮启动 USB 记忆棒更新程序)。 我想您已经开始了。

    [引用 user="Jame shin"]

    #if 0

       if ((pui32App[0]= 0xffffffff)||
       ((pui32App[0]& 0xFF00000)!= 0x20000000)||
       (pui32App[1]=0xffffffff)||
       ((pui32App[1]和0xfff00001)!= 0x00000001))
       {
       //应用程序启动堆栈指针或 PC 无效,因此强制更新。

       UpdateerMain();
       }

    #endif

    2.我先擦除新鲜的。 然后将 USB_stick_update 写入 DK-EVB。

    3.同时按下"RESET + SELECT"(复位+选择)按钮以释放 RESET (复位)按钮。

    [/报价]

    在这里、您将根据 SP/PC 检查强制执行更新。 您正在通过按 SELECT 强制更新。 这样,USB_stick_demo 将调用 UpdateMain()并再次进行更新。 那么、您要证明什么呢?  我对你想说的内容感到很损失。  

    请恢复到原始 USB_stick_update 和 USB_stick_demo、然后重试。 只需针对以下情形给出"是"或"否"答案即可。

     1.加载原始 USB_stick_update

     2.使用从 usb_stick_demo.bin 重命名的 firmware.bin 插入 USB_stick_demo

     3.运行 USB_stick_update

     成功后、器件将复位。 在 CCS 中、我看到 PC (程序计数器)在 ResetISR 处停止。 我不知道 Keil。 您需要查阅 Keil 支持、了解如何在器件复位时在复位矢量处停止 CPU。 如果 Keil 采用这种配置、它可能只需再次从复位矢量运行程序。 但是、如果是这种情况、它将跳转至 USB_stick_demo 应用、在该应用中、您应该会在 显示屏上看到"Press the select button to start the USB stick updater"。

     5.再次运行设备。 这次 USB_stck_update 将知道已经有一个从0x4800开始的有效应用程序、只需跳转到该应用程序即可。

     6.当应用程序运行时, 您会在 LCD 显示屏上看到"Press the select button to start the USB stick updater"(按选择按钮启动 USB 记忆棒更新程序)。

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

    你(们)好,查尔斯

    最后 、我要做的是将测试结果保存到 USB 测试文件中

    DK-EVB 板在  主机模式下的 USB 中创建文件 test.txt

    test.txt 文件的内容如下。

    1、SN:00001正常
    2、SN:00002正常
    SN:00003 NG

    我的问题、 如何实现源代码

    可以帮帮我吗?

    此致。

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

    Jame、您好!

     感谢您的问候。 圣诞节快乐!

     请使用 USB_host_msc 示例参考对笔驱动器的读取/写入。  

     您可能会发现这两篇文章也很有用。

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

    你(们)好,查尔斯

    出现两个链路错误。

    1、FF_convert

    ff_wtoumper

    我找不到驱动器文件来解决此问题。

    请告诉我如何解决该问题。 ?

    此致。