导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→Luminary ARM 芯片bootl[哈佛]

 *第17500篇: Luminary ARM 芯片bootloader用法

  
楼 主:哈佛 2008年2月26日23:09
 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 上没有写到 。



>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:深圳单片机软硬件开发

[下一篇主题]:[原创]承接电子产品设计开发生产