出厂的芯片内置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 ,如图 :
此主题相关图片如下: