atmelStudio61环境下的bootloader.docx
- 文档编号:3093143
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:13
- 大小:134.87KB
atmelStudio61环境下的bootloader.docx
《atmelStudio61环境下的bootloader.docx》由会员分享,可在线阅读,更多相关《atmelStudio61环境下的bootloader.docx(13页珍藏版)》请在冰豆网上搜索。
atmelStudio61环境下的bootloader
atmel-Studio-6.1环境下的bootloader
网上有关AVR的bootloader配置大部分都是关于ICCAVR的,我用AtmelStudio6.1弄了好久才出来,这里给大家讲下(我用的AT90CAN32)
首先程序和马老师的几乎一样,只是稍微有改进,因为AtmelStudio6.1本身有boot.h文件,包含该文件之后可以省去一些汇编的语言。
程序会在最后附上。
下面主要说下配置问题。
1、熔丝位配置:
如图1
图1
JTAGEN或SPIEN一定要打勾使能,要不然如果bootloader烧写不成功以后就不能用JTAG或SPI了,那么单片机就锁死了,我就锁死了一
择XMODEM协议。
剩下的就可以按照ICCAVR的方法进行发送和接收了,这里主要说的是配置方法和ICCAVR的不同
图5
#include
#include
#include
#include
#include
#include
#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< #defineUSART0_RPORTE&=~(1< /* voidboot_page_ew(longp_address,charcode) { asm("movr30,r22\n" "movr31,r23\n" "out0x3b,r24\n");//将页地址放入Z寄存器和RAMPZ的Bit0中 SPMCSR=code;//寄存器SPMCSR中为操作码 asm("spm\n");//对指定Flash页进行操作 } //填充Flash缓冲页中的一个字 voidboot_page_fill_1(unsignedintaddress,intdata) { asm("movr30,r24\n" "movr31,r25\n"//Z寄存器中为填冲页内地址 "movr0,r22\n" "movr1,r23\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_1(address+i,data[i]+(data[i+1]<<8)); //boot_page_fill_1(0x5555,0x4444); } boot_page_ew(address,0x05);//将缓冲页数据写入一个Flash页 wait_page_rw_ok();//等待写入完成 }*/ //更新一个Flash页的完整处理 voidwrite_one_page(void) { inti; uint8_tsreg; sreg=SREG; UINTK; //cli(); //eeprom_busy_wait(); boot_page_erase(address);//擦除一个Flash页 boot_spm_busy_wait();//等待擦除完成 for(i=0;i { 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_spm_busy_wait();//等待写入完成 //boot_rww_enable(); SREG=sreg; } /* voidboot_program_page(uint32_tpage,uint8_t*buf) { uint16_ti; uint8_tsreg; //Disableinterrupts. sreg=SREG; cli(); eeprom_busy_wait(); boot_page_erase(page); boot_spm_busy_wait();//Waituntilthememoryiserased. for(i=0;i { //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). SREG=sreg; }*/ //从RS232发送一个字节 voiduart_putchar(charc) { while(! (UCSR0A&0x20)); UDR0=c; } //从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); } //退出Bootloader程序,从0x0000处执行应用程序 voidquit(void) { uart_putchar('O');uart_putchar('K'); uart_putchar(0x0d);uart_putchar(0x0a); while(! (UCSR0A&0x20));//等待结束提示信息回送完成 MCUCR=0x01; MCUCR=0x00;//将中断向量表迁移到应用程序区头部 RAMPZ=0x00;//RAMPZ清零初始化 SPMCSR=SPMCSR&0XFE; boot_rww_enable(); asm("jmp0x0000\n");//跳转到Flash的0x0000处,执行用户的应用程序 uart_putchar('O');uart_putchar('K'); } //主程序 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
![提示](https://static.bdocx.com/images/bang_tan.gif)