开源小项目LGT8F08A的USB引导程序: USeeBoot
USeeBoot: 又一个LGT的USB引导程序[*]可在特定条件下,例如上电时PB2为低电平进入升级状态,升级条件可配置。
[*]应用程序代码无需更改,不需要将引导和应用程序链接到一起使用。
[*]自动重建中断向量,升级烧写时断电也不会变砖。
[*]Win32 GUI烧写程序
[*]FLASH第0页预留为中断向量使用,第1页至第5页为引导程序。
[*]应用程序的基地址为0x600(FLASH第六页起始)
默认的硬件配置为:
USB_DP --- PA0
USB_DN --- PA1
晶振 --- 16Mhz
引导模式 --- 上电时如果PB3=LOW或者应用程序区前4个字节都为0xFF则进入升级模式
如何使用:
1. 首先,你需要有一个现成的LGT编程器可以使用。
2. 如果你的USB硬件配置和上面的默认配置不同,你需要修改firmware\atmel_studio\board.h中的配置代码,并且重新编译程序。
3. 如果使用的晶振是12Mhz,将工程中的usbdrvasm16.inc文件替换为usbdrvasm12.inc。
4. 将编译得到的USBoot.hex文件使用编程器烧写到芯片中。
5. 此时芯片中的应用程序区全部为0xFF,USBoot会自动进入USB升级模式。
4. 连接LGT主板到PC上,使用software\libusb-win32\bin\inf-wizard.exe为其安装驱动程序。
5. 打开USBoot烧写程序software\bin\USBootPROG.exe,此时程序左下角应该显示“设备已连接”。
6. 点击“Hex文件”按钮选择应用程序的hex文件,点击写入按钮开始烧写。
7. 烧写完成以后,复位LGT芯片即可。
8. 需要再一次进入升级模式时,将PB3短接到地,重新上电即可。
USBoot源代码及工程(Atmel Studio 6.1):
硬件配置原理图:
Win32 GUI烧写程序:
烧写程序源代码及工程(VS2008):
注意:
应用程序的源代码无需做任何更改就可以使用USBoot烧写到芯片中。但是必须在编译时设置应用程序的基地址为0x600。在atmel studio中的配置如下图所示:
================作者罗嗦分割线 ===================
这个Boot使用了中断向量平移的方法,将除了复位向量以外的所有中断转移到应用程序区。当进入升级模式的时候,引导在INT0中断向量的位置上默默的写入自己的INT0中断处理函数地址。
当重新进入应用程序以前,引导会将自己的中断函数地址从中断向量中拿掉,写入转跳到应用程序区的代码。
这样做的原因是,LGT没有中断向量重映射的功能。因为必须重写中断向量区,所以FLASH的第0个页只能保留给中断向量(512字节)。
引导程序包含完整的V-USB代码以及FLASH编程驱动。编译完成以后大约为2.4KB左右(占用2560字节空间)。
所以,引导实际占用的空间为6个页=3KB。留给应用程序的空间为5KB。
对于8KB的FLASH来说,引导占用的空间很大。如果板子可以方便的使用ISP下载,使用ISP下载是更好的选择。
如果不能使用ISP下载,应用程序本身又小于5KB的话,USBoot还是具有一定的使用价值。
完成度很高的项目,非常不错! 多谢支持!! 之前有个linux的bootloader 这回win终于也有了 不知道3k能否继续精简 {:smile:}{:smile:}{:smile:}{:smile:} 上次我也做过个HID模式的bootloader…… 我的做法是引导程序在高2560B字节上驻留,无需改用户程序。在INT0上加个判断语句。把应用程序的INT0转写到另外的向量上。 不过我比较奇怪的问题就是说,上位机来USB包的时候写入会导致CPU停掉失去响应使上位机踢掉设备。你怎么解决的…… 顶, 好贴! {:smile:}好帖,挺 今天闲得没事,下载编译了一遍,有下面的错误:
Error 1 'EEDHR' undeclared (first use in this function) F:\AVRStudio\LGTBoot\flash.c 37 3 USBoot
头文件里只见有个:
#define EEDRH (*(volatile unsigned char *)0x49)
应该是楼主笔误吧?! 好帖,挺 谢谢分享................
页:
[1]