atmel-Studio-6.1环境下的bootloader.docx_第1页
atmel-Studio-6.1环境下的bootloader.docx_第2页
atmel-Studio-6.1环境下的bootloader.docx_第3页
atmel-Studio-6.1环境下的bootloader.docx_第4页
atmel-Studio-6.1环境下的bootloader.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网上有关AVR的bootloader配置大部分都是关于ICCAVR的,我用Atmel Studio 6.1弄了好久才出来,这里给大家讲下(我用的AT90CAN32)首先程序和马老师的几乎一样,只是稍微有改进,因为Atmel Studio 6.1本身有boot.h文件,包含该文件之后可以省去一些汇编的语言。程序会在最后附上。下面主要说下配置问题。1、熔丝位配置:如图1图1JTAGEN 或SPIEN一定要打勾使能,要不然如果bootloader烧写不成功以后就不能用JTAG或SPI了,那么单片机就锁死了,我就锁死了一个单片机,哭晕。BOOTSZ;选择1k或2k或3k或4kBOOTRST:打勾,这样的话程序会从bootloader定义的地址开始烧写,比如我的程序会从0X3800开始写入2、如图2点击project文件名porpertiestoolchain出现如图3所示,点击memory settings,在FLASH segment 中输入.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#include #include#include #include #include #include #define SPM_PAGESIZE 256 /M128的一个Flash页为256字节(128字)#define BAUD 9600/波特率采用38400bps#define CRYSTAL 10000000 /系统时钟8MHz#define baud_l (UCHAR)(baud_setting) /低位#define UCHAR unsigned char#define UINT unsigned int#define ULONG unsigned long#define USHOT unsigned short#define DATA_BUFFER_SIZE SPM_PAGESIZE /定义接收缓冲区长度/定义Xmoden控制字符#define XMODEM_NUL 0x00#define XMODEM_SOH 0x01#define XMODEM_STX 0x02#define XMODEM_EOT 0x04#define XMODEM_ACK 0x06#define XMODEM_NAK 0x15#define XMODEM_CAN 0x18#define XMODEM_EOF 0x1A#define XMODEM_RECIEVING_WAIT_CHAR C/定义全局变量const char startupString=Type d download, Others run app.nr0;UCHAR dataDATA_BUFFER_SIZE;long address = 0;#define USART0_TPORTE |= (1PORTE2) /USART0发送使能#define USART0_RPORTE &= (1PORTE2) /USART0接收使能/*void boot_page_ew(long p_address,char code)asm(mov r30,r22nmov r31,r23nout 0x3b,r24n); /将页地址放入 Z 寄存器和 RAMPZ 的 Bit0 中SPMCSR = code; /寄存器 SPMCSR 中为操作码asm(spmn); /对指定 Flash 页进行操作/填充 Flash 缓冲页中的一个字void boot_page_fill_1(unsigned int address,int data)asm(mov r30,r24nmov r31,r25n /Z 寄存器中为填冲页内地址mov r0,r22nmov r1,r23n); /R0R1 中为一个指令字SPMCSR = 0x01;asm(spmn);/等待一个 Flash 页的写完成void wait_page_rw_ok(void)while(SPMCSR & 0x40)while(SPMCSR & 0x01);SPMCSR = 0x11;asm(spmn);/更新一个 Flash 页的完整处理void write_one_page(void)int i;boot_page_ew(address,0x03); /擦除一个 Flash 页wait_page_rw_ok(); /等待擦除完成for(i=0;iSPM_PAGESIZE;i+=2) /将数据填入 Flash 缓冲页中boot_page_fill_1(address+i, datai+(datai+18);/boot_page_fill_1(0x5555, 0x4444);boot_page_ew(address,0x05); /将缓冲页数据写入一个 Flash 页wait_page_rw_ok(); /等待写入完成*/更新一个Flash页的完整处理void write_one_page(void)int i;uint8_t sreg; sreg = SREG;UINT K;/cli();/eeprom_busy_wait ();boot_page_erase(address); /擦除一个Flash页boot_spm_busy_wait (); /等待擦除完成for(i=0;iSPM_PAGESIZE;i+=2) /将数据填入Flash缓冲页中K=datai+datai+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;/*void boot_program_page (uint32_t page, uint8_t *buf) uint16_t i; uint8_t sreg; / Disable interrupts. sreg = SREG; cli(); eeprom_busy_wait (); boot_page_erase (page); boot_spm_busy_wait (); / Wait until the memory is erased. for (i=0; iSPM_PAGESIZE; i+=2) / Set up little-endian word. uint16_t w = *buf+; w += (*buf+) = 0)crc = crc (int) *ptr+ 8;i = 8;doif (crc & 0x8000)crc = crc 1 0x1021;elsecrc = crc 8;/UBRR0L = (UINT)(ULONG)CRYSTAL/(8*(ULONG)BAUD)-1); /Set baud rateUBRR0H = (CRYSTAL/BAUD/16-1)8; UBRR0L = CRYSTAL/BAUD/16-1; /Set baud rateUCSR0B = 0x18; /Enable Receiver and TransmitterUCSR0C = 0x0E; /Set frame format: 8data, 2stop bit/初始化M128的T/C0,15ms自动重载TCCR3B = (1WGM32)|(1CS31)|(1CS30); /64分频,CTC模式TIMSK3 = (1OCIE3A);TIFR3 = (1 600) quit(); /600*5ms = 3sTIFR3 = TIFR3|0x02;/每秒向PC机发送一个控制字符“C”,等待控制字sohwhile(uart_getchar()!=XMODEM_SOH) /receive the start of Xmodemif(TIFR3 & 0x02) /timer0 over flowif(+timercount 200) /wait about 1 secondUSART0_T;uart_putchar(XMODEM_RECIEVING_WAIT_CHAR); /send a Ctimercount=0;TIFR3=TIFR3 | 0x02;/开始接收数据块doK1=uart_waitchar();K2=(uart_waitchar();if (packNO = K1) & (packNO =K2) /核对数据块编号正确for(i=0;i128;i+) /接收128个字节数据databufferPoint= uart_waitchar();bufferPoint+;crc = (uart_waitchar()= SPM_PAGESIZE) /正确接受256个字节的数据write_one_page(); /收到256字节写入一页Flash中address += SPM_PAGESIZE; /Flash页加1bufferPoint = 0;USART0_T;uart_putchar(XMODEM_ACK); /正确收到一个数据块packNO+; /数据块编号加1elseUSART0_T;uart_putchar(XMODEM_NAK); /要求重发数据块els

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论