您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > atmel Studio 6.1环境下的bootloader
网上有关AVR的bootloader配置大部分都是关于ICCAVR的,我用AtmelStudio6.1弄了好久才出来,这里给大家讲下(我用的AT90CAN32)首先程序和马老师的几乎一样,只是稍微有改进,因为AtmelStudio6.1本身有boot.h文件,包含该文件之后可以省去一些汇编的语言。程序会在最后附上。下面主要说下配置问题。1、熔丝位配置:如图1图1JTAGEN或SPIEN一定要打勾使能,要不然如果bootloader烧写不成功以后就不能用JTAG或SPI了,那么单片机就锁死了,我就锁死了一个单片机,哭晕。。。BOOTSZ;选择1k或2k或3k或4kBOOTRST:打勾,这样的话程序会从bootloader定义的地址开始烧写,比如我的程序会从0X3800开始写入2、如图2点击project——文件名porperties——toolchain出现如图3所示,点击memorysettings,在FLASHsegment中输入.text=0x3800(注意0x3800是和熔丝位设置的bootloader区的大小一样的)图2图3点击Misellaneous,输入-WI,--section-start=.text=0x7000(其中0x7000是0x3800的二倍,如果你设置的不是0x3800,那么也只需要按照你设置的乘以2就行)图4到这里就配置完成了。如果配置完成了,那么正常情况下就可以把程序烧写进入单片机了,这时候用串口就可以从单片机向上位机发送指令了,如果三秒钟之内给单片机回复d的话,单片机回复C之后,就可以向单片机发送命令了,这里用的是超级终端,WIN7本身没有超级终端,需要下载,我下载的是如图5所示的超级终端。打开超级终端时候注意配置波特率和结束位等,还有就是发送文件时注意选择XMODEM协议。剩下的就可以按照ICCAVR的方法进行发送和接收了,这里主要说的是配置方法和ICCAVR的不同图5#includeavr/io.h#includeavr/boot.h#includeinttypes.h#includeavr/interrupt.h#includeavr/pgmspace.h#includeutil/delay.h#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|=(1PORTE2)//USART0发送使能#defineUSART0_RPORTE&=~(1PORTE2)//USART0接收使能/*voidboot_page_ew(longp_address,charcode){asm(movr30,r22\nmovr31,r23\nout0x3b,r24\n);//将页地址放入Z寄存器和RAMPZ的Bit0中SPMCSR=code;//寄存器SPMCSR中为操作码asm(spm\n);//对指定Flash页进行操作}//填充Flash缓冲页中的一个字voidboot_page_fill_1(unsignedintaddress,intdata){asm(movr30,r24\nmovr31,r25\n//Z寄存器中为填冲页内地址movr0,r22\nmovr1,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;iSPM_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页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;iSPM_PAGESIZE;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_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;iSPM_PAGESIZE;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).SREG=sreg;}*///从RS232发送一个字节voiduart_putchar(charc){while(!(UCSR0A&0x20));UDR0=c;}//从RS232接收一个字节intuart_getchar(void){unsignedcharstatus,res;if(!(UCSR0A&0x80))return-1;//nodatatobereceivedstatus=UCSR0A;res=UDR0;if(status&0x1c)return-1;//Iferror,return-1returnres;}//等待从RS232接收一个有效的字节charuart_waitchar(void){intc;while((c=uart_getchar())==-1);return(char)c;}//计算CRCintcalcrc(char*ptr,intcount){intcrc=0;chari;while(--count=0){crc=crc^(int)*ptr++8;i=8;do{if(crc&0x8000)crc=crc1^0x1021;elsecrc=crc1;}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);//SetbaudrateUBRR0H=(CRYSTAL/BAUD/16-1)8;UBRR0L=CRYSTAL/BAUD/16-1;//SetbaudrateUCSR0B=0x18;//EnableReceiverandTransmitterUCSR0C=0x0E;//Setframeformat:8data,2stopbit//初始化M128的T/C0,15ms自动重载TCCR3B=(1WGM32)|(1CS31)|(1CS30);//64分频,CTC模式TIMSK3=(1OCIE3A);TIFR3=(1TOV3);TCNT3H=0;TCNT3L=0;OCR3AH=0x03;//定时为5ms,0x030DOCR3AL=0x0D;//向PC机发送开始提示信息while(startupString[i]!='\0'){USART0_T;uart_putchar(startupString[i]);i++;}//3秒种等待PC下发“d”,否则退出Bootloader程序,从0x0000处执行应用程序while(1){if(ua
本文标题:atmel Studio 6.1环境下的bootloader
链接地址:https://www.777doc.com/doc-4307899 .html