⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ref.c~

📁 ATmega32的Bootloader程序,CV编译器
💻 C~
📖 第 1 页 / 共 2 页
字号:
????????}?while(--i); 
????} 
????return?(crc); 
} 
//退出Bootloader程序,从0x0000处执行应用程序 
void?quit(void) 
{ 
??????uart_putchar('O');uart_putchar('K'); 
uart_putchar(0x0d);uart_putchar(0x0a); 
?????while(!(UCSR0A?&?0x20));????????????//等待结束提示信息回送完成 
??MCUCR?=?0x01; 
?????MCUCR?=?0x00;????????????????????//将中断向量表迁移到应用程序区头部 
?????RAMPZ?=?0x00;????????????????????//RAMPZ清零初始化 
?????asm("jmp?0x0000\n");????????????????//跳转到Flash的0x0000处,执行用户的应用程序 
} 
//主程序 
void?main(void) 
{ 
????int?i?=?0; 
????unsigned?char?timercount?=?0; 
????unsigned?char?packNO?=?1; 
????int?bufferPoint?=?0; 
????unsigned?int?crc; 
//初始化M128的USART0 
????UBRR0H?=?BAUD_H;???? 
????UBRR0L?=?BAUD_L;????????????//Set?baud?rate 
????UCSR0B?=?0x18;????????????//Enable?Receiver?and?Transmitter 
????UCSR0C?=?0x0E;????????????//Set?frame?format:?8data,?2stop?bit 
//初始化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)????????????????????????//timer0?over?flow 
????????{ 
???????????????if?(++timercount?>?200)?quit();????????//200*15ms?=?3s 
????????????TIFR?=?TIFR|0x02; 
????????} 
????} 
????//每秒向PC机发送一个控制字符“C”,等待控制字〈soh〉 
????while(uart_getchar()!=XMODEM_SOH)????????//receive?the?start?of?Xmodem 
????{ 
?????????if(TIFR?&?0x02)????????????????????//timer0?over?flow 
????????{ 
????????????if(++timercount?>?67)????????????????????????//wait?about?1?second 
????????????{ 
????????????????uart_putchar(XMODEM_RECIEVING_WAIT_CHAR);????//send?a?"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处执行应用程序 
} 

????程序的主体部分采用C高级编写,结构性好,程序的相应部分都给出了比较详细的注释说明,读者非常容易读懂和理解。下面再对程序做进一步的说明。 
l????函数“void??write_one_page(void)”?实现了对ATmega128一个Flash页的完整编程处理。当程序从串口正确接收到256个字节后,(ATmega128一个Flash页为128个字),便调用该函数将其写入ATmega128一个Flash页中。函数先将一个指定的Flash页进行擦除;然后将数据填入Flash????的缓冲页中,最后将Flash????缓冲页的数据写入到该指定的Flash页中(详细技术细节见第二章相关内容的介绍)。 
l????一个Flash页的擦除、写入,以及填充Flash缓冲页的函数采用内嵌AVR汇编完成,在ICCAVR中,寄存器R16、R17、R18、R19用于传递一个C函数的第1、2个参数(int类型)或第1个乘数(long类型),具体参考ICCAVR应用说明。 
l????函数“void?quit(void)”的用途是退出Bootloader程序,从Flash的0x0000处执行用户的应用程序。在执行强行跳转指令“jmp?0x0000”前,对寄存器MCUCR的操作是将中断向量地址迁移回应用程序区的头部,因为在ICCAVR环境中编译Bootloader程序时,其自动把中断向量地址迁移到了Bootloader区的头部。为了保证能正确执行用户的程序,在跳转前需要把中断向量地址迁再移回应用程序区的头部。 
l????在这段Bootloader程序中使用的硬件资源为T/C0和USART0,用户在编写其应用程序时,应首先对这两个硬件资源相关的寄存器重新做初始化。 
l????Bootloader程序占具并住留在Flash的最高1K字空间内,因此实际的应用程序空间为63K字(126K字节),所以用户编写的应用程序不得超出126K字节。同时应将ATmega128的熔丝位BLB12、BLB11的状态设置为“00”,禁止SPM和LPM指令对Bootloader区的读写操作,已确保Bootloader程序不被改写和擦除。 
5.2.3?IAP的实现与应用 
1.????Bootloader程序的编译与下载 
首先在ICCAVR中新建一个工程项目,并按照生成Bootloader程序代码的要求进行正确的设置。打开Project?–>?Options的Compiler?Options设置选项窗口,见图5.1: 
l????在Device?Configration栏中选定器件ATMega128; 
l????选定Use?RAMPZ/ELPM项(ATMega128的Flash?>?64K字节); 
l????Program?Type选定为Boot?Loader; 
l????Boot?Size选择1K?Words。 


图5.1?在ICCAVR中编写Bootloader程序的编译属性设置 

正确设置好编译选项后输入C的源代码,然后编译生成.HEX的下载代码程序。 
在下载HEX文件前还要对ATmega128芯片的熔丝位进行正确的配置: 
l????配置M103C熔丝位,使芯片工作于ATmega128方式; 
l????配置BOOTSZ1和BOOTSZ0熔丝位,设定BOOTLOADER区的大小为1024个字,起始首地址为0xFC00; 
l????配置BOOTRST熔丝位,设定芯片上电起动从BOOTLOADER区的起始地址处开始,既每次RESET复位后从0xFC00处执行Bootloader程序; 
l????下载Bootloader程序的HEX文件; 
l????配置LB2和LB1熔丝位,加密程序; 
l????配置BLB12和BLB11熔丝位,对BOOTLOADER区进行安全锁定。 
特别注意的是,以上对芯片熔丝位的配置以及Bootloader程序的下载,需要由ISP、或JTAG、或并行方式实现,既要实现IAP,首先还需要使用一次非IAP的编程方式来建立IAP的应用环境。 

2.????IAP应用 
当你按照上面的方法将Bootloader程序下载完成后,就可以使用它来下载你的应用程序了。具体操作如下。 
l????编写你的应用程序,编译生成HEX文件; 
l????使用HEX2BIN.EXE转换程序,将HEX文件转换成BIN文件; 
l????使用普通的RS232电缆将PC机的串口与ATmega128的串口连接; 
l????打开WINDOWS中的超级终端软件,正确设置COM口的参数:38400,1,8,无,2,无(使用2位停止位提高通信可靠性); 
l????ATmega128上电,在PC超级终端收到“Type?'d'?download,?Others?run?app.”的Bootloader程序启动的提示详细; 
l????3秒钟内在PC上按下“d”键,通知Bootloader程序转入接收数据并更新应用程序的处理。3秒钟内没有按“d”键,PC超级终端收到“OK”提示,Bootloader程序退出,自动转入执行芯片内原有的用户应用程序(如果有的话,否则再次启动Bootloader程序); 
l????当PC超级终端收到“C”(一秒钟一个),说明Bootloader程序转入接收数据和更新应用程序的处理流程,正在等待PC下发数据; 
l????在PC超级终端上的工具栏中选择“传送->发送文件”,在发送文件窗口选择协议“Xmodem”,文件栏中选定要下载应用程序的BIN文件,单击发送按钮; 
l????此时出现文件发送窗口,显示文件发送的过程和进度,以及是否出错; 
l????当文件全部正确发送完成后,PC超级终端收到“OK”提示,Bootloader程序退出,自动转入执行刚更新的用户应用程序。 
在ATmega128中烧入这样一个Bootloader程序,建立了IAP后,最基本的开发AVR的环境就简化成“PC+RS232电缆+目标板”。读者在掌握了Bootloader程序编写的原理后,可以编写自己的Bootloader程序,实现系统程序的自动远程网络更新等应用。 
AVR的BOOTLOADER功能同其它一些芯片不同,它的BOOTLOADER程序没有固化(固定)在芯片内部(出厂为空),而是需要由用户设计实现(实际上,你第一次下载BOOTLOADER程序还必须使用其它的方式编程,如ISP、JTAG等),因此对一般的用户掌握起来有一定的困难,不如一些其它芯片的固化IAP使用方便。但对高手来讲,可以根据实际需要编写高级、高效、专用的BOOTLOADER程序,如从一个U盘读取数据,更新用户的应用程序;编写一个时间炸弹,或对用户的密码进行验证,10次不对则将系统程序销毁等等。简单意味着使用方便,但灵活和适应性差,而灵活性需要你具备更高的能力去驾驭它。可能会有一天,在单片机的系统上也出现了“病毒”程序,其原因就是使用了固化的BOOTLOADER程序。由于固化(固定)的程序采用规定公开(开放)的接口,那么用一个带“病毒”的应用程序更新原来的应用程序也就轻而易举了。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -