[原创]Mega128的bootloader例程.
也可以参考这里的贴子:
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=156462&bbs_page_no=3&bbs_id=1003
串口通讯,页写入等,就是每写一页就要写256个字节.
上位机用VB 做了一个读HEX的文件并一帧是256个字节就行了.
整个程序用了1K 的50%...晶振用7.3728M...波特率用115200bps..
下载64K的程序只需<= 9秒 128K也不用超过20秒
爽!!!不过我调试了一个晚才搞定的...
(我2002年接触了一下AVR,去双龙买了几块M8的芯片,并送了一本马老师编的书.那时候例程较少.后来由于项目中不要用到就没有玩了..现在要做一个项目 所以 又捡起来了.一到网上一搜还挺多东东的..)
我的程序主体结构抄了一下国外的 http://www.microsyl.com/megaload/megaload.html
也参照了 M8 ,M16的 http://www.527dz.com/circuit/BootLoad.htm
基本上没有什么区别,只是通讯的接口不同.其实主要的是马老师上面的那三个重要操作(如,写,擦,).
只要改一改就可以适合自己用的了..
参考上面的例程时要注意一下就是SPM寄存器的地址是不同的..不过在头文件里有了
SPMCR SPMCSR 寄存器不同的芯片有所不同..::
MEGA64和MEGA128的
SPMCSR = 0x68
M8---M32的
SPMCR = 0x57
M128要注意切换高64K和低64K 通过对RAMPZ置1和置0来实现..
PC端可能要自己做会比较好一些(因为自己想怎么样就怎么样)...
在应该程序中也要加入通讯,由PC发指令进入bootloader.
我不建义从bootloader启动..除非是自己调试用..
做成产品一般是从应用程序启动....
#define UCSRA UCSR0A
#define UCSRB UCSR0B
#define UCSRC UCSR0C
#define UBRRL UBRR0L
#define UBRRH UBRR0H
#define UDR UDR0
unsigned char IsChar(void)
{
if(UCSRA & 0x80) return 1;
else return 0;
}
void TxChar(unsigned char ch)
{
while(!(UCSRA & 0x20)); // wait for empty transmit buffer
UDR = ch; // write char