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.

求教Tiva BootLoader

Other Parts Discussed in Thread: TM4C1230H6PM, EK-TM4C1294XL

手头上有一块Tiva LanuchPad的板子,这两天一直在调试BootLoader的功能。参考TivaWare_C_Series-2.1.0.12573\examples\boards\dk-tm4c123g下的boot_serial,boot_demo1,boot_demo2进行了实现,现有如下问题:

1、通过CCS把boot_serial和boot_demo1按先后顺序下载到芯片上,可以通过LM Flash Progarmmer进行串口更新,但是我把系统断电或复位后,就无法进行串口更新了,不知道这是为什么。为了看到程序的状态,我在boot_serial中启用了BL_HW_INIT_FN_HOOK宏,编写了MyHwInitFunc这个函数,让LauchPad上Led点亮延迟熄灭;在boot_demo1在点亮了另外一只LED,把这两个程序先后下载后,均运行正常,灯正常显示,串口可更新,但断电后上电没有任何灯点亮。这时候我再烧写一变boot_demo1,boot_demo1程序上的灯点亮了,串口又能更新,说明boot_serial没有被刷写掉。按照手册,我认为系统上电后应调用boot_serial,由于这时不需要更新,就会去运行boot_demo1,然后由boot_demo1将系统强制进入到更新状态。不知道我这样理解是否正确,刷写boot_demo1的flash偏移地址是0x00002800。

2、能够自己编写一个类似LM Flash Progarmmer的程序,ti是否有相关的参考程序。

3、boot_serial这类程序如何调试,我看英文论坛上有说明,但尝试后不正确。

