| 
 | 
 
 最近做UCGUI,程序代码写到180K,每次用JLINK下载到电路板,最少20秒,看效果,不满意,改动一点,再下载,又是20秒,真心服了JLINK的龟速。于是自己编了一个快速下载的BOOTLOAD和上位机。 
用串口6Mbps下载(烂大街的USB转串口PL2303HX其实是支持6Mbps的,10cm短线),每次下载2秒钟左右,调试起来爽多了。以下贡献源代码和BOOTLOADER。还有上位机软件。         
 
下载速度:180k的程序, 
                                        6Mbps+全校验 1.72秒 
                                        3mbps+全校验 2.3秒 
                                        6mbps+快速校验 1.34秒 
                                        6mbs+不校验 1.18秒 
 
使用方法:用USB转串口线,和LPC1788的串口0连好,按以下设置好工程,在keil中点击DOWNLOAD(此处与JLINK不一样),弹出控制台应用程序,再按电路板的复位按钮,马上开始下载,大约2秒钟下载完毕,自动运行看电路板效果。 
如果需要调试,直接按调试按钮,此时不必下载hex直接进入调试,调试过程照旧。 
调试图片(可以看到复位向量在0x4000处): 
 
另一个思路,上位机使用-r参数,可以不用复位按钮,上位机启动的时候,会向下位机发一个字节,下位机可以接收这个数据,然后软复位执行Bootloader更新,详情查看下面命令行参数-r; 
 
 
目标工程的设置: 
        (1),在工程选项-Utilities-Use External Tool For Flash Programming选上,意思是使用自定义的编程工具来烧写flash. 
        (2),Command里面填写 lpc_bl.exe,Run Independent打钩,并把上位机软件拷贝到与hex文件相同的目录。 
        (3),Arguments这里填上 -p 4 -h 123.hex -ua 0x00004000 -vv -s 6000000 -r, 
                                这里,-p 4,表示使用串口4通信,也就是USB转232的串口号, 
                                -h 123.hex 表示目标文件是hex文件,文件名123.hex, 
                                -ua 0x00004000,表示目标文件的用户入口地址是0x00004000,因为0到16k范围地址位置是本bootloader占用了,所以用户代码放到16k开始的位置。 
                                -vv 表示快速校验,每4K空间产生一个CRC16校验码进行校验。也可以用-v,这个是全校验,确保写入正确。 
                                -s 6000000 表示串口下载速度是6Mbps。可根据实际需要选择,下位机BOOTLOADER有3Mbps和6Mbps两个版本。 
                                -r 表示软件启动的时候,向串口发送一个字节0x11,目标程序可以接收这个字节,并软复位,自动更新,而不用按复位键。注意1788的串口0要达到6Mbps,则PCLK至少有96MHz。 
        (4),设置分散加载文件,在工程选项-Linker,将Use Memory Layout form Target Dialog去掉,在Scatter File指定一个.sct文件,主要是设置将程序编译到16k的位置,也可以使用下面例子 
                                ; ************************************************************* 
                                ; *** Scatter-Loading Description File generated by uVision *** 
                                ; ************************************************************* 
 
                                LR_IROM1 0x00004000 0x0007c000  {    ; load region size_region 
                                  ER_IROM1 0x00004000 0x0007c000  {  ; load address = execution address 
                                   *.o (RESET, +First) 
                                   *(InRoot$$Sections) 
                                   .ANY (+RO) 
                                  } 
                                  RW_IRAM1 0x10000000 0x00010000  {  ; RW data 
                                   .ANY (+RW +ZI) 
                                  } 
                                  RW_IRAM2 0x20000000 0x00008000  { 
                                   .ANY (+RW +ZI) 
                                  } 
                                } 
        (5),设置创建hex文件,在工程选项-Output,勾上Create Hex File。 
        (6),注意的是,虽然在跳转到用户应用程序之前,BootLoader内部已经将新的向量指向用户应用程序。但如果用户应用程序调用了官方默认 
                        的system_LPC177x_8x.c的SystemInit函数,则向量指针会在该函数内部修改为0。这里需要将该函数做修改: 
                        #endif 
                        #ifdef  __RAM_MODE__ 
                          SCB->VTOR  = 0x10000000 & 0x3FFFFF80; 
                        #else 
                          SCB->VTOR  = 0x00004000 & 0x3FFFFF80; 
                          //SCB->VTOR  = 0x00000000 & 0x3FFFFF80; 
                        #endif 
此处修改,当产品发布,不使用这个BOOTLOADER的时候,记得恢复原样。 
 
 
附件下载: 
        上位机软件: 
        下位机bootloader源码: 
        一个LED闪烁的范例(工程已设置好,支持串口复位自动下载,第一次下载时按复位键,以后可以不用按复位键): 
 
        目前尚有缺陷,下载速度没达到最理想的效果,在试验双缓冲一边IAP写扇区的时候,一边串口DMA接数据,发现有冲突,有些数据收不到,目前查不到原因。这个如果做到的话,烧写速度能再提高1倍,有可能是LPC内部的IAP部分占用了串口资源或者改动了系统频率等原因。 
 
 |   
 
 
 
 |