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.

[参考译文] EK-TM4C1294XL:如何使用以太网将代码刷写到 EK-TM4C1294XL (launchpad)、以实现以太网固件升级功能?

Guru**** 2466550 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/659316/ek-tm4c1294xl-how-to-flash-code-to-an-ek-tm4c1294xl-launchpad-using-ethernet-for-ethernet-firmware-upgrade-functionality

器件型号:EK-TM4C1294XL

您好!

我尝试使用引导 EMAC 闪存示例将代码闪存到 TM4C1294 Launchpad、然后使用以太网闪存代码。

我使用了与 enet)lwip 示例相同的 lwipts 文件、并在引导加载程序示例中使用了静态 IP。

我已经通过在示例代码中的 lwipinit 函数中输入断点来检查分配给电路板的静态 IP 是否实际。 但是,当我现在尝试使用以太网刷写应用程序时,我收到一个错误,“启动 BOOTP 服务器时出现问题”。

我出了什么问题?

此致、

奥 poorv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Apoorv:
    如果您更改为 DHCP、它是否起作用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,查尔斯

    感谢您的快速回复。

    我尝试托管 DHCP 服务器、但没有为引导 EMAC 闪存示例程序的电路板分配 IP。 相反、当我尝试在 lwipopts.h 和 lwipinit 函数中以相同的更改运行 enet_lwip 示例时、DHCP 服务器会为电路板分配一个 IP 地址。
    这就是我切换到静态 IP 的原因。

    此致、
    奥 poorv
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Apoorv:
    引导加载程序代码必须小且高效。 因此、它没有获取 IP 地址的 DHCP 客户端实现。 相反,它具有非常基本的 BOOTP (较旧版本的 DHCP)实现,它只能接收 BOOTP 数据包。

    我先前向您提出的一个问题是、您是否使用 DHCP 来处理它、这是基于您的声明、即您将为静态地址配置的 lwiputs 文件集成到 boot_emac_flash 示例中。 如果您为六氯环己烷配置了活性环己烷,会怎样? boot_emac_flash 本身不进行任何修改、不会向 DHCP 服务器发送 DHCP 发现/请求数据包。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我是否需要使用某些软件(Windows 10的任何实用程序)在笔记本电脑上运行 BOOTP 服务器?

    我粘贴了我使用过的 lwipopts.h 代码。 我还可以调试哪个文件来查看 BOOTP 数据包? 另外,如何知道已分配了哪个 IP?  

    //
    //
    // lwipopts.h - lwIP 的配置文件
    //
    //版权所有(c) 2013-2017 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //德州仪器(TI)提供此软件仅供
    和//仅供 TI 的微控制器产品使用。 软件归
    // TI 和/或其供应商所有,并受适用的版权
    //法律保护。 您不能将此软件与"病毒"开源
    //软件组合在一起以形成更大的程序。
    //
    //此软件按“原样”提供,且存在所有故障。
    //对于
    
    本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
    //情况下、TI 不对任何
    原因造成的特殊、意外或必然//损害负责。
    //
    //这是 EK-TM4C1294XL 固件包版本2.1.4.178的一部分。
    ////
    *****************
    //
    //注:此文件源自 lwIP/src/include/lwip/opt.h
    //头文件。
    //
    //有关其他详细信息,请参阅原始的"opt.h"文件和 lwIP
    //文档。
    ////
    *****************
    
    #ifndef __LWIPOPTS_H__
    #define __LWIPOPTS_H__
    
    //*********
    ////
    --- Stellaris / lwIP 端口选项---
    ////
    *****************
    #define HOST_TMR_INTERVAL 100 //默认值为0
    //#define DHCP_EXPIRE_TIMER_ms (60 * 1000)
    //#define LWIP_HTTPD_SSI 1
    //#define LWIP_HTTPD_CGI 1
    #define LWIP_HTTPD_DYNAL_HEADers 1
    //#define HTTPD_DEBUG LWIP_DBG_ON
    #IF!已定义(EMAC_PHY_IS _EXT_MII)&&!已定义(EMAC_PHY_IS _EXT_RMII)
    #define EMAC_PHY_CONFIG (EMAC_PHY_TYPE_INTERNAL | EMAC_PHY_INT_MDIX_EN | \
    EMAC_PHY_AN_100B_T_FULL_DUPLEX)
    #define PHY_PHY_ADDR 0
    #endif
    #if defined (EMAC_PHY_IS _EXT_MII)
    #define EMAC_PHY_CONFIG EMAC_PHY_TYPE_EXTERNAL_MII
    #define PHY_PHY_ADDR 1
    #endif
    已定义(EMAC_PHY_IS _EXT_RMII)
    #define EMAC_PHY_CONFIG EMAC_PHY_TYPE_EXTERNAL_RMII
    #define PHY_PHY_ADDR 1
    #endif
    #define NUM_TX_descriptors 24
    #define NUM_RX_descriptors 8
    
    //*********
    ////
    --- 平台特定锁定---
    ////
    *****************
    #define SYS_Lighting_PROT 1 //默认为0
    #define NO_SYS 1 //默认为0
    //#define memcpy (dst、src、len) memcpy (dst、src、len)
    //#define SMEMCPY (dst、src、len) memcpy (dst、src、len)
    
    //*************
    ////
    --- 内存选项--------------------------------------------------------
    ////
    *****************
    //#define MEM_libc_malloc 0
    #define MEM_alignment 4
    #define MEM_SIZE (64 * 1024)
    //#define MEMP_OVERFLOAD_CHECK 0
    //#define MEMP_sanity_check 0
    //#define MEM_USE_Pools 0
    //#define MEMP_USE_CUSTOM_Pools 0
    
    //*****************
    ////
    --- 内部内存池大小--------------------------------------------------------
    ////
    *****************
    #define MEMP_NUM_PBUF 48 //默认16
    //#define MEMP_NUM_RAW_PCB 4
    //#define MEMP_NUM_UDP_PCB 4
    #define MEMP_NUM_tcp_PCB 16 //默认5
    //#define MEMP_NUM_tcp_PCV_Listen 8
    //#define MEMP_NUM_tcp_SEG 16
    //#define MEMP_NUM_REASSDATA 5
    //#define MEMP_NUM_ARP_queue 30
    //#define MEMP_NUM_IGMP_GROUP 8
    #define MEMP_NUM_SYS_TIMEOUT 8
    //#define MEMP_NUM_NETBUF 2
    //#define MEMP_NUM_NETCONN 4
    //#define MEMP_NUM_TCPIP_MSG_API 8
    //#define MEMP_NUM_TCPIP_MSG_INPKT 8
    #define PBUF_POOL_SIZE 48 //默认16
    
    //*********
    ////
    --- ARP 选项---
    ////
    *****************
    //#define LWIP_ARP 1
    //#define ARP_TABLE _SIZE 10
    //#define ARP_Queuing 1
    //#define ETHARP_trust_IP_MAC 1
    
    /*************
    ////
    --- IP 选项--------
    ////
    *****************
    //#define IP_Forward 0
    //#define IP_OPTIONS 允许 1
    #define IP_re组装 0 //默认为1
    #define IP_Frag 0 //默认为1
    //#define IP_REASS_maxage 3
    //#define IP_REASS_MAX_PBUFS 10
    //#define IP_FRAG_USS_STATUS_BUF 1
    //#define IP_FRAG_MAX_MTU 1500
    //#define IP_DEFAULT_TTL 255
    
    //*********
    ////
    --- ICMP 选项---
    ////
    *****************
    //#define LWIP_ICMP 1
    //#define ICMP_TTL (IP_DEFAULT_TTL)
    
    //*********
    ////
    --- 原始选项---
    ////
    *****************
    //#define LWIP_RAW 1
    //#define RAW_TTL (IP_DEFAULT_TTL)
    
    //*********
    ////
    --- DHCP 选项--------------------------------------------------------
    ////
    *****************
    #define LWIP_DHCP 1 //默认值为0
    //#define DHCP_do_ARP_CHECK ((LWIP_DHCP)&&(LWIP_ARP)
    
    //*************
    ////
    --- UPnP 选项---
    ////
    *****************
    //#define LWIP_UPnP 0
    
    //*****************
    ////
    --- PTPD 选项---
    ////
    *****************
    //#define LWIP_PTPD 0
    
    //*****************
    ////
    --- AutoIP 选项---
    ////
    *****************
    #define LWIP_AUTOIP 1 //默认为0
    #define LWIP_DHCP_AUTOIP_COOP ((LWIP_DHCP)&&(LWIP_AUTOIP)
    //默认为0
    #define LWIP_DHCP_AUTOIP_COOP_TESes 5. //默认值为9
    
    //*********
    ////
    --- SNMP 选项--------
    ////
    *****************
    //#define LWIP_SNMP 0
    //#define SNMP_ANOND_Requests 1
    //#define SNMP_TRAP_Destinations 1
    //#define SNMP_PRIVE_MIB 0
    //#define SNMP_SAFE_Requests 1
    
    /*************
    ////
    --- IGMP 选项--------------------------------------------------------
    ////
    *****************
    //#define LWIP_IGMP 0
    
    //*****************
    ////
    --- DNS 选项--------------------------------------------------------
    ////
    *****************
    //#define LWIP_DNS 0
    //#define DNS_TABLE 大小 4
    //#define DNS_MAX_NAME_LENGTH 256
    //#define DNS_MAX_SERVERS 2
    //#define DNS_Does_name_check 1
    //#define DNS_USS_STATUS_BUF 1
    //#define DNS_MSG_SIZE 512
    
    //*********
    ////
    --- UDP 选项---
    ////
    *****************
    //#define LWIP_UDP 1
    //#define LWIP_UDPLITE 0
    //#define UDP_TTL (IP_DEFAULT_TTL)
    
    //*********
    ////
    --- TCP 选项---------
    ////
    *****************
    #define LWIP_TCP 1
    //#define tcp_TTL (IP_DEFAULT_TTL)
    #define tcp_WND 4096 //默认值为2048
    //#define tcp_MAXTX 12
    //#define tcp_SYNMAXRTX 6
    //#define tcp_queue_OOSEQ 1
    #define tcp_mss 1500 //默认为128
    //#define tcp_calculate_EFF_send_MSS 1
    #define tcp_snd_BUF (4 * tcp_mss)
    //默认为256,为6 *
    //#define tcp_snd_QUEUELEN (4 *(tcp_snd_BUF/tcp_MSS)//#define
    tcp_snmOWAT (tcp_snd_BUF/2)
    //#define tcp_listen_backlog 0
    //#define tcp_default_listen_backlog 0xFF
    
    //*********
    ////
    --- API 选项---
    ////
    *****************
    //#define LWIP_EVENT_API 0
    //#define LWIP_callback_API 1
    
    /*************
    ////
    --- Pbuf 选项---
    ////
    *****************
    #define PBUF_LINK_HLEN 16. //默认为14
    #define PBUF_POOL_BUFSIZE 512
    // PBUF_POOL_BUFSIZE 默认值为
    // LWIP_MEM_ALIGN_SIZE (tcp_MSS+40+PBUF_LINK_HLEN)
    #define ETH_PAD_SIZE 0 //默认值为0
    
    //*************
    ////
    --- 网络接口选项---------
    ////
    *****************
    //#define LWIP_NETIF_HOSTNAME 0
    //#define LWIP_NETIF_API 0
    //#define LWIP_NETIF_STATUS_CALLACK 0
    //#define LWIP_NETIF_LINK_REACLK 0
    //#define LWIP_NETIF_HWADDRHINT 0
    
    //*****************
    ////
    --- LOOPIF 选项---
    ////
    *****************
    //#define LWIP_HASE_LOOPIF 0
    //#define LWIP_LOOPIF_MULTITIPE 1
    
    /*************
    ////
    --- 线程选项--------------------------------------------------------
    ////
    *****************
    //#define TCPIP_thread_name "TCPIP_thread"
    //#define TCPIP_thread_STACKSIZE 0
    //#define TCPIP_thread_PRIO 1
    //#define TCPIP_MBOX_SIZE 0
    //#define SLIPIF_thread_name "slipif_loop"
    //#define SLIPIF_thread_STACKSIZE 0
    //#define SLIPIF_thread_PRIO 1
    //#define ppp_thread_name "pppMain"
    //#define PPP_thread_STACKSIZE 0
    //#define PPP_thread_PRIO 1
    //#define DEFAULT_THREAD_NAME "lwIP"
    //#define DEFAULT_THREAD_STACKSIZE 0
    //#define DEFAULT_THREAD_PRIO 1
    //#define DEFAULT_RAW_RECVMBOX_SIZE 0
    //#define DEFAULT_UDP_RECVMBOX_SIZE 0
    //#define DEFAULT_tcp_RECVMBOX_SIZE 0
    //#define DEFAULT_ACCEPPTMBOX_SIZE 0
    
    //*****************
    ////
    --- 顺序图层选项---
    ////
    *****************
    //#define LWIP_TCPIP_CORE_LOCK_LOCING 0
    #define LWIP_NETCONN 0 //默认值为1
    
    //*********
    ////
    --- 套接字选项---
    ////
    *****************
    #define LWIP_SOCKET 0 //默认为1
    //#define LWIP_COMPAT_Sockets 1
    //#define LWIP_POSIX_Sockets _IO_Names 1
    //#define LWIP_tcp_keepalive 0
    //#define LWIP_SO_RCVTIMEO 0
    //#define LWIP_SO_RCVBUF 0
    //#define SO_reuse 0
    
    //*****************
    ////
    --- 统计选项---
    ////
    *****************
    //#define LWIP_STATS 1
    //#define LWIP_STATS_DISPLAY 0
    //#define LINK_STATS 1
    //#define ETHARP_STATS (LWIP_ARP)
    //#define IP_STATS 1
    //#define IPFRAG_STATS (IP_RELEGECTING|| IP_FRAG)
    //#define ICMP_STATS 1
    //#define IGMP_STATS (LWIP_IGMP)
    //#define UDP_STATS (LWIP_UDP)
    //#define tcp_stats (LWIP_TCP)
    //#define MEM_STATS 1
    //#define MEMP_STATS 1
    //#define SYS_STATS 1
    
    /*************
    ////
    --- PPP 选项--------------------------------------------------------
    ////
    *****************
    //#define ppp_support 0
    //#define PPPoE_support 0
    //#define PPPOS_support ppp_support
    
    #if ppp_support
    //#define NUM_PPP 1
    //#define PAP_SUPPT助 0
    //#define CHAP_support 0
    //#define MSCHAP_support 0
    //#define CBCP_support 0
    //#define CCP_support 0
    //#define VJ_support 0
    //#define MD5_support 0
    //#define FSM_DEFTIMEOUT 6
    //#define FSM_DEFMAXTERMREQS 2
    //#define FSM_DEFMAXCONFREQS 10
    //#define FSM_DEFMAXNAKLOOPS 5
    //#define UPAP_DEFTIMEOUT 6
    //#define UPAP_DEFREQTIME 30
    //#define CHAP_DEFTIMEOUT 6
    //#define CHAP_DEFTRANSMITS 10
    //#define LCP_ECHOINTERVAL 0
    //#define LCP_MAXCHOFAILS 3
    //#define PPP_MAXIDLEFLAG 100
    
    //#define PPP_MAXMTU 1500
    //#define PPP_DEFMRU 296
    #endif
    
    //*********
    ////
    --- 校验和选项----------------------------------------------------
    ////
    *****************
    #define CHECKSUM_GEN_IP 0
    #define CHECKSUM_GEN_ICMP 0
    #define CHECKSUM_GEN_UDP 0
    #define CHECKSUM_GEN_TCP 0
    #define CHECKSUM_CHECK_IP 0
    #define CHECKSUM_CHECK_UDP 0
    #define CHECKSUM_CHECK_TCP 0
    
    //*****************
    ////
    --- 调试选项---
    ////
    *****************
    #if 0
    #define U8_F "c"
    #define S8_F "c"
    #define X8_F "x"
    #define U16_F "u"
    #define S16_F
    "x"
    #define U32_F "u"
    #define S32_F "d"
    #define X32_F "x"#define X16_F "x"#define UARTx_F "x"
    #define U32_F "x"x"、#define UARTn_F
    #define UARTx_F #define UARTn_F #define UARTn_F #define #define UARTn_
    
    
    LWIP_DBG_LEVEL_OFF
    #define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF
    //#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING
    //#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEARGD/#define
    LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE
    
    //#define LWIP_DBG_Types_on LWIP_DBG_ON
    #define LWIP_DBG_Types_on (LWIP_DBG_ON|LWIP_DBG_TRACE| \
    LWIP_DBG_State|LWIP_DBG_FRESH)
    
    //#define ETHARP_DEBUG LWIP_DBG_ON //默认为 off
    //#define NETIF_DEBUG LWIP_DBG_ON //默认为 off
    //#define PBUF_DEBUG LWIP_DBG_OFF
    //#define API_LIB_DEBUG LWIP_DBG_OFF
    //#define API_MSG_DEBUG LWIP_DBG_OFF
    //#define SOCKETS_DEBUG LWIP_DBG_OFF
    //#define ICMP_DEBUG LWIP_DBG_OFF
    //#define IGMP_DEBUG LWIP_DBG_OFF
    //#define iNet_debug LWIP_DBG_OFF
    //#define IP_DEBUG LWIP_DBG_ON //默认为 off
    //#define IP_REASS_DEBUG LWIP_DBG_OFF
    //#define RAW_DEBUG LWIP_DBG_OFF
    //#define MEM_DEBUG LWIP_DBG_OFF
    //#define MEMP_DEBUG LWIP_DBG_OFF
    //#define SYS_DEBUG LWIP_DBG_OFF
    //#define tcp_debug LWIP_DBG_OFF
    //#define tcp_input_debug LWIP_DBG_OFF
    //#define tcp_FR_DEBUG LWIP_DBG_OFF
    //#define tcp_RTO 调试 LWIP_DBG_OFF
    //#define tcp_CWND_DEBUG LWIP_DBG_OFF
    //#define tcp_WND_DEBUG LWIP_DBG_OFF
    //#define tcp_output_debug LWIP_DBG_OFF
    //#define tcp_RST_DEBUG LWIP_DBG_OFF
    //#define tcp_QLEN_DEBUG LWIP_DBG_OFF
    //#define UDP_DEBUG LWIP_DBG_ON //默认为 off
    //#define TCPIP_DEBUG LWIP_DBG_OFF
    //#define PPP_DEBUG LWIP_DBG_OFF
    //#define SLIT_DEBUG LWIP_DBG_OFF
    //#define DHCP_DEBUG LWIP_DBG_ON //默认为 off
    //#define AUTOIP_DEBUG LWIP_DBG_OFF
    //#define SNMP_MSG_DEBUG LWIP_DBG_OFF
    //#define SNMP_MIB_DEBUG LWIP_DBG_OFF
    //#define DNS_DEBUG LWIP_DBG_OFF
    
    #endif /*__LWIPOPTS_H__*/
    

    同样在 main 中、代码应停留在 while (!g_bFirmwareUpdate)循环中、直到 LM 闪存编程器发送魔术包、但在1或2次之后、代码停留在 0xfffffffe 位置。 这种异常行为的原因是什么?

    //
    //
    //// boot_demo_emac_flash.c -引导加载程序以太网演示。
    //
    //版权所有(c) 2008-2017 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //德州仪器(TI)提供此软件仅供
    和//仅供 TI 的微控制器产品使用。 软件归
    // TI 和/或其供应商所有,并受适用的版权
    //法律保护。 您不能将此软件与"病毒"开源
    //软件组合在一起以形成更大的程序。
    //
    //此软件按“原样”提供,且存在所有故障。
    //对于
    
    本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
    //情况下、TI 不对任何
    原因造成的特殊、意外或必然//损害负责。
    //
    //这是 EK-TM4C1294XL 固件包版本2.1.4.178的一部分。
    ////
    *****************
    
    #include 
    #include 
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_NVIC.h"
    #include "inc/hw_sysctl.h"
    #include "driverlib/interrupt.h"
    
    #include "driverlib/flash.h"
    #include "driverlib/driver.h"
    
    
    
    #include "driverlib.utils/driver.h
    
    
    
    
    
    //
    //! \addtogroup example_list
    //! 

    引导加载程序以太网演示(BOOT_DEMO_EMAC_FLASH)

    //! //! 一个示例、演示了如何使用// ! 基于闪存的以太网引导加载程序。 此应用程序配置以太网 //! 控制器并获取显示在屏幕 上的 IP 地址//! 以及电路板的 MAC 地址。 它``m侦听"层数据包"// ! 告诉 IT 部门正在提出固件升级请求、以及在这个 //! 接收到数据包、将控制权转移到引导加载程序以执行 //! 升级。 //! //! 此应用旨在与基于闪存的以太网引导 //! 加载程序(BOOT_EMAC)。 //! //! 此应用程序的链接地址设置为0x4000、链接地址 //! 必须是闪存擦除块大小的倍数(16KB=0x4000)。 //! 您可以将此地址更改为比最后 一个地址高16KB 的边界//! 引导加载程序二进制文件占用的地址、只要您还重建 //! 修改 bl_config.h 文件以设置 //! 将 APP_START_ADDRESS 设置为相同的值。 //! //! BOOT_DEMO_FLASH 应用程序可与此应用程序一同用于 //! 轻松演示引导加载程序实际上正在更新片上 //! 闪存。 //// ***************** // // //每秒的 SysTick 节拍数。 //// ***************** #define TICKS_PER_second 100 //********* // //用于指示是否 已收到远程固件更新请求的全局标志//。 //// ***************** 静态易失性 bool g_BFirmwareUpdate = false; //********* // //缓冲区用于保存电路板的以太网 MAC 和 IP 地址。 //// ***************** #define Size_MAC_ADDR_buffer 32 #define Size_IP_ADDR_buffer 32 char g_pcMACAddr[size_MAC_ADDR_buffer]; char g_pcIPAddr[size_IP_ADDR_buffer]; //********* // //我们用来更新系统时钟频率的全局 // ********* 易失性 uint32_t g_ui32SysClockFreq; //********* // //当前 IP 地址。 //// ***************** uint32_t g_ui32IPAddress; //********* // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *dpcFilename、uint32_t ui32Line) { #endif //********* // //这是该 SysTick 中断的处理程序。 我们使用此选项为 lwIP 堆栈提供//所需的计时器调用。 //// ***************** void SysTickIntHandler (void) { // //调用 lwIP 计时器。 // lwIPTimer (1000 / tick _per_sond); } //********* // //初始化 UART0并设置适当的通信参数。 //// ***************** void SetupForUART (void) { // //我们需要确保 UART0及其关联的 GPIO 端口为 //在我们将控制权传递给引导加载程序之前启用。 串行引导 //加载程序不会为我们启用或配置这些外设 //通过其 SVC 矢量输入它。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //将 GPIO PA0和 PA1设置为 UART。 // ROM_GPIOPinConfigure (GPIO_PA0_U0RX); ROM_GPIOPinConfigure (GPIO_PA1_U0TX); ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //将 UART 配置为115200、n、8、1 // ROM_UARTConfigSetExpClk (UART0_BASE、g_ui32SysClockFreq、115200、 (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | UART_CONFIG_WLEN_8)); // //启用 UART 操作。 // ROM_UARTEnable (UART0_BASE); } //************* // //每当远程 //主机请求更新此板上的固件时,软件更新模块就会调用此函数。 我们设置了一个标志 、//将使主循环退出并将控制传输到引导加载程序。 // //重要: //请注意,此回调是在中断上下文中进行的,由于 不允许//从中断中将控制权转移到引导加载程序, //我们不能只在此处调用 SoftwareUpdateBegin()。 //// ***************** void SoftwareUpdateRequestCallback(void){ G_bFirmwareUpdate = true; } //********* // //执行启动以太网控制器 //和 lwIP 堆栈所需的初始化步骤。 //// ***************** void SetupForEthernet (void) { uint32_t ui32User0、ui32User1; uint8_t pui8MACAddr[6]; // //为100Hz 中断配置 SysTick。 // ROM_SysTickPeriodSet (g_ui32SysClockFreq / ticks_per_sond); ROM_SysTickEnable(); ROM_SysTickIntEnable(); // //从 NV RAM 中的 UART0和 UART1寄存器获取 MAC 地址。 // ROM_FlashUserGet (&ui32User0、&ui32User1); // //将24/24拆分 MAC 地址从 NV ram 转换为 MAC 地址 //数组。 // pui8MACAddr[0]= ui32User0 & 0xff; pui8MACAddr[1]=(ui32User0 >> 8)& 0xff; pui8MACAddr[2]=(ui32User0 >> 16)& 0xff; pui8MACAddr[3]= ui32User1 & 0xff; pui8MACAddr[4]=(ui32User1 >> 8)& 0xff; pui8MACAddr[5]=(ui32User1 >> 16)& 0xff; // //将此地址格式化为相关小工具使用的字符串。 // usnprintf (g_pcMACAddr、size_MAC_ADDR_buffer、 "MAC:%02x-%02x-%02x-%02x-%02x-%02x-%02x"、 pui8MACAddr[0]、pui8MACAddr[1]、pui8MACAddr[2]、pui8MACAddr[3]、 pui8MACAddr[4]、pui8MACAddr[5]); // //请记住,我们还没有 IP 地址。 // usnprintf (g_pcIPAddr、size_ip_ADDR_buffer、"IP:未分配"); // //初始化 lwIP TCP/IP 堆栈。 // lwIPInit (g_ui32SysClockFreq、pui8MACAddr、0、0、0、0、 ipaddr_use_dhcp); // lwIPInit (g_ui32SysClockFreq、pui8MACAddr 、// (192u<24)|(168u<16)|(1U<8)| 125u、 // (255u<24)|(255u<16)|(255u<8)| 0、 // (192u<24)|(168u<16)|(1U<8)| 1、 // ipaddr_use_static); // //启动远程软件更新模块。 // SoftwareUpdateInit (SoftwareUpdateRequestCallback); } //********* // // lwIP 库支持任何与主机相关的计时器函数所需的//。 //// ***************** void lwIPHostTimerHandler (void) { uint32_t ui32NewIPAddress; // //获取当前 IP 地址。 // ui32NewIPAddress = lwIPLocalIPAddrGet (); // //查看 IP 地址是否已更改。 // if (ui32NewIPAddress!= g_ui32IPAddress) { // //查看是否分配了 IP 地址。 // if (ui32NewIPAddress == 0xffffffff) { // //表示没有链接。 // // UARTprintf ("正在等待链接。\n"); } 否则、如果(ui32NewIPAddress =0) { // //没有 IP 地址,因此请指明 DHCP 进程是什么 //正在运行。 // // UARTprintf ("正在等待 IP 地址。\n"); } 其他 { // //显示新的 IP 地址。 // // UARTprintf ("IP 地址:"); // DisplayIPAddress (ui32NewIPAddress); // UARTprintf ("\n 打开浏览器并输入 IP 地址。\n"); } // //保存新的 IP 地址。 // G_ui32IPAddress = ui32NewIPAddress; } // //如果没有 IP 地址。 // if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff)) { // //不执行任何操作并继续等待。 // } } //********* // //启用 USB 控制器 // //********* void SetupForUSB (void) { // // USB 引导加载程序负责所有必需的 USB 初始化、 //如果应用本身不需要使用 USB 控制器,我们 //实际上不需要在此处启用它。 所规定的唯一要求 // USB 引导加载程序是系统时钟从 PLL 运行 //输入引导加载程序时。 // } //********* //// 演示引导加载程序使用的简单应用程序, // ************* int main (void) { // //为中断处理程序启用怠惰堆栈。 这允许使用浮点 //在中断处理程序中使用的指令,但代价是 //额外的堆栈用法。 // ROM_FPULazyStackingEnable(); // //将系统时钟设置为从 PLL 以120MHz 运行 // G_ui32SysClockFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); // //初始化每个引导加载程序类型的外设 //支持。 因为该示例旨在与任何一起使用 //启动加载程序,我们不知道实际使用的是什么,我们涵盖了所有内容 //此处为串行、以太网和 USB 使用进行基址和初始化。 // // SetupForUART(); SetupForEthernet(); // SetupForUSB(); // //将端口 N 引脚1配置为输出。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPION); while (!(SysCtlPeripheralReady (SYSCTL_Periph_GPION))); GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1); // //如果未按下开关 SW1,则 LED D1以1Hz 的速率闪烁 //在开关 SW 上按探测退出闪烁程序并跳转到 //闪存引导加载程序。 // while (!g_bFirmwareUpdate) { GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0x0); SysCtlDelay (g_ui32SysClockFreq / 6); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、GPIO_PIN_1); SysCtlDelay (g_ui32SysClockFreq / 6); } // //在通过控件之前,确保 LED 已关闭。 // GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0x0); // //将控制权传递给配置了电路板的引导加载程序的任何类型 //带有。 // SoftwareUpdateBegin (g_ui32SysClockFreq); // //以前的函数永远不会返回,但我们需要在返回中继续 //此处的代码可防止编译器生成警告。 // 返回(0); }

    我还看到了位置0x0和 0x4的内容,它们都是0xFFFFFFFF 和内存位置0x01000000和0x01000004,在引导加载代码执行后都包含有效地址(它们包含指向新 SP 和 RESET 的指针)。

     

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

    尊敬的 Apoorv:

     运行 LM Flash Programmer 的 PC 可以充当 BootP 服务器。 请注意、BootP 的 MAC 和 IP 地址关联是静态完成 的、这意味着您需要手动输入它们。 与 DHCP 不同、DHCP 在一段时间内将 IP 地址动态地租用给客户端。 那么、您如何知道哪个 IP 地址与您的 MCU 的 MAC 地址相关联? 这就是为什么在运行 boot_emac_flash 之前、您需要运行另一个 TivaWare 以太网示例、例如 enet_lwip。 enet_lwip 示例使用 DHCP 服务器。 DHCP 提供 IP 地址后、IP 地址将被租用一段时间。 在 IP 地址过期之前、您可以重复使用相同的 IP 地址与 BootP 服务器的 MCU MAC 地址相关联。 请参阅下图、其中输入通过在 LaunchPad 上运行 enet_lwip 获得的 IP 地址和 MAC 地址。

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

    您好、Charles、

    感谢您的回复。

    示例程序 BOOT_EMAC_FLASH 和 BOOT_DEMO_EMAC_FLASH 之间有何区别? (1个示例使用 UIP 而其他示例使用 lwip 的唯一区别是吗?)

    我完全按照你的建议做了。

     我获得了由 DHCP 服务器为 enet_lwip 示例分配的 IP 192.168.1.1。

    然后、我在 LM 闪存编程器实用程序中配置了相同的 IP 和 MAC 地址。 然后,我尝试对两个示例程序 bin 映像(boot_emac_flash 和 boot_demo_emac_flash)进行编程,但在这两种情况下,LM Flash Programmer 出现相同的错误:启动 BOOTP 服务器时出现问题。 我在这里出了什么问题?

    此致、

    奥 poorv  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BOOT_EMAC_FLASH 是引导加载程序。 boot_demo_emac_flash 是应用程序。 您必须首先使用 JTAG 接口将 boot_emac_flash 加载到 MCU 中。 加载后、您将运行 boot_emac_flash、以便发出 BootP 请求。 同时、您配置 LM 闪存编程器(同时充当 BootP 服务器和 TFTF 服务器)、以通过以太网接口传输应用程序 boot_demo_emac_flash。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    感谢您的回复。

    实际上,我已转移到串行引导加载程序(示例程序 boot_serial),然后刷写了我在进行一些更改后成功设计的应用程序。 代码成功运行(在硬件复位和刷写新代码时)、但有时会卡在内存位置0xfffffffe 上。

    此外,一旦我在新修改 的.cmd 文件中遇到错误:程序将不能放入可用内存中。 这是我为 cmd 文件编写的代码

    /*********
    *
    *德州仪器 TM4C129ENCPDT 的默认链接器命令文件
    *
    这是从 TivaWare 库的修订版15071衍生出来的。
    *
    * /
    
    --retain=g_pfnVectors
    
    内存
    {
    闪存(RX):origin = 0x00004000,length = 0x00100000
    SRAM (rwx):origin = 0x20000000,length = 0x00040000
    }//
    
    以下命令行选项是作为 CCS 项目的一部分设置的。 */
    /*如果您使用命令行进行构建,或者出于某种原因想要在
    此处定义*/*,则可以根据需要取消注释并修改这些行。 */
    /*如果您使用 CCS 进行编译、最好
    在 CCS 工程中进行任何此类*///*修改并将此文件单独保留。 */
    * //
    /*--heap_size=0 */
    *--stack_size=256 /*
    --library=rtsv7M4_T_le_eabi.lib
    
    内存中的*//*段分配*/
    
    段
    {
    .intvecs:> 0x00004000
    .text:> FLASH
    .const:> FLASH
    .cinit:>闪存
    .pinit:> FLASH
    init_array:> FLASH
    
    .vtable:>0x20000000
    .data :> SRAM
    .bss:> SRAM
    .sysmem:> SRAM
    .stack:> SRAM
    }
    
    __stack_top =__stack + 512; 





    此外、引导加载程序链接器文件代码:
    /*********
    *
    * bl_link_ccs.cmd -引导加载程序的 CCS 链接器配置文件。
    *
    *版权所有(c) 2009-2017 Texas Instruments Incorporated。 保留所有权利。
    *软件许可协议
    *
    **德州仪器(TI)提供此软件仅供
    *仅供 TI 的微控制器产品使用。 该软件归
    * TI 和/或其供应商所有、受适用的版权
    *法律保护。 您不能将此软件与"病毒"开源
    *软件结合使用、以形成更大的程序。
    *
    *此软件按"原样"提供、且存在所有缺陷。
    *任何明示、默示或法定的保证、包括但
    不限于对适销性和适用性
    *特定用途的默示保证均不适用于本软件。 在任何
    *情况
    下、TI 都不应对因任何原因造成的特殊、意外或必然*损害负责。
    *
    *这是 Tiva 固件开发包版本2.1.4.178的一部分。
    *
    * /--retain=Vectors
    
    
    
    /*以下命令行选项作为 CCS 项目的一部分进行设置。 */
    /*如果您使用命令行进行构建,或者出于某种原因想要在
    此处定义*/*,则可以根据需要取消注释并修改这些行。 */
    /*如果您使用 CCS 进行编译、最好
    在 CCS 工程中进行任何此类*///*修改并将此文件单独保留。 */
    * //
    /*--heap_size=0 */
    *--stack_size=256 /*
    --library=rtsv7M3_T_le_eabi.lib /*
    
    系统内存映射*/
    
    内存
    {
    闪存(RX):origin = 0x00000000,length = 0x00010000
    SRAM (rwx):origin = 0x20000000,length = 0x00010000
    }/*
    
    在内存中的段分配*/
    
    SECTIONS
    {
    组
    {
    .intvecs
    .text
    .const
    .data
    } load = flash、run = 0x20000000、load_start (init_load)、run_start (init_run)、size (init_size)
    
    组
    {
    .bss
    .stack
    } run = SRAM、run_start (bss_run)、run_end (bss_end)、size (bss_size)、run_end (__stack_top)
    
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Apoorv:
    在应用程序的 cmd 中、长度等于0x100000。 请记住、您的应用程序从0x4000开始、因此您的应用程序可用的闪存空间应为0x100000 - 0x4000、即0x000FC000。 将长度更改为0x000FC000、然后查看该长度是否可以解决问题。

    存储器

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

    您好!

    我尝试过这种方法、但代码仍然停留在 oxfffffffe 位置、LR 指向0xffffffff。 我还尝试使用 CCS 刷写应用程序代码。 由于未预设引导加载程序、存储器位置0x0为空、并且在位置0x4000处存在应用程序。 但是、stack_top 上的存储器位置指向 SRAM 中的某个位置(20023E34)、而其余所有位置仅指向闪存中的有效位置。   

    此外、如果我执行 _stack_top =_stack + 8192;这会增大堆栈大小还是还需要在其他位置进行更改?

    主要问题是、有时整个程序会成功运行、而有时、在部分运行后、它会卡在内存位置0xfffffe。 这是不是因为引导加载程序导致的问题? 
    /*********
    *
    *德州仪器 TM4C129ENCPDT 的默认链接器命令文件
    *
    这是从 TivaWare 库的修订版15071衍生出来的。
    *
    * /
    
    --retain=g_pfnVectors
    
    内存
    {
    闪存(RX):origin = 0x00004000、length = 0x000FC000
    SRAM (rwx):origin = 0x20000000,length = 0x00040000
    }//
    
    以下命令行选项是作为 CCS 项目的一部分设置的。 */
    /*如果您使用命令行进行构建,或者出于某种原因想要在
    此处定义*/*,则可以根据需要取消注释并修改这些行。 */
    /*如果您使用 CCS 进行编译、最好
    在 CCS 工程中进行任何此类*///*修改并将此文件单独保留。 */
    * //
    /*--heap_size=0 */
    *--stack_size=256 /*
    --library=rtsv7M4_T_le_eabi.lib
    
    内存中的*//*段分配*/
    
    段
    {
    .intvecs:> 0x00004000
    .text:> FLASH
    .const:> FLASH
    .cinit:>闪存
    .pinit:> FLASH
    init_array:> FLASH
    
    .vtable:>0x20000000
    .data :> SRAM
    .bss:> SRAM
    .sysmem:> SRAM
    .stack:> SRAM
    }
    
    __stack_top =__stack + 512; 








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

    一些问题。

    1.您运行了什么应用程序? 这是您自己的示例还是诸如 boot_demo1或 boot_demo2的 TivaWare 示例?

    2.您是否修改了 boot_serial 或使用了 TivaWare 提供的 boot_serial?

    3.您保留的堆栈大小似乎过大,除非您的应用程序确实需要这么多。 通常情况下、我认为1024足以满足大多数情况。

    4.您是否曾说过尝试使用 CCS 将应用程序编程到闪存中? 请注意、除非您更改了擦除选项、否则 CCS 将默认擦除整个闪存。 因此、当您对应用程序进行编程时、从0x0开始的引导加载程序将被擦除。 您看到的是这种情况吗? 如果您的应用程序响应您的命令、例如再次按下开关以重新加载/更新您的应用程序、它将跳转到引导加载程序区域、该区域现在全部为空。 这可能是您遇到的问题。

    下面是默认设置。 您可以更改为"仅限必要页面"、以便在通过 CCS 对应用程序进行编程时不会擦除引导加载程序。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您的解决方案。 现在、我能够通过 UART 成功刷写代码。
    但是、我有一个问题。
    假设当代码通过 UART 刷写50%时、我断开了插头连接(即刷写损坏的代码)。 这意味着应用程序已损坏,当 GPIO 接地时,它不会跳转到引导加载程序。 这会使我进入一个状态、在这个状态下、我必须通过位置0x4000中的 JTAG 再次刷写正确的应用程序。 可以防止这种情况吗?

    此致、
    奥 poorv
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Apoorv:
    TivaWare 引导加载程序旨在通过检查应用程序映像的前两个位置来检查应用程序是否有效。 前两个位置是堆栈指针和复位处理程序地址。 如果这两个位置不包含所有0xF 等有效值、那么它将强制应用程序更新。 另一种方法是强制执行引脚、以便强制执行引导加载程序更新。 在您的情况下、如果应用程序已部分更新、意味着前两个位置已有效、则您仍可以使用引脚强制更新。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    成功配置 UART 引导加载程序后、我跳回到了基于以太网的引导加载程序。

    首先、我使用 JTAG 在内存位置0x0处刷写 boot_emac_flash、在内存位置0x4000处刷写 boot_demo_emac_flash、并尝试使用以太网在位置0x4000处写入同一文件。

    我在 LM Flash 程序员中再次遇到相同的错误(无法启动 BOOTP 服务器)。 然后我尝试切换到另一个实用程序 eflash.c、该实用程序在第459行的 BOTP_server.c 中出现错误、该行用于为服务器创建 BOOTP 数据包。为了更改此 eflash 文件、我在 cygwin 中使用 make 实用程序对其进行了编译。

    然后、我将 eflash.c 中的 BOOTP 服务器端口更改为50000 (即一些随机端口) BOOTP 客户端模式更改为50002、将 tftp 服务器端口更改为50004、并且我成功地将魔术包发送到 UDP 端口9、 板载 LED 停止闪烁、即代码成功分支到引导加载程序。 但升级确实发生了(因为在引导加载程序中、配置的 UDP 端口为67.68和69 RESP)。

    因此、我再次将引导加载程序代码中的端口更改为50000、50002和50004 RESP。 然后再次运行 eflash 实用程序。 但是,eflash 实用程序再次出现错误:无法创建 BOOTP 服务器套接字。

    这是否意味着 BOOT_EMAC _FLASH 中配置的端口与 eFLASH 实用程序冲突?

    此外,DHCP 服务器一直处于打开状态。 这会是个问题吗?

    另外,我尝试执行 netstat -a,发现:(192.168.1.150是我的笔记本电脑 IP,192.168.1.5是 DHCP 服务器分配的主板 IP。)

    UDP 0.0.0.0:58952 *:*
    UDP 0.0.0.0:62859 *:*
    UDP 127.0.0.1:1900 *:*
    UDP 127.0.0.1:49664 *:*
    UDP 127.0.0.1:59022 *:*
    UDP 192.168.1.150:9 *:*
    UDP 192.168.1.150:67 *:*
    UDP 192.168.1.150:67 *:*
    UDP 192.168.1.150:69 *:*
    UDP 192.168.1.150:69 *:*
    UDP 192.168.1.150:137 *:*
    UDP 192.168.1.150:138 *:*
    UDP 192.168.1.150:1900 *:*
    UDP 192.168.1.150:40000 *:*
    UDP 192.168.1.150:40004 *:*
    UDP 192.168.1.150:40006 *:*
    UDP 192.168.1.150:50000 *:*
    UDP 192.168.1.150:50003 *:*
    UDP 192.168.1.150:59820 *:*
    UDP 192.168.2.96:137 *:*
    UDP 192.168.2.96:138 *:*
    UDP 192.168.2.96:1900 *:*
    UDP 192.168.2.96:59721 *:*



    此致、
    奥 poorv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Apoorv:
    我将关闭此主题、因为您在 e2e.ti.com/.../667007上发布了相同主题的新主题。