谢谢!其实前面发了一个帖子,修改了一下,居然要去找版主认证,第一次看到论坛有这样设定。再重新发了一遍。

  • Hong

    1. 你的理解是正确的,该例程是flash based的bootloader。如果想在第一次使用bootloader之后再次烧写程序,你需要在你通过串口更新的的应用程序里面加入串口配置,然后强制进入bootloader。配置参考boot-demo1即可。

    2. 想要编写相关的升级程序,请参考bootloader user's guide,按照相应的协议发送数据即可。

    user's guide 的下载地址:

    http://www.ti.com/lit/pdf/spmu301

  • 谢谢您的回答。可能我没有把问题描述清楚,我通过CCS先把boot_serial下载下去,然后再把boot_demo1下载下去,这时程序运行正常,只要系统不断电,我可以通过LM Flash程序把boot_demo1和boot_demo2的bin文件反复的下载下去;但是我断电后,再上电,就无法再次更新了,无论我是用CCS先后下载的boot_serial和boot_demo1,还是下载后同LM Flash通过串口更新boot_demo1.bin或boot_demo2.bin文件,都无法更新。按照正常的流程,我在系统进入到Update时会点亮一盏Led,断电后却不会出现这一现象,说明程序在断电后没有正常的进入到0x00002800去调用应用程序。

    所以我的问题是,boot_serial和boot_demo1下载后,断电后再上电,无法通过串口更新程序。从实验现象来看程序也运行的不正常,感觉boot_serial这个程序没有正常的执行,这是为什么

    您所说的“你需要在你通过串口更新的的应用程序里面加入串口配置,然后强制进入bootloader”,应该是指对应用程序的要求,也就是自己去编写应用程序,需要按照boot_demo1的格式吧。

    上两张图说明一下吧,下载完boot_serial和boot_demo1,绿灯亮起,表示系统进入到Update状态,这时可更新;如果下载完boot_serial和boot_demo1,断电再上电,灯就不会亮了。

  • Hong

    在使用LM Flash烧写boot_demo1和boot_demo2的时候,‘Program’选项卡的Program address offset要设置为0x2800。boot_serial设置为0x0。

    下面附三个bin文件。

    首先,使用LM flash programmer的JTAG mode将boot_serial(Program address offset=0)和boot_demo1(Program address offset=0x2800)。

    然后,使用串口下载轮换烧写boot_demo1和boot_demo2,Program address offset设置为0x2800。

    经过测试没有问题。

    bins.zip
  • 您好!十分感谢您的回复。我一直是把boot_serial烧写到0x00000000,boot_demo1烧写到0x00002800的。

    用您给的bin文件,拿两块Tiva LaunchPad试了一下,都不成功。您看一下,烧写后要切换到serial模式下的,需要改那些配置吗。使用ICDI下载后,需要切换一下的。

    烧写过程:

    错误信息。不知道这个诡异的问题是如何产生的。

    明天准备换台电脑试试看,还是不行的话,得想办法现场解决了,谢谢!!!

  • 用ROM_UpdateUART模式重新写了一个更新程序,一开始也始终不行,吃完饭下载了一遍,突然可以了,泪流满面啊。诡异的Tiva M4啊,不知道问题出在那里。放上代码吧,注意ROM_UpdateUART不用下载boot_serial,和通常的应用程序一样写,flash偏移位置0x0000000。

    代码如下:

    #define TARGET_IS_BLIZZARD_RB1
    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_nvic.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/rom.h"
    #include "driverlib/uart.h"
    
    void
    JumpToBootLoader(void)
    {
        //
        // We must make sure we turn off SysTick and its interrupt before entering
        // the boot loader!
        //
        ROM_SysTickIntDisable();
        ROM_SysTickDisable();
    
        //
        // Disable all processor interrupts.  Instead of disabling them
        // one at a time, a direct write to NVIC is done to disable all
        // peripheral interrupts.
        //
        HWREG(NVIC_DIS0) = 0xffffffff;
        HWREG(NVIC_DIS1) = 0xffffffff;
    
    
        ROM_UpdateUART();
    }
    
    void
    SetupForUART(void)
    {
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        //
        ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
        // Configure the UART for 115200, n, 8, 1
        ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 115200,
                                (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE |
                                 UART_CONFIG_WLEN_8));
    
        //
        // Enable the UART operation.
        //
        ROM_UARTEnable(UART0_BASE);
    }
    
    int main(void)
    {
    	int i;
    	ROM_SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
    	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    	ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
    	ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x02);
    	for(i=0;i<50;i++)
    		ROM_SysCtlDelay(100000);
    	SetupForUART();
    	ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x04);
    	JumpToBootLoader();
    	while(1)
    	{
    
    	}
    }
    
    诡异的问题再继续调试吧。
  • 看起来代码问题不大。建议配置UART的时候加上

    ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
    ROM_GPIOPinConfigure(GPIO_PA1_U0TX);

  • Hong,

    使用串口烧写时,请不要勾选Disable Auto Band Support选项。

    配置如下图:

    如果使用Rom based Bootloader, program选项卡下的地址请将0x2800修改为0x0.

  • 嗯,去掉Disable Auto Band Support就好了,谢谢您的回答。

  • 谢谢,我会加上的!

  • 你好,我遇到了一样的问题,按下面你们讨论的方法试了也没有成功,我想问下你的硬件是怎么连接的

  • 串口就是TX RX GND接上就行了。

    我们有遇到过一些例子,使用USB转串口的缆,那个有时候用起来会有问题。

    台式机的串口没问题的。

  • 你好,我也遇到了类似的问题,想请教一下你,我想用I2c的方式支持在线升级应用程序。

    如果我也用这个帖子的这种方法也可以吗?我使用的是Tm4c1230H6PM芯片,和keil环境。如果我也使用boot_serial和boot_demo1的话,然后支持I2C在线升级的话我应该做怎样的改变呢?我现在还不清楚怎样配置。

    我用的是另外一种方法写程序,也遇到了问题,想请教与你,我也发了帖子,链接是:http://www.deyisupport.com/question_answer/microcontrollers/tiva_arm_cortex/f/96/t/83072.aspx

    或者是我应该用哪种方法呢,我觉得本帖子讨论的方法比较好,谢谢你!希望你能帮我一下,谢谢!

  • 您好,我用您上面说的方法给手上的tm4c123g的launchpad下载您给的bin文件发现出现了和版主一样的的问题,已经把Disable Auto Baud Support勾选去掉,串口下载的时候用的是usb-ttl的rx、tx分别连接到板上的PA0、PA1,是我的连接有问题吗?望指教,谢谢!

  • 学习了!

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

    代理销售气相色谱仪、液相色谱仪、色谱柱等仪器仪表

  • 非常好的经验分享,顶一下!

  • 和usb转TTL也有关系的。但是使用UART直接下载仅限于第一次下载的时候,以后的话必须自己烧写boot了。

  • Wellin Zhang您好,能否求一份EK-TM4C1294XL的bootloader,我的ccs下载安装失败,我只需要一份bootloader,所以能不能麻烦您给我一份bootloader的bin文件。谢谢!

  • 你好,请问我现在采用LM Flash programmer Jtag模式,时钟源和芯片的晶振设置是一致的吗?我们板卡的芯片晶振为25MHz,采用这种方式烧写总失败啊 

  • 楼主成功之后是否有完整的步骤啊  跪谢

  • 请问,使用serial port(uart)下载时,是用什么硬件连接串口和电脑的呢?