Luminary ARM 芯片bootloader用法

出厂的芯片内置serial flash loader ,可以使用UART或者SSI来进行烧录 ,当然使用JTAG也可以 。只要被使用过,serial flash loader 就不存在了 。所以,如果你的芯片不是新的,又想通过UART来进行更新软件 ,必须要有Bootloader在芯片里头 。如果是新的芯片,最好先把BOOTLOADER烧到芯片的0x00~0x800位置。 以后的用户应用程序烧到0x800以后的位置 。如果芯片不是新的,在芯片里头一定要有bootloader 才可以通过UART进行应用程序的更新 。而且更新用户应用程序的时候不要察除bootloader  。如果芯片不是新的,又没有Bootloader , 那么需要用jtag 先把bootloader烧到芯片0x00开始的位置 ,接着才可以通过uart 来进行update chip .

当芯片里头已经有Bootloader ,并且有用户程序了,只要位址是对的,上电后芯片先读bootloader 然后检查用户程序是否可用,如果可 用 就跳转到去执行用户程序了 。所以在bootloader 和用户程序都存在的情况下要想通过uart 进行芯片的自编程或者说自更新 ,就需要在你 的用户程序上用事件触发调用bootloader  :
int main(void)
{
    //
    // Set the clocking to run directly from the crystal.
    //
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ);
//这里使用的时钟是直接从外部晶振取,没有enable PLL 。实际应用中是经常要PLL的 
    //
    // Enable the UART and GPIO modules.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    //
    // Make the UART pins be peripheral controlled.
    //
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    //
    // Configure the UART for 115,200, 8-N-1 operation.
    //
    UARTConfigSetExpClk(UART0_BASE, 6000000 , 115200,
                        (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                         UART_CONFIG_PAR_NONE));
//注意这个参数6000000 ,如果没有enable PLL 就是对的,
//但如果有enable PLL那么这里应该改一下。 改成取系统的实际时钟 =>  SysCtlClockGet()
//这个在driverlib里面有

    //
    // Initialize the display.
    //
    PDCInit();
    PDCLCDInit();
    PDCLCDBacklightOn();

    //
    // Indicate what is happening.
    //
    PDCLCDSetPos(0, 0);
    PDCLCDWrite("Boot Loader Two", 15);
    PDCLCDSetPos(0, 1);
    PDCLCDWrite("press usr button", 16);

    //
    // Enable the GPIO pin to read the select button.
    //
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA,
                     GPIO_PIN_TYPE_STD_WPU);

    //
    // Wait until the select button has been pressed.
    //
    while(GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_4) != 0)
    {
    }
//这里检测按键是否有被按下 ,按下了再执行下面的调用bootloader 去更新芯片 ,
//否则不更新

    //
    // Drain any data that may be in the UART fifo.
    //
    while(UARTCharsAvail(UART0_BASE))
    {
        UARTCharGet(UART0_BASE);
    }

    //
    // Indicate that the boot loader is being called.
    //
    PDCLCDSetPos(0, 1);
    PDCLCDWrite("awaiting update ", 16);
 
   IntMasterDisable();在你调用 bootloader 之前先要禁止任何中断产生 。
    //
    // Call the boot loader so that it will listen for an update on the UART.
    //
    (*((void (*)(void))(*(unsigned long *)0x2c)))();
}

 

另外一个要特别注意的 地方,在你调用bootloader 之前 一定要把总中断disable ,否则uart 通信会连不上。这个在driverlib 上没有写到 。

 

 

 

 

 

 

 

 

 

 

 

 

如何来定义程序烧录的位置呢 ?

我们需要来修改分散加载文件 。
在DRIVERLIB 里面 ,IAR SYSTEM的PROJECT一般用到的文件是 :D:/DriverLib/ewarm/standalone.xcl .

使用lm3s811 ,如果你要把程序装到从0x00开始的位置 那么使用 下面设置 :

-DROMSTART=00000000
-DROMEND=0003FFFF
-DRAMSTART=20000000
-DRAMEND=2000FFFF

产生 bin 文件 ,烧录的时候用LM FLASH PROGRAMMER ,如图 : 

 


此主题相关图片如下:
按此在新窗口浏览图片

如果你要把程序烧到从0x800开始的位置 ,使用下面的设置 :
-DROMSTART=00000800
-DROMEND=0000f800
-DRAMSTART=20000000
-DRAMEND=20002000
产生 bin 文件 ,烧录的时候用LM FLASH PROGRAMMER ,如图 : 

此主题相关图片如下:
按此在新窗口浏览图片

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值