mega128A的bootloader程序.docx
- 文档编号:24581472
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:7
- 大小:17.04KB
mega128A的bootloader程序.docx
《mega128A的bootloader程序.docx》由会员分享,可在线阅读,更多相关《mega128A的bootloader程序.docx(7页珍藏版)》请在冰豆网上搜索。
mega128A的bootloader程序
/*****************************************************
采用串行接口实现Boot_load应用的实例
郑州轻工业学院周豪2014.11.3
Compiler:
ICC-AVR7
Target:
Mega128A
Crystal:
147456Mhz
Used:
T/C0,USART0
*****************************************************/
#include"iom128v.h"
#defineSPM_PAGESIZE256//M128的一个Flash页为256字节(128字)
#defineDATA_BUFFER_SIZESPM_PAGESIZE//定义接收缓冲区长度
//******************************波特率修改此处**************************************************
#definegao2
#definedi255//1200
//**********************************************************************************
//定义Xmoden控制字符
#defineXMODEM_NUL0x00
#defineXMODEM_SOH0x01
#defineXMODEM_STX0x02
#defineXMODEM_EOT0x04
#defineXMODEM_ACK0x06
#defineXMODEM_NAK0x15
#defineXMODEM_CAN0x18
#defineXMODEM_EOF0x1A
#defineXMODEM_RECIEVING_WAIT_CHAR'C'
//定义全局变量
constunsignedcharstartupString[]="Type'd'download,Othersrunapp.\n\r\0";
unsignedchardata[DATA_BUFFER_SIZE];
longaddress=0;
//擦除(code=0x03)和写入(code=0x05)一个Flash页
voidboot_page_ew(longp_address,charcode)
{
asm("movr30,r16\n"
"movr31,r17\n"
"out0x3b,r18\n");//将页地址放入Z寄存器和RAMPZ的Bit0中
SPMCSR=code;//寄存器SPMCSR中为操作码
asm("spm\n");//对指定Flash页进行操作
}
//填充Flash缓冲页中的一个字
voidboot_page_fill(unsignedintaddress,intdata)
{
asm("movr30,r16\n"
"movr31,r17\n"//Z寄存器中为填冲页内地址
"movr0,r18\n"
"movr1,r19\n");//R0R1中为一个指令字
SPMCSR=0x01;
asm("spm\n");
}
//等待一个Flash页的写完成
voidwait_page_rw_ok(void)
{
while(SPMCSR&0x40)
{
while(SPMCSR&0x01);
SPMCSR=0x11;
asm("spm\n");
}
}
//更新一个Flash页的完整处理
voidwrite_one_page(void)
{
inti;
boot_page_ew(address,0x03);//擦除一个Flash页
wait_page_rw_ok();//等待擦除完成
for(i=0;i { boot_page_fill(i,data[i]+(data[i+1]<<8)); } boot_page_ew(address,0x05);//将缓冲页数据写入一个Flash页 wait_page_rw_ok();//等待写入完成 } //从RS232发送一个字节 voiduart_putchar(unsignedchardat) { while(! (UCSR0A&0x20)); UDR0=dat; } //从RS232接收一个字节 intuart_getchar(void) { unsignedcharstatus,res; if(! (UCSR0A&0x80))return-1;//nodatatobereceived status=UCSR0A; res=UDR0; if(status&0x1c)return-1;//Iferror,return-1 returnres; } //等待从RS232接收一个有效的字节 charuart_waitchar(void) { intc; while((c=uart_getchar())==-1); return(char)c; } //计算CRC intcalcrc(char*ptr,intcount) { intcrc=0; chari; while(--count>=0) { crc=crc^(int)*ptr++<<8; i=8; do { if(crc&0x8000) crc=crc<<1^0x1021; else crc=crc<<1; }while(--i); } return(crc); } voidquit(void) { uart_putchar('O');uart_putchar('K'); uart_putchar(0x0d);uart_putchar(0x0a); while(! (UCSR0A&0x20));//等待结束提示信息回送完成 MCUCR=0x01; MCUCR=0x00;//将中断向量表迁移到应用程序区头部 RAMPZ=0x00;//RAMPZ清零初始化 asm("jmp0x0000\n");//跳转到Flash的0x0000处,执行用户的应用程序 } voiddelay() { unsignedintx,y; for(x=100;x>0;x--) for(y=200;y>0;y--); } //主程序 voidmain(void) { inti=0,k=0; unsignedinttimercount=0; unsignedcharpackNO=1; intbufferPoint=0; unsignedintcrc; unsignedintx,y; //初始化M128的USART0 //UCSR0A=0x00; UCSR0B=0x00; UCSR0A=0x00; UCSR0C=0x0E;//Setframe.format: 8data,2stopbit,无校验位 UBRR0H=gao; UBRR0L=di;//Setbaudrate(波特率设定,修改此处) UCSR0B=0x18;//EnableReceiverandTransmitter //初始化M128的T/C0,15ms自动重载 OCR0=0xEA; TCCR0=0x0F; //向PC机发送开始提示信息 while(startupString[i]! ='\0') { uart_putchar(startupString[i]); i++; } //3秒种等待PC下发"d",否则退出Bootloader程序,从0x0000处执行应用程序 while (1) { if(uart_getchar()=='d')break; if(TIFR&0x02)//timer0overflow { if(++timercount>600){quit();uart_putchar(0x11);};//200*15ms=3s TIFR=TIFR|0x02; } } //每秒向PC机发送一个控制字符"C",等待控制字〈soh〉 while(uart_getchar()! =XMODEM_SOH)//receivethestartofXmodem { if(TIFR&0x02)//timer0overflow { if(++timercount>67)//waitabout1second { uart_putchar(XMODEM_RECIEVING_WAIT_CHAR);//senda"C" timercount=0; } TIFR=TIFR|0x02; } } //开始接收数据块 do { if((packNO==uart_waitchar())&&(packNO==(~uart_waitchar()))) {//核对数据块编号正确 for(i=0;i<128;i++)//接收128个字节数据 { data[bufferPoint]=uart_waitchar(); bufferPoint++; } crc=(uart_waitchar()<<8); crc+=uart_waitchar();//接收2个字节的CRC效验字 if(calcrc(&data[bufferPoint-128],128)==crc)//CRC校验验证 {//正确接收128个字节数据 while(bufferPoint>=SPM_PAGESIZE) {//正确接受256个字节的数据 write_one_page();//收到256字节写入一页Flash中 address+=SPM_PAGESIZE;//Flash页加1 bufferPoint=0; } uart_putchar(XMODEM_ACK);//正确收到一个数据块 packNO++;//数据块编号加1 } else { uart_putchar(XMODEM_NAK);//要求重发数据块 } } else { uart_putchar(XMODEM_NAK);//要求重发数据块 } }while(uart_waitchar()! =XMODEM_EOT);//循环接收,直到全部发完 uart_putchar(XMODEM_ACK);//通知PC机全部收到 if(bufferPoint)write_one_page();//把剩余的数据写入Flash中 quit();//退出Bootloader程序,从0x0000处执行应用程序 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mega128A bootloader 程序