atmelStudio61环境下的bootloaderWord文件下载.docx
- 文档编号:16004081
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:13
- 大小:134.87KB
atmelStudio61环境下的bootloaderWord文件下载.docx
《atmelStudio61环境下的bootloaderWord文件下载.docx》由会员分享,可在线阅读,更多相关《atmelStudio61环境下的bootloaderWord文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
#defineSPM_PAGESIZE256//M128的一个Flash页为256字节(128字)
#defineBAUD9600//波特率采用38400bps
#defineCRYSTAL10000000//系统时钟8MHz
#definebaud_l(UCHAR)(baud_setting)//低位
#defineUCHARunsignedchar
#defineUINTunsignedint
#defineULONGunsignedlong
#defineUSHOTunsignedshort
#defineDATA_BUFFER_SIZESPM_PAGESIZE//定义接收缓冲区长度
//定义Xmoden控制字符
#defineXMODEM_NUL0x00
#defineXMODEM_SOH0x01
#defineXMODEM_STX0x02
#defineXMODEM_EOT0x04
#defineXMODEM_ACK0x06
#defineXMODEM_NAK0x15
#defineXMODEM_CAN0x18
#defineXMODEM_EOF0x1A
#defineXMODEM_RECIEVING_WAIT_CHAR'
C'
//定义全局变量
constcharstartupString[]="
Type'
d'
download,Othersrunapp.\n\r\0"
;
UCHARdata[DATA_BUFFER_SIZE];
longaddress=0;
#defineUSART0_TPORTE|=(1<
<
PORTE2)//USART0发送使能
#defineUSART0_RPORTE&
=~(1<
PORTE2)//USART0接收使能
/*
voidboot_page_ew(longp_address,charcode)
{
asm("
movr30,r22\n"
"
movr31,r23\n"
out0x3b,r24\n"
);
//将页地址放入Z寄存器和RAMPZ的Bit0中
SPMCSR=code;
//寄存器SPMCSR中为操作码
spm\n"
//对指定Flash页进行操作
}
//填充Flash缓冲页中的一个字
voidboot_page_fill_1(unsignedintaddress,intdata)
movr30,r24\n"
movr31,r25\n"
//Z寄存器中为填冲页内地址
movr0,r22\n"
movr1,r23\n"
//R0R1中为一个指令字
SPMCSR=0x01;
//等待一个Flash页的写完成
voidwait_page_rw_ok(void)
while(SPMCSR&
0x40)
0x01);
SPMCSR=0x11;
//更新一个Flash页的完整处理
voidwrite_one_page(void)
inti;
boot_page_ew(address,0x03);
//擦除一个Flash页
wait_page_rw_ok();
//等待擦除完成
for(i=0;
i<
SPM_PAGESIZE;
i+=2)//将数据填入Flash缓冲页中
boot_page_fill_1(address+i,data[i]+(data[i+1]<
8));
//boot_page_fill_1(0x5555,0x4444);
boot_page_ew(address,0x05);
//将缓冲页数据写入一个Flash页
//等待写入完成
}*/
//更新一个Flash页的完整处理
inti;
uint8_tsreg;
sreg=SREG;
UINTK;
//cli();
//eeprom_busy_wait();
boot_page_erase(address);
//擦除一个Flash页
boot_spm_busy_wait();
for(i=0;
i+=2)//将数据填入Flash缓冲页中
{
K=data[i]+data[i+1]*256;
boot_page_fill(address+i,K);
//boot_page_fill(address+i,0x1234);
}
boot_page_write(address);
//将缓冲页数据写入一个Flash页
//boot_rww_enable();
SREG=sreg;
voidboot_program_page(uint32_tpage,uint8_t*buf)
uint16_ti;
//Disableinterrupts.
cli();
eeprom_busy_wait();
boot_page_erase(page);
//Waituntilthememoryiserased.
for(i=0;
i<
i+=2)
//Setuplittle-endianword.
uint16_tw=*buf++;
w+=(*buf++)<
8;
boot_page_fill(page+i,w);
boot_page_write(page);
//Storebufferinflashpage.
boot_spm_busy_wait();
//Waituntilthememoryiswritten.
//ReenableRWW-sectionagain.Weneedthisifwewanttojumpback
//totheapplicationafterbootloading.
boot_rww_enable();
//Re-enableinterrupts(iftheywereeverenabled).
}*/
//从RS232发送一个字节
voiduart_putchar(charc)
while(!
(UCSR0A&
0x20));
UDR0=c;
//从RS232接收一个字节
intuart_getchar(void)
unsignedcharstatus,res;
if(!
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++<
i=8;
do
{
if(crc&
0x8000)
crc=crc<
1^0x1021;
else
1;
}while(--i);
return(crc);
//退出Bootloader程序,从0x0000处执行应用程序
voidquit(void)
uart_putchar('
O'
uart_putchar('
K'
uart_putchar(0x0d);
uart_putchar(0x0a);
//等待结束提示信息回送完成
MCUCR=0x01;
MCUCR=0x00;
//将中断向量表迁移到应用程序区头部
RAMPZ=0x00;
//RAMPZ清零初始化
SPMCSR=SPMCSR&
0XFE;
boot_rww_enable();
asm("
jmp0x0000\n"
//跳转到Flash的0x0000处,执行用户的应用程序
//主程序
voidmain(void)
inti=0;
unsignedinttimercount=0;
unsignedcharpackNO=1;
intbufferPoint=0;
unsignedintcrc;
UCHARK1,K2;
//初始化M128的USART0(UINT)((ULONG)CRYSTAL/(8*(ULONG)BAUD)-1)
//UBRR0H=(UINT)((ULONG)CRYSTAL/(8*(ULONG)BAUD)-1)>
>
8;
//UBRR0L=(UINT)((ULONG)CRYSTAL/(8*(ULONG)BAUD)-1);
//Setbaudrate
UBRR0H=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- atmelStudio61 环境 bootloader