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.

[参考译文] 如何利用 BL_CONFIG.h 中的 BL_CHECK_UPDATE_FN_HOOK 配置项为 TM4C 构建引导加载程序?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/564876/how-do-you-build-the-bootloader-for-the-tm4c-utilizing-the-bl_check_update_fn_hook-configuration-item-in-bl_config-h

当我尝试为 TM4C 器件构建自定义引导加载程序时、我收到意外编译错误:

 

 

未定义的首次引用                                                                            

  符号                                                                                       

 ------ --------                                                                            

 主     C:\ti\ccsv6\tools\compiler\ti-cgt-arm_5.2.7\lib\rtsv7M4_T_le_v4SPD16_eabi.lib

 

错误:未解析的符号仍然存在

 

>>编译失败

错误:链接期间遇到错误;未构建"RoyaleIII_boot.out"

gmake:***[RoyaleIII_boot.out]错误1.

gmake:目标`全部'不会由于错误而重制。

 

****构建完成****

 

 

我还在 Tivaware 示例中构建了一些示例自定义加载程序。 它们没有任何“main()”函数,但尚未编译。 这是令人困惑的。

 

我正在尝试利用 bl_config.h 文件中的配置挂钩“BL_CHECK_UPDATE_FN_HOOK”。 据我所知,这应该会从 ROM 引导加载程序“挂钩”到我提供的“MyCheckUpdateFunc”。 我希望这是一个配置项目,它可以满足使用“main()”的要求。  但是、我不确定如何克服这一障碍并构建代码。 如果我 添加了一个虚拟 main(),那么我将会使该挂钩参数…的用途失败

 

//

//

//允许应用强制下载新固件。  如果已连接、这是

//函数将在引导加载程序初始化期间调用以确定

//无论是否有效,是否应执行固件更新

//主代码图像已存在。  如果函数返回0、则为现有

//主代码映像被引导(如果存在),否则引导加载程序将等待

//以下载新的固件映像。

//

// unsigned long MyCheckUpdateFunc (void);

//

//如果这两个值都已定义,则该值优先于 enable_update_check}。

//如果除了执行任何其他更新检查外,还希望执行 GPIO 检查

//需要处理,GPIO 代码必须包含在挂钩函数中

//本身。

//

//

#define BL_CHECK_UPDATE_FN_Hook MyCheckUpdateFunc

 

Russ  

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

    对于 TM4C、引导加载程序实际上没有函数 main。 这是您在 CCS 中创建的新工程、还是您正在使用现有的引导加载程序示例并修改了相同的工程?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经开发了一个先前为 Tiva 处理器实现的引导加载程序实例、并已迁移到项目的新版本。 以前的项目是在 CCS5的基础上构建的、早在一年前就完成了。 现在我正在使用 TivaWare v2.1.3.156和 CCS6、并且在 main()中遇到此错误、即使我尝试使用 BL_CHECK_UPDATE_FN_Hook MyCheckUpdateFunc。 链接器认为应该有"main()"的问题是、根据上面显示的错误、阻止了它的构建。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Russs、您好!

    似乎有一个文件引用主函数调用。 是否对 main 的文件执行了搜索(检查是否有在迁移期间创建的启动文件)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、

    是的,我搜索了"main()",但没有发现任何证据表明它存在。 链接中使用的 Tiva 库似乎需要"main()"。 存在一个名为 BL_MAIN_Tiva.c 的文件 此文件包含函数"MyCheckUpdateFunc"、该函数在 bl_config.h 中指定为挂钩 ROM 引导加载程序的函数。 如果我在该文件中插入"main()",则会编译工程,但问题是用户如何处理该 main(),因为它不应该存在。 这个“main()”的使用,与挂钩的预期目的背道而驰。。。

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

    否 这不是正确的方法。 实际上、这里不需要 main。 您能否共享您的项目、以便我可以在我的设置中重现此问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、重新创建问题更容易、如下所示(我刚才这样做了)。
    在2.1.3.156 TivaWare 文件夹系统中打开 TI 项目:
    "C:\ti\TivaWare_C_Series-2.1.3.156\examples\boards\dk-tm4c129x\boot_demo_uart"

    编译工程以查看其编译(附带一些警告)。

    现在、在这个 boot_demo_UART 项目中创建名为 bl_config.h 的新源头文件。 在此文件中,添加您将在行 VVVVV 之间找到的以下内容(此论坛响应工具不允许我附加文件)。 。 。 vvvv 和 AAAAA。 。 。 AAAAA。

    修改 bl_config.h 的第866行以匹配以下行:

    #define BL_CHECK_UPDATE_FN_Hook MyCheckUpdateFunc

    然后、注释掉"boot_demo_uart.c"中的整个"main()"函数、并使用 #if/#endif 如下:

    #if 1.

    uint32_t MyCheckUpdateFunc (空)


    返回0;


    其他

    内部
    main (空)






    #endif

    现在、重建项目、您将看到缺少"main()"的错误。 这与我的大型项目完全相同。





    VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVol

    //
    //
    // bl_config.h -自定义引导加载程序的可配置参数。
    //这些是所有程序/项目的所有自定义引导加载程序共用的参数。
    //
    //版权所有(c) 2010-2011 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //德州仪器(TI)仅提供和使用此软件
    //专门用于 TI 的微控制器产品。 该软件归其所有
    // TI 和/或其供应商、受适用版权保护
    //法律。 您不能将此软件与"病毒"开源软件结合使用
    //软件,以便形成一个更大的程序。
    //
    //此软件按“原样”提供,且存在所有故障。
    //不作任何明示、暗示或法定的保证,包括但
    //不限于对适销性和适用性的暗示保证
    //此软件的特定用途。 TI 不得以任何方式进行
    //情况,对特殊、偶然或从属事件负责
    //任何原因造成的损害。
    //
    //这是 EK-LM3S9B92固件包的修订版7243的一部分。
    //
    //

    #ifndef__BL_CONFIG_H__
    #define __BL_CONFIG_H__

    //
    //
    //以下定义用于配置引导操作
    //加载程序。 对于每个定义、都描述了它与其他定义的交互。
    //首先是依赖项(换句话说,也必须是定义)
    //如果定义了它),接下来是独占性(换句话说
    //定义如果定义了不能定义的内容),最后是
    //要求(换言之,如果是,则必须定义的定义
    //已定义)。
    //
    //引导加载程序必须定义以下定义
    //操作:
    //
    // CAN_ENABLE_UPDATE、ENET_ENABLE_UPDATE、I2C_ENABLE_UPDATE、
    // SSI_ENABLE_UPDATE、UART_ENABLE_UPDATE 或 USB_ENABLE_UPDATE
    // APP_START_ADDRESS
    // VTABLE 开始地址
    // FLASH_PAGE_SIZE
    // STACK_SIZE
    //
    //


    //
    //
    //这可以将 LDO 电压升压到2.75V。 引导加载程序
    //启用 PLL 的配置(例如、使用以太网端口)
    //对于具有 PLL 勘误表的器件,应启用此功能。 这适用于
    // Fury 级器件的修订版 A2。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    //#define BOOST_LDO_VOLTAGE

    //
    //
    //应用程序的起始地址。 这必须是16k 的倍数
    //字节(使其与页边界对齐)。 矢量表的预期值为
    //此位置,以及向量表(位于的栈)的感知有效性
    //在 SRAM 中、位于闪存中的复位矢量)用作的指示
    //应用程序映像的有效性。
    //
    //引导加载程序的闪存映像不得大于此值。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    #define APP_START_ADDRESS 0x4000

    //
    //
    // Sflash 发送一个0x2000的默认地址。 检测该值并使用
    //应用程序_start_address。
    //
    //取决于:闪烁默认行为
    //不包括:无
    //要求:无
    //
    //
    #define OVERRIDE_SFLASH_APP_START_ADDRESS 1.

    //
    //
    //应用程序查找其异常矢量表的地址。
    //这必须是1024字节的倍数(使其与页面对齐
    //边界)。 通常、应用程序将从其矢量表和开始
    //此值应设置为 APP_START_ADDRESS。 此选项提供给
    //适合从外部存储器运行的应用程序,而外部存储器可能不是
    //可由 NVIC 访问(矢量表偏移寄存器仅为30位
    //长)。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    #define VTABLE vstart_address 0x4000

    //
    //
    //闪存中单个可擦除页的大小。 这必须是电源
    //共2个。 16k 字节的值表示的页大小
    // Tiva 129_ MCU 上的内部闪存、该值应该只能是
    //如果配置引导加载程序以访问外部闪存设备,则覆盖
    //页面大小与此不同。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    #define FLASH_PAGE_SIZE 0x00004000

    //
    //
    //闪存末尾要保留的空间量。 这必须是 A
    // 1024字节的倍数(使其与页边界对齐)。 这种情况
    //更新应用程序时不会擦除保留空间,提供
    //可用于参数的非易失性存储。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    //#define FLASH_RSVD_SPACE 0x00000800

    //
    //
    //为引导加载程序保留的堆栈空间字数。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    #define STACK_SIZE 1024 // JSM:我将其从128更新为256以避免意外

    //
    //
    //数据缓冲区中用于接收数据包的字数。 这种情况
    //值必须至少为3。 如果在 UART 上使用自动波特、则必须为
    //至少20个。 最大可用值为65 (较大的值将导致
    //缓冲区中未使用的空间)。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    #define buffer_size 65 // I 将其从20更新为65以实现最高速度(65个字= 260bytes)

    //
    //
    //启用对引导加载程序的更新。 更新引导加载程序不安全
    //操作、因为它不是完全容错(器件断电)
    //部分方式可能导致引导加载程序不再出现在中
    //闪存)。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    //#define ENABLE_BL_UPDATE

    //
    //
    //此定义将导致引导加载程序擦除上的整个闪存
    //更新到引导加载程序或在时擦除整个应用程序区域
    //应用程序已更新。 这将擦除之前闪存中的所有未使用段
    //固件已更新。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    //燃料电池应用程序将擦除所有内容,但这是一种保护措施
    //不会意外使用旧校准。 它会减慢速度。
    //另请注意4K 闪存调平问题。
    #define FLASH_CODE_protection

    //
    //
    //启用呼叫,以便在将下载的数据写入之前对其进行解密
    //闪存。 解密例程在参考引导加载程序源中为空、
    //它只提供用于添加实际解密的占位符
    //算法。 尽管保留此选项是为了实现向后兼容性、但它仍是如此
    //建议使用较新的挂钩指定解密函数
    //函数机制和 BL_decrype_FN_hook。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    //#define ENABLE_decryption

    //
    //
    //在 NMI 中断中启用对 MOSCFAIL 处理程序的支持。
    //注意:Sandstorm 或 Fury 器件不提供 MOSCFAIL 复位、所以这样
    //不应为这些设备启用功能。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    //#define ENABLE_MOSCFAIL_handler

    //
    //
    //支持代码与闪存修补程序兼容
    //预加载到某些 Stellaris 器件的闪存中。 这种支持应该
    //仅为需要它的设备启用。
    //
    //注意:启用此功能将导致引导加载程序预期为
    //加载到0x1000、尽管调试器仍会认为是这样
    //应加载在0x0。 因此、LM 闪存编程器必须用于
    //使用此功能时将引导加载程序编程到闪存中。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    //#define flash_patch_compatible

    //
    //
    //启用基于引脚的强制更新检查。 启用后、引导加载程序
    //将进入更新模式,而不是在读取引脚时调用应用程序
    //在特定极性强制执行更新操作。 在这两种情况下、都是
    //应用程序仍然能够将控制权返回给引导加载程序以
    //开始更新。 对于需要执行更复杂任务的应用
    //检查可能不是使用单个 GPIO,而是挂钩函数
    //改为使用 BL_CHECK_UPDATE_FN_Hook 提供。
    //
    //取决于:无
    //不包括:无
    //需要:forced_update_Periph、forced_update_port、forced_update_pin、
    // 强制_更新_极性
    //
    //
    //#define ENABLE_UPDATE_CHECK

    //
    //
    //启用 GPIO 模块以检查强制更新。 这将会
    //是 SYSCTL_RCGC2_GPIOx 值之一,其中"x"替换为端口
    //名称(如 B)。 "x"的值应与"x"的值匹配
    // Forced_update_port。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define Forced_update_Periph SYSCTL_RCGC2_GPIOB

    //
    //
    // GPIO 端口以检查强制更新。 这将是其中之一
    // GPIO_Portx_BASE 值、其中"x"替换为端口名称(例如
    // B)。 "x"的值应与"x"的值匹配
    // Forced_update_Periph。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define forced_update_port GPIO_PORTB_BASE

    //
    //
    //检查强制更新的引脚。 这是一个介于0和7之间的值。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define forced_update_pin 4.

    //
    //
    //导致强制更新的 GPIO 引脚的极性。 该值
    如果引脚应为低电平、//应为0;如果引脚应为高电平、则应为1。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define Forced_update_polarity 0

    //
    //
    //这为强制中使用的 GPIO 引脚启用弱上拉或下拉
    //更新。 只应存在一个强制更新 WPU 或强制更新 WPD
    //已定义,或者如果不需要弱上拉或下拉,则两者均不需要。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define Forced_update_WPU
    //#define forced_update_wpd

    //
    //
    //这可以使用 GPIO_LOCK 机制进行配置
    //受保护的 GPIO 引脚(例如 JTAG 引脚)。 如果未定义此值、
    //不使用锁定机制。 唯一的合法值
    //功能包括 Fury 器件的 GPIO_LOCK_KEY 和全部的 GPIO_LOCK_KEY_DD
    //除 Sandstorm 设备以外的其它设备,它们不支持此功能。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define forced_update_key GPIO_LOCK_KEY
    //#define forced_update_key GPIO_LOCK_KEY_DD

    //
    //
    //选择 UART 作为与引导加载程序通信的端口。
    //
    //取决于:无
    //不包括:CAN_ENABLE_UPDATE、ENET_ENABLE_UPDATE、I2C_ENABLE_UPDATE、
    // SSI_ENABLE_UPDATE、USB_ENABLE_UPDATE
    //需要:UART_autobaud 或 UART_FIXED_BAUDRATE、buffer_size
    //
    //
    #define UART_ENABLE_UPDATE
    #define FLASH_UART_PORT SYSCTL_PERIPH_GPIOK
    #define FLASH_UART_base UART4_base
    #define FLASH_UART_Periph SYSCTL_Periph_UART4
    #define FLASH_UART_BAUD_RATE 115200
    #define FLASH_UART_PIN_CONFIG \
    MAP_GPIOPinConfigure (GPIO_PK1_U4TX);\
    MAP_GPIOPinTypeUART (GPIO_PORTK_base、GPIO_PIN_1);\
    MAP_GPIOPinConfigure (GPIO_PK0_U4RX);\
    MAP_GPIOPinTypeUART (GPIO_PORTK_base、GPIO_PIN_0);

    //
    //
    //启用自动波特率检测。 这可用于晶体
    //频率未知,或者需要以不同的波特率运行。
    //
    //取决于:UART_ENABLE_UPDATE
    //不包括:UART_FIXED_BAUDRATE
    //要求:无
    //
    //
    //#define UART_autobaud

    //
    //
    //选择 UART 使用的波特率。
    //
    //取决于:UART_ENABLE_UPDATE、CRYSTRAL_FREQ
    //不包括:UART_autobaud
    //要求:无
    //
    //
    #define UART_FIXED_BAUDRATE 115200

    //
    //
    //选择 SSI 端口作为与引导加载程序通信的端口。
    //
    //取决于:无
    //不包括:CAN_ENABLE_UPDATE、ENET_ENABLE_UPDATE、I2C_ENABLE_UPDATE、
    // UART_ENABLE_UPDATE、USB_ENABLE_UPDATE
    //需要:buffer_size
    //
    //
    //#define SSI_ENABLE_UPDATE

    //
    //
    //选择 I2C 端口作为与引导加载程序通信的端口。
    //
    //取决于:无
    //不包括:CAN_ENABLE_UPDATE、ENET_ENABLE_UPDATE、SSI_ENABLE_UPDATE、
    // UART_ENABLE_UPDATE、USB_ENABLE_UPDATE
    //需要:I2C_SLAVE_ADDR、buffer_size
    //
    //
    //#define I2C_ENABLE_UPDATE

    //
    //
    //指定引导加载程序的 I2C 地址。
    //
    //取决于:I2C_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define I2C_SLAVE_ADDR 0x42

    //
    //
    //通过 BOOTP/TFTP 协议选择以太网更新。
    //
    //取决于:无
    //不包括:CAN_ENABLE_UPDATE、I2C_ENABLE_UPDATE、SSI_ENABLE_UPDATE、
    // UART_ENABLE_UPDATE、USB_ENABLE_UPDATE
    //需要:crystal_FREQ
    //
    //
    //#define ENET_ENABLE_UPDATE

    //
    //
    //允许使用以太网状态 LED 输出来指示流量和
    //连接状态。
    //
    //取决于:enet_enable_update
    //不包括:无
    //要求:无
    //
    //
    //#define ENET_ENABLE_LED

    //
    //
    //指定以太网接口的硬编码 MAC 地址。 有
    //提供的六个单独值(ENET_MAC_ADDR0到 ENET_MAC_Addr5)
    // MAC 地址的六个字节、其中 ENET_MAC_ADDR0通过 ENET_MAC_ADD2
    //提供组织唯一标识符(OUI)和 ENET_MAC_Addr3
    //通过 ENET_MAC_Addr5提供扩展标识符。 这些值
    //未提供,MAC 地址将从用户寄存器中提取。
    //
    //取决于:enet_enable_update
    //不包括:无
    //要求:无
    //
    //
    //#define ENET_MAC_ADDR0 0x00
    //#define ENET_MAC_ADDR1 0x00
    //#define ENET_MAC_ADDR2 0x00
    //#define ENET_MAC_Addr3 0x00
    //#define ENET_MAC_Addr4 0x00
    //#define ENET_MAC_Addr5 0x00

    //
    //
    //指定要从中请求信息的 BOOTP 服务器的名称。
    //使用此说明符可以使特定于电路板的 BOOTP 服务器共存
    //使用 DHCP 服务器的网络中,该服务器可能是网络的一部分
    //基础设施。 德州仪器提供的 BOOTP 服务器需要
    //将其设置为"Stellaris"。
    //
    //取决于:enet_enable_update
    //不包括:无
    //要求:无
    //
    //
    //#define ENET_BOOTP_SERVER " Stellaris "

    //
    //
    //通过设备固件更新类选择 USB 更新。
    //
    //取决于:无
    //不包括:CAN_ENABLE_UPDATE、ENET_ENABLE_UPDATE、I2C_ENABLE_UPDATE、
    // SSI_ENABLE_UPDATE、UART_ENABLE_UPDATE、
    //需要:crystal_FREQ、USB_vender_ID、USB_product_ID、USB_device_ID、
    // USB_MAX_POWER
    //
    //
    //#define USB_ENABLE_UPDATE

    //
    //
    // DFU 器件发布的 USB 供应商 ID。 该值是 TI
    // Stellaris 供应商 ID。 将其更改为您已分配给您的供应商 ID
    // USB-IF。
    //
    //取决于:USB_enable_update
    //不包括:无
    //要求:无
    //
    //
    //#define USB_vender_ID 0x1cbe

    //
    //
    // DFU 器件发布的 USB 器件 ID。 如果您使用自己的器件
    //供应商 ID,选择与您在中使用的 ID 不同的设备 ID
    //非更新操作。 如果您已将 TI 的供应商 ID 作为子许可证、则必须执行此操作
    //在此处使用分配的产品 ID。
    //
    //取决于:USB_enable_update
    //不包括:无
    //要求:无
    //
    //
    //#define USB_PRODUCT_ID 0x00FF

    //
    //
    //选择在设备中发布的 BCD USB 设备版本号
    //描述符。
    //
    //取决于:USB_enable_update
    //不包括:无
    //要求:无
    //
    //
    //#define USB_DEVICE_ID 0x0001

    //
    //
    //设置 DFU 器件将向报告的最大功耗
    //配置描述符中的 USB 主机。 单位为毫安。
    //
    //取决于:USB_enable_update
    //不包括:无
    //要求:无
    //
    //
    //#define USB_MAX_POWER 150

    //
    //
    //指定 DFU 器件是否向主机报告它是自供电的
    //(定义为0)或总线供电(定义为1)。
    //
    //取决于:USB_enable_update
    //不包括:无
    //要求:无
    //
    //
    //#define USB_BUS_powered 1

    //
    //
    //确定目标板是否使用多路复用器在 USB 之间进行选择
    //主机和设备模式。
    //
    //取决于:USB_enable_update
    //不包括:无
    //需要:USB_MUX_Periph、USB_MUX_PORT、USB_MUX_PIN、USB_MUX_device
    //
    //
    //#define USB_HAS_MUX

    //
    //
    //指定包含用于选择的引脚的 GPIO 外设
    //在 USB 主机和设备模式之间。 值是形式
    // SYSCTL_Periph_GPIOx、其中 GPIOx 代表所需的 GPIO 端口。
    //
    //取决于:USB_enable_update、USB_HAS_MUX
    //不包括:无
    //要求:无
    //
    //
    //#define USB_MUX_Periph SYSCTL_RCGC2_GPIOH

    //
    //
    //指定包含用于在之间进行选择的引脚的 GPIO 端口
    // USB 主机和设备模式。 该值的形式为 GPIO_Portx_BASE、其中
    // Portx 代表所需的 GPIO 端口。
    //
    //取决于:USB_enable_update、USB_HAS_MUX
    //不包括:无
    //要求:无
    //
    //
    //#define USB_MUX_PORT GPIO_Porth_BASE

    //
    //
    //指定用于在 USB 主机和器件之间进行选择的 GPIO 引脚编号
    //模式。 有效值为0到7。
    //
    //取决于:USB_enable_update、USB_HAS_MUX
    //不包括:无
    //要求:无
    //
    //
    //#define USB_MUX_PIN 2.

    //
    //
    //指定选择 USB 器件模式所需的 GPIO 引脚的状态
    //操作。 有效值为0 (低电平)或1 (高电平)。
    //
    //取决于:USB_enable_update、USB_HAS_MUX
    //不包括:无
    //要求:无
    //
    //
    //#define USB_MUX_DEVICE 1

    //
    //
    //通过 CAN 端口选择更新。
    //
    //取决于:无
    //不包括:enet_enable_update、I2C_enable_update、SSI_enable_update、
    // UART_ENABLE_UPDATE、USB_ENABLE_UPDATE
    //需要:CAN_RX_Periph、CAN_RX_PORT、CAN_RX_PIN、CAN_TX_Periph、
    // CAN_TX_PORT、CAN_TX_PIN、CAN_BIT_RATE、CRYSTICL_FREQ。
    //
    //
    //#define CAN_ENABLE_UPDATE

    //
    //
    //表示 CAN 外设通过 PLL 的固定分频运行
    //输出、这意味着必须启用 PLL。 有些人要求这样做
    //较旧的 Stellaris 器件,但不得在较新的 Stellaris 器件上使用。
    //请查阅器件数据表以确定 CAN 外设是否正常运行
    //来自 PLL 的固定8MHz 时钟(这意味着该选项必须为
    //已使用),或者如果它从系统时钟运行(这意味着此选项不能使用
    //将被使用)。
    //
    //取决于:CAN_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define CAN_requires_PLL

    //
    //
    //启用 UART 的 CAN 桥接、以便在选择 CAN 端口时使用
    //与引导加载程序通信。
    //
    //取决于:CAN_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define CAN_UART_BRIDGE

    //
    //
    //要启用 GPIO 模块以配置 CAN0 Rx 管脚。 这将会
    //是 SYSCTL_RCGC2_GPIOx 值之一,其中"x"替换为端口
    //名称(如 B)。 "x"的值应与"x"的值匹配
    // CAN_RX_PORT。
    //
    //取决于:CAN_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define CAN_RX_Periph SYSCTL_RCGC2_GPIOA

    //
    //
    //用于配置 CAN0 Rx 管脚的 GPIO 端口。 这将是其中之一
    // GPIO_Portx_BASE 值、其中"x"替换为端口名称(例如
    // B)。 "x"的值应该与 CAN_RX_Periph 的"x"的值相匹配。
    //
    //取决于:CAN_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define CAN_RX_PORT GPIO_Porta_base

    //
    //
    //与 CAN0 Rx 管脚共享的 GPIO 管脚。 这是一个介于0之间的值
    //和7.
    //
    //取决于:CAN_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define CAN_RX_PIN 4.

    //
    //
    //要启用 GPIO 模块以配置 CAN0 Tx 引脚。 这将会
    //是 SYSCTL_RCGC2_GPIOx 值之一,其中"x"替换为端口
    //名称(如 B)。 "x"的值应与"x"的值匹配
    // CAN_TX_PORT。
    //
    //取决于:CAN_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define CAN_TX_Periph SYSCTL_RCGC2_GPIOA

    //
    //
    //用于配置 CAN0 Tx 引脚的 GPIO 端口。 这将是其中之一
    // GPIO_Portx_BASE 值、其中"x"替换为端口名称(例如
    // B)。 "x"的值应与 CAN_TX_Periph 的"x"的值匹配。
    //
    //取决于:CAN_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define CAN_TX_PORT GPIO_Porta_base

    //
    //
    //与 CAN0 Tx 引脚共享的 GPIO 引脚。 这是一个介于0之间的值
    //和7.
    //
    //取决于:CAN_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define CAN_TX_PIN 5.

    //
    //
    // CAN 总线上使用的比特率。 这必须是20000、50000、125000、
    // 250000、50000或1000000。 CAN 位速率必须小于或等于
    //晶振频率除以8 (crystal_FREQ / 8)。
    //
    //取决于:CAN_ENABLE_UPDATE
    //不包括:无
    //要求:无
    //
    //
    //#define CAN_BIT_RATE 1000000

    //
    //
    //在系统上执行应用特定的低级硬件初始化
    //复位。 如果被连接、这个函数将在引导后被立即调用
    //加载程序代码重定位完成。 应用程序可以执行任何必需的操作
    //在此函数期间进行低级硬件初始化。 请注意、
    //调用此函数时未设置系统时钟。 初始化
    //假定系统时钟被置位,可在 BL_INIT_FN_HOOK 中执行
    //函数。
    //
    // void MyHwInitFunc (void);
    //
    //
    //#define BL_HW_INIT_FN_HOOK MyHwInitFunc

    //
    //
    //在系统复位时执行应用特定的初始化。 如果已连接、
    //此函数将在引导加载程序初始化期间调用以执行
    //需要的任何特定于电路板或应用的初始化。 。
    //函数在所选引导后立即在复位后调用
    //加载程序外设已配置,系统时钟已设置。
    //
    // void MyInitFunc (void);
    //
    //
    //#define BL_INIT_FN_HOOK MyInitFunc

    //
    //
    //通过 SVC 在引导加载程序进入时执行应用特定的重新初始化。
    //如果挂钩,则在引导加载程序重新初始化期间调用此函数
    //执行任何特定于电路板或应用的初始化
    //必需。 在中的引导加载程序条目之后调用该函数
    //应用,在进行任何系统时钟速率调整后。
    //
    // void MyReinitFunc (void);
    //
    //
    //#define BL_reinit_fn_hook MyReinitFunc

    //
    //
    //通知应用程序正在开始下载。 如果已连接、这是
    将在固件下载即将开始时调用//函数。 。
    //函数在接收到下载的第一个数据包后调用
    //但在写入闪存之前。
    //
    // void MyStartFunc (void);
    //
    //
    //#define BL_START_FN_HOOK MyStartFunc

    //
    //
    //通知应用下载进度。 如果已连接、此函数将会
    //在固件下载期间定期调用以提供进度
    //信息。 在从接收到每个数据包后调用该函数
    //主机。 参数提供接收到的数据字节数、在中
    //以太网更新以外的情况,中预期的总字节数
    //下载(以太网引导加载程序使用的 TFTP 协议不发送
    //下载开始之前的最终图像大小,在本例中为 ulTotal
    //参数设置为0,表示大小未知)。
    //
    //空 MyProgresFunc (unsigned long ulCompleded、unsigned long ulTotal);
    //
    //
    //#define BL_Progress_fn_hook MyProgresFunc

    //
    //
    //通知应用程序下载已完成。 如果已连接、这是
    固件下载完成后将调用//函数。 。
    //函数在下载的最终数据包完成后调用
    //写入闪存。
    //
    // void MyEndFunc (void);
    //
    //
    //#define BL_END_FN_HOOK MyEndFunc

    //
    //
    //允许应用程序在下载过程中执行就地数据解密。
    //如果已连接,则将调用此函数以执行就地解密
    //在固件下载过程中收到的每个数据包。
    //
    //空 MyDecrypTIONFunc (unsigned char * pucBuffer、unsigned long ulSize);
    //
    //此值优先于 enable_decryption。 如果两者都已定义、
    //调用使用 BL_decring_FN_hook 定义的挂钩函数,而不是
    //先前定义的 DecryptData()存根函数。
    //
    //
    //#define BL_decrype_FN_hook MyDecryptionFunc

    //
    //
    //允许应用强制下载新固件。 如果已连接、这是
    //函数将在引导加载程序初始化期间调用以确定
    //无论是否有效,是否应执行固件更新
    //主代码图像已存在。 如果函数返回0、则为现有
    //主代码映像被引导(如果存在),否则引导加载程序将等待
    //以下载新的固件映像。
    //
    // unsigned long MyCheckUpdateFunc (void);
    //
    //如果这两个值都已定义,则该值优先于 enable_update_check}。
    //如果除了执行任何其他更新检查外,还希望执行 GPIO 检查
    //需要处理,GPIO 代码必须包含在挂钩函数中
    //本身。
    //
    //
    #define BL_CHECK_UPDATE_FN_Hook MyCheckUpdateFunc

    //
    //
    //允许应用程序替换闪存块擦除功能。 如果已连接、
    //只要闪存块被擦除,就会调用此函数。 。
    //函数必须擦除块并等待操作完成。
    //将被擦除的块大小由 FLASH_BLOCK_SIZE 定义。
    //
    //空 MyFlashEraseFunc (无符号长 ulBlockAddr);
    //
    //
    //#define BL_FLASH_ERASE_FN_Hook MyFlashEraseFunc

    //
    //
    //允许应用程序替换闪存编程功能。 如果已连接、
    //将调用此函数以使用固件映像数据对闪存进行编程
    //下载操作期间收到。 该函数必须对提供的进行编程
    //数据并等待操作完成。
    //
    //空 MyFlashProgramFunc (无符号长整型 ulDstAddr、
    // unsigned char * puCSrcData、
    // unsigned long ulLength);
    //
    //
    //#define BL_FLASH_program_fn_hook MyFlashProgramFunc

    //
    //
    //允许应用程序替换闪存错误清除功能。 如果已连接、
    //此函数必须清除所有闪存错误指示符并准备进行检测
    //在未来的擦除或编程操作中可能发生的访问冲突。
    //
    // void MyFlashClearErrorFunc (void);
    //
    //
    //#define BL_FLASH_CL_ERR_FN_Hook MyFlashClearErrorFunc

    //
    //
    //报告是否发生了闪存访问冲突错误。 如果
    //挂钩,此函数将在闪存擦除或编程后调用
    //操作。 返回代码指示是否存在访问违规
    //自上次调用定义的函数以来发生错误
    // bl_flash_cl_ERR_FN_hook、其中0表示无错误、非零表示
    //错误。
    //
    // unsigned long MyFlashErrorFunc (void);
    //
    //
    //#define BL_FLASH_ERROR_FN_Hook MyFlashErrorFunc

    //
    //
    //报告器件闪存的总大小。 如果已连接、此函数将会
    //来确定支持的闪存器件的大小。 返回
    //代码是器件中闪存的字节数。 请注意、这不是
    //考虑通过 FLASH_RSVD_SPACE 值定义的任何保留空间。
    //
    // unsigned long MyFlashSizeFunc (void);
    //
    //
    //#define BL_FLASH_SIZE_FN_Hook MyFlashSizeFunc

    //
    //
    //报告器件闪存结束后的第一个字节的地址。 如果
    //挂钩、将调用此函数来确定末尾的地址
    //有效闪存。 请注意、这不考虑任何保留空间
    //通过 FLASH_RSVD_SPACE 值定义。
    //
    // unsigned long MyFlashEndFunc (void);
    //
    //
    //#define BL_FLASH_END_Hook MyFlashEndFunc

    //
    //
    //检查图像的起始地址和大小是否有效。 如果已连接、
    //当新固件下载即将开始时,将调用此函数。
    //提供的参数是新下载的请求起始地址
    //使用提前传输图像长度的协议时,可以使用
    //要下载的图像的大小。 返回代码将是
    //非零表示起始地址有效且图像合适
    //在可用空间中,或者如果地址无效或映像为0
    //对于设备来说太大。
    //
    // unsigned long MyFlashAddrCheckFunc (unsigned long ulAddr、
    // unsigned long ulSize);
    //
    //
    //#define BL_FLASH_AD_CHECK_FN_Hook MyFlashAddrCheckFunc


    //此处包含项目名称和其他自定义信息。
    //我在上面的所有内容之后都包含此内容,以便可以比较这些值
    //以确保正确。
    //此处的.s 从 boot_UART 备份出来,自定义,板,StellarisWare,取决于


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

    DK-TM4C129x 下的 BOOT_DEMO_UART 不是基于闪存的引导加载程序示例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、

    您能否向我指出鉴别器中基于闪存或非闪存的引导加载程序? 从用户指南中:
    用于 C 系列的 TivaWare 引导加载程序用户指南(修订版 D)
    用户指南: www.ti.com/.../spmu301d

    上面确定的机制似乎启用了基于闪存的解决方案中的这些元件。 如果情况并非如此、您能不能让我指出实例化这个基于闪存的解决方案的过程、因为我必须在这里误解某些内容。

    谢谢、

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

    BOOT_DEMO_UART 具有常规应用程序。 它使用图形库来显示显示并通过调用 ROM 引导加载程序来执行更新。 另一方面、TivaWare 中的引导加载程序优化了整个方法、不使用任何图形、并且实现了多个故障安全机制、以减少因电源中断或上载过程而可能导致的闪存损坏。

    要使用 TivaWare 中的引导加载程序、更可能的示例是

    D:\ti\TivaWare_C_Series-2.1.3.156\examples\boards\dk-tm4c129x\boot_emac_flash
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、

    BL_CHECK_UPDATE_FN_Hook 如何工作? 我在任何 TivaWare 引导加载程序文件中都找不到这一点。 那么、如果使用它、如何解决它?

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

    BL_CHECK_UPDATE_FN_Hook 通过执行来工作。 在函数中、将对启动加载程序调用进行检查。 例如、如果您希望在每次上电时调用引导加载程序、以检查一组 GPIO 何时具有特定值或 GPIO 引脚按压的特定序列。 如果该检查返回 true、则返回1、否则返回0。 返回1将导致调用引导加载程序。 返回0将导致应用程序被执行。