您的位置:首页 > 其它

Luminary ARM 芯片bootloader用法

2010-01-25 12:27 246 查看
出厂的芯片内置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 ,如图 :



此主题相关图片如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: