ICCAVR-AVR_BootLoader
[VIP专享]ICCAVR 使用快速入门
![[VIP专享]ICCAVR 使用快速入门](https://img.taocdn.com/s3/m/e88e65659e31433238689397.png)
AVR ICC 使用快速入门菜单解释1、关于窗口设置:[如图]如上图:这是ICC avr 6.31 版本的窗口,分为5大区。
1.菜单项1.文件▪新建,打开,打印文件等常规选项。
很别扭的一件事关闭文件在菜单里。
2.编辑▪复制,粘贴,删除,撤销,重做等常规操作,一看就明白。
3.搜索▪搜索功能,书签功能,可以使用添加标签,删除标签,下一个标签,转到标签。
你可以直接点击左侧快速添加或删除标签。
▪4.视图▪对新手几乎没有用处,你可以用它显示或者隐藏工程文件窗口,编译状态窗口。
查看输出文件,makefile文件,Map文件。
5.Project Menu 工程菜单1.New... – 创建一个新的工程文件2.Open –打开一个已经存在的工程文件3.Open All Files... – 打开工程的全部源文件4.Close All Files – 关闭全部打开的文件5.Reopen... – 重新打开一个最近打开过的工程文件6.Make Project –解释和编译已经修改的文件为输出文件*注意与7Rebuild All的区别7.Rebuild All – 重新构筑全部文件注意在版本升级后对原有工程最好全部重新构筑*8.Add File(s) – 添加一个文件到工程中这个文件可以是非源文件9.Remove Selected Files – 从工程中删除选择的文件10.Option... – 打开工程编译选项对话框11.Close – 关闭工程12.Save As... – 将工程换一个名称存盘13.6.Tools Menu 工具菜单1.Environment Options – 打开环境和终端仿真器选项对话框2.Editor and Print Options –打开编辑和打印选项对话框3.AVR Calc – 打开AVR 计算器可以计算4.UART 的波特率定时器的定时常数5.Application Builder –打开应用向导程序生成硬件的初始化代码cool,对新手非常有用6.Configure Tools – 允许你添加自己的内容到工具菜单7.Run –以命令行方式运行一个程序7.Terminal 电脑终端使用很少,串口调试终端8.Help 帮助不用我说了。
bootloader说明

使用Bootloader 升级芯片内程序详解AVR仿真器AVR编程器二合一AVRJTAG与ISP 二合一V2.5 【经典推荐】¥298.00元国产AVR JTAGICE mkII 仿真下载器(ATJTAGICE2)【推荐】¥650.00元ATmega128 开发板学习板EasyAVR M128SK-A 四合一(核心板、开发板、仿真器、下载烧录器)¥498.00元单片机实验箱AVR单片机实验箱AVR单片机实验仪高校首选AVR单片机学习实验箱¥798.00元EasyAVRATmega16开发板仿真器编程器三合一特价(开发板、仿真器、下载烧写器)¥298.00元你现在的位置:AVR与虚拟仪器>>AVR使用范例>>使用Bootloader 升级芯片内程序详解论坛AVR使用范例--使用Bootloader 升级芯片内程序详解感谢网站热心会员likeeavr提供本页原型。
Bootloader是flash中高地址的一个程序区域,通过它可以实现程序的运行控制,程序更新等。
本页给出的是通过串口实现在线更新的方法。
程序编译环境:icc avr 6.31。
如果你使用Atmega16芯片,7.3728M晶振,1024的bootloader区,19200的波特率,那么你直接使用下面的hex文件就可以了,下载hex文件。
本站的开发板内,预制这个hex文件,可以按照本页的方法用串口线直接更新程序。
否则,你需要对程序进行调整,然后重新编译Bootloader的hex文件,下载软件包,软件中需要更改的部分:1. 芯片的类型#include <iom16v.h> //选择对应的芯片2. Bootloader区的大小,和ICC的option相对应。
#define BootSize 'd' //10243. 串口的通讯频率设置,根据晶振大小对应的进行修改。
#define BAU 23 // 7.3728M 19200(计算方法如下图)下面这个界面计算出UBBR的值正确的前提是CPU选项中的芯片类型和晶振都选择正确。
ICC AVR编译时常见的错误报告

ICC AVR编译时常见的错误报告新手用ICC编程的时候,经常会出现一些错误,现在将常见的错误报告整理如下:一、正常编译通过CODE:C:\icc\bin\imakew -f main.makiccavr -c -IC:\icc\include\ -e -DATMEGA -DATMega16 -l -g -Mavr_enhanced D:\桌面\实验教程\LED应用\霓虹灯\main.ciccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk -lcatmegaDevice 1% full.Done.[Copy to clipboard]这是我们最想看到的了,万事大吉。
二、工程中未加入.C文件CODE:C:\icc\bin\imakew -f main.makiccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk -lcatmegaunknown file type @main.lk, passed to linker!ERROR unknown file type '@main.lk'C:\icc\bin\imakew.exe: Error code 1Done: there are error(s). Exit code: 1[Copy to clipboard]解决办法:将你的程序加入工程中,可以右键程序区>>ADD to project三、程序没有后缀名,或者后缀名不正确。
AVR单片机教程7—第七课ICCAVR使用教程

AVR单片机教程7—第七课ICCAVR使用教程——第七课ICCA VR使用教程本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买!接下来我们来做第一个AVR程序,让程序跑起来,控制AVR单片机综合试验板上的8个LED,让它们亮、灭进行闪烁。
3.4.1 ICCAVR使用教程通过ICCAVR对源程序编译连接工程之前,需要对编译器属性进行设置,设置好的某些属性可保留起来作为新建工程的默认属性。
打开ICCAVR软件界面,选择Project→Option进入属性设置对话窗。
共有Paths、Compiler、Target、Config Salvo四个属性标签页。
1). Paths标签页(图3-12)在属性中设置编译器的头文件目录(Include Path(s):)和库文件目录(Library Path:)。
我们使用系统默认的头文件目录和库文件目录。
——图3-12 Paths标签页由于我们不使用汇编语言进行开发,因此汇编语言包含路径(Asm Include Path(s):)空着不填。
输出文件目录(Output Directory:)空着不填,则输出文件自动存放在工程项目目录中,否则存放在用户填写的路径下。
2).Compiler标签页(图3-13)Strict ANSI C Checkings:选中表示进行严格的C语法检查。
——图3-13 Compiler标签页Accept Extensions(C++ comments,binary constants) :选中表示接受C++风格的程序注释。
Int size enum(for backword compatibility) :选中表示可以向下兼容程序。
Optimizations栏可以选择默认设置(Default)或使能代码压缩功能(Enable code compression),对程序的编译进行优化。
AVR之BOOTLOADER技术详解

A VR之BOOTLOADER技术详解ATmega128具备引导加载支持的用户程序自编程功能(In-System Programming by On-chipBoot Program),它提供了一个真正的由MCU本身自动下载和更新(采用读/写同时"Read-While-Write"进行的方式)程序代码的系统程序自编程更新的机制。
利用A VR的这个功能,可以实现在应用编程(IAP)以及实现系统程序的远程自动更新的应用。
IAP的本质就是,MCU可以灵活地运行一个常驻Flash的引导加载程序(Boot Loader Program),实现对用户应用程序的在线自编程更新。
引导加载程序的设计可以使用任何的可用的数据接口和相关的协议读取代码,或者从程序存储器中读取代码,然后将代码写入(编程)到Flash存储器中。
引导加载程序有能力读写整个Flash存储器,包括引导加载程序所在的引导加载区本身。
引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。
引导加载程序区的大小可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该段程序区的不同级别的保护。
本节将给出一个实际的的Boot Loader程序,它可以配合Windows中的超级终端程序,采用Xmodem传输协议,通过RS232接口下载更新用户的应用程序。
5.2.1 基本设计思想1.Boot Loader程序的设计要点Boot Loader程序的设计是实现IAP的关键,它必须能过通过一个通信接口,采用某种协议正确的接收数据,再将完整的数据写入到用户程序区中。
本例Boot Loader程序的设计要点有:(1)采用ATmega128的USART口实现与PC之间的简易RS232三线通信;(2)采用Xmodem通信协议完成与PC机之间的数据交换;(3)用户程序更新完成后自动转入用户程序执行;(4)Boot Loader程序采用C语言内嵌AVR汇编方式编写,阅读理解方便,可移植性强,代码小于1K字。
AVR的bootloader的设置步骤教程及注意事项

AVR 的bootloader 的设置步骤教程及注意事项一些注意事项:
1.熔丝位的烧写:BOOTRST 要进行编程,这样单片机在复位后自动跳转
到bootloader 区执行bootloader 的代码,然后要根据自己bootloader 的大小设置boot 区的的熔丝位:具体设置如下图,这里我选择的是1024 大小(注意
1 代表为编程,0 代表已编程):
2.设置引导区锁定位:为了保护bootloader 不被应用程序修改或者擦除,
所以要对其进行保护,Atmega 提供了熔丝位的保护方式,具体设置如下图(我设置的为BLB0 为11,BLB1 为00):
3.Flash 页的设定:因flash 的擦除和写入是按照页来操作的,看手册上说是1 页有128 个字节,但实际调试时候发现需要一次写入256 个字节才有效的,如果按照128 来写入,会将第二个128 的内容覆盖掉第一个128 字节的
内容,那就按照实际为准了。
4.Xmodem 协议的注意事项:具体的xmodem 不在本文叙述了,只说一下要注意的地方,校验和是可以选择的,我使用的是checksum(就是单纯的累加),也可以选择16 为的CRC,这个是根据单片机第一次返回的响应字节来。
ICCAVR简介

ICCAVR简介ICCAVR 简介ICCAVR 是一种使用ANSI 标准C 语言来开发微控制器(MCU)程序的一个工具,它是一个综合了编辑器和工程管理器的集成工作环境(IDE)。
源文件全部被组织到工程之中,文件的编辑和工程(project)的构筑也在IDE 的环境中完成。
编译错误在状态窗口中显示,用鼠标单击编译错误时,光标会自动跳转到出错行。
这个工程管理器还能直接产生INTEL HEX 格式的烧写文件和可以在AVR Studio 中调试的COFF 格式的调试文件。
这里特别要提一下ICCAVR 中的应用构筑向导,可以在Tools 栏中选择“ApplicationBiulder”或者直接点击快捷工具栏中的“Application Biulder”图标,就可以打开应用构筑向导对话框,可以根据需要设定芯片种类,各个端口初始值,是否使用定时器,中断,UART 等,选好以后单击“OK”就可以得到所需的硬件初始化程序段,非常可靠而且方便。
图1 给出了初始化UART 的一个例子:下面介绍一下创建并编译一个工程文件的简要步骤:1.新建一个源文件从file 菜单中选择new,创建一个新文件,在改文件中输入源程序并进行编辑和修改,然后存盘,在存盘时必须指定文件类型,如命名为:try.c 。
写一个新文件的步骤:首先用Biulder 初始化需要用到的硬件资源,生成初始化程序,然后再写需要的代码实现所要的功能。
2.新建一个project 从projrct 菜单中选择new 命令,IDE 会弹出一个对话框,在对话框中用户可以指定工程存放的文件夹和工程的名称。
在建立一个新工程之后,在工程管理器的窗口会出现三个子目录,Files, Headers, Documents,这时就可以将要编译的文件添加到project 中了。
3.把文件添加到工程中可以在project-files 里单击右键,选择需要添加的文件;也可以在编辑窗口中单击右键选择弹出窗口的“Add To Project”命令。
AVR单片机教程7—第七课ICCAVR使用教程

AVR单片机教程7—第七课ICCAVR使用教程AVR单片机是一种高性能、低功耗的8位微控制器,因其易于使用和广泛应用于各种嵌入式系统而备受欢迎。
本教程将带您深入了解AVR单片机的编程和应用,特别是介绍第七课程ICCAVR的使用。
ICCAVR是一种基于AVR系列单片机的集成开发环境,它提供了丰富的功能和工具,有助于简化和加速单片机的开发过程。
在本节课中,我们将学习如何使用ICCAVR进行AVR单片机的编程。
一、ICCAVR的安装与配置在开始使用ICCAVR之前,首先需要下载并安装该软件。
您可以在官方网站上找到ICCAVR的最新版本,并按照安装向导进行安装。
安装完成后,打开ICCAVR,进入设置界面,完成对编译器、调试器和单片机型号的配置。
确保所选的单片机型号与您所使用的AVR单片机一致,这样才能保证编程的准确性和兼容性。
二、新建工程在ICCAVR中,您可以创建一个新的工程来开始编程。
选择“文件”-“新建”-“项目”,然后选择单片机型号和存储工程的路径。
点击“确定”后,ICCAVR将自动生成一个空的工程,供您编写代码和调试。
三、编写代码在ICCAVR的工程中,您可以添加源文件和头文件。
源文件中包含了您的程序代码,而头文件则用于声明变量、函数和宏定义等。
编写代码时,您可以使用C语言或汇编语言进行编程。
C语言是一种高级语言,更易于使用和理解,适合大多数应用场景。
而汇编语言则更接近底层硬件,可以直接控制单片机的各个寄存器和引脚,适用于对性能要求较高的应用。
四、编译和烧录在编写完代码后,可以使用ICCAVR提供的编译器将代码转换为可执行文件。
选择“生成”-“编译”,ICCAVR会检查代码中的语法错误并生成可执行文件。
生成可执行文件后,您可以选择烧录器将程序烧录到AVR单片机中。
连接烧录器到电脑,并将AVR单片机与烧录器连接好。
选择“烧录”-“烧录器设置”,然后选择正确的烧录器和单片机型号。
点击“烧录”按钮,ICCAVR会自动将程序加载到单片机中进行烧录。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ICCAVR-AVR_BootLoader-AVR BootLoader详解ATmega128具备引导加载支持的用户程序自编程功能(In-System Programming by On-chipBoot Program),它提供了一个真正的由MCU 本身自动下载和更新(采用读/写同时"Read-While-Write"进行的方式)程序代码的系统程序自编程更新的机制。
利用AVR的这个功能,可以实现在应用编程(IAP)以及实现系统程序的远程自动更新的应用。
IAP的本质就是,MCU可以灵活地运行一个常驻Flash的引导加载程序(Boot Loader Program),实现对用户应用程序的在线自编程更新。
引导加载程序的设计可以使用任何的可用的数据接口和相关的协议读取代码,或者从程序存储器中读取代码,然后将代码写入(编程)到Flash存储器中。
引导加载程序有能力读写整个Flash存储器,包括引导加载程序所在的引导加载区本身。
引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。
引导加载程序区的大小可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该段程序区的不同级别的保护。
本节将给出一个实际的的Boot Loader程序,它可以配合Windows中的超级终端程序,采用Xmodem传输协议,通过RS232接口下载更新用户的应用程序。
5.2.1 基本设计思想1.Boot Loader程序的设计要点Boot Loader程序的设计是实现IAP的关键,它必须能过通过一个通信接口,采用某种协议正确的接收数据,再将完整的数据写入到用户程序区中。
本例Boot Loader程序的设计要点有:(1)采用ATmega128的USART口实现与PC之间的简易RS232三线通信;(2)采用Xmodem通信协议完成与PC机之间的数据交换;(3)用户程序更新完成后自动转入用户程序执行;(4)Boot Loader程序采用C语言内嵌AVR汇编方式编写,阅读理解方便,可移植性强,代码小于1K字。
2.Xmodem通信协议Xmodem协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。
这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。
如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。
为了便于读者阅读程序,下面简要说明该协议的主要特点,有关Xmoden的完整的协议请参考其它相关的资料。
(1)Xmodem的控制字符:01H、04H、06H、15H、18H、1AH。
(2)Xmodem传输数据块格式:"个字节的数据块...> "。
其中为起始字节;为数据块编号字节,每次加一;是前一字节的反码;接下来是长度为128字节的数据块;最后的是128字节数据的CRC校验码,长度为2个字节。
(3)接收端收到一个数据块并校验正确时,回送;接收错误回送;而回送表示要发送端停止发送。
(4)发送端收到后,可继续发送下一个数据块(packNO+1);而收到则可再次重发上一个数据块。
(5)发送端发送表示全部数据发送完成。
如果最后需要发送的数据不足128个字节,用填满一个数据块。
(6)控制字符"C"有特殊的作用,当发送端收到"C"控制字符时,它回重新开始以CRC校验方式发送数据块(packNO = 1)。
(7)每发送一个新的数据块加1,加到OxFF后下一个数据块的为零。
(8)校验方式采用16位CRC校验(X^16 + X^12 + X^5 + 1)。
5.2.2 源程序代码下面给出的源程序是在ICCAVR中实现的。
/*****************************************************采用串行接口实现Boot_load应用的实例华东师大电子系马潮2004.07Compiler: ICC-AVR 6.31Target: Mega128Crystal: 16MhzUsed: T/C0,USART0*****************************************************/#include#define SPM_PAGESIZE 256 //M128的一个Flash页为256字节(128字)#define BAUD 38400 //波特率采用38400bps#define CRYSTAL 16000000 //系统时钟16MHz//计算和定义M128的波特率设置参数#define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1) #define BAUD_H (unsigned char)(BAUD_SETTING>>8)#define BAUD_L (unsigned char)BAUD_SETTING#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.\n\r\0";char data[DATA_BUFFER_SIZE];long address = 0;//擦除(code=0x03)和写入(code=0x05)一个Flash页void boot_page_ew(long p_address,char code){asm("mov r30,r16\n""mov r31,r17\n""out 0x3b,r18\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中SPMCSR = code; //寄存器SPMCSR中为操作码asm("spm\n"); //对指定Flash页进行操作}//填充Flash缓冲页中的一个字void boot_page_fill(unsigned int address,int data){asm("mov r30,r16\n""mov r31,r17\n" //Z寄存器中为填冲页内地址"mov r0,r18\n""mov r1,r19\n"); //R0R1中为一个指令字SPMCSR = 0x01;}//等待一个Flash页的写完成void wait_page_rw_ok(void){while(SPMCSR & 0x40){while(SPMCSR & 0x01);SPMCSR = 0x11;asm("spm\n");}}//更新一个Flash页的完整处理void write_one_page(void){int i;boot_page_ew(address,0x03); //擦除一个Flash页wait_page_rw_ok(); //等待擦除完成for(i=0;i//将数据填入Flash缓冲页中{boot_page_fill(i, data+(data[i+1]//将缓冲页数据写入一个Flash页wait_page_rw_ok(); //等待写入完成}//从RS232发送一个字节void uart_putchar(char c){while(!(UCSR0A & 0x20));UDR0 = c;}//从RS232接收一个字节int uart_getchar(void){unsigned char status,res;if(!(UCSR0A & 0x80)) return -1; //no data to be received status = UCSR0A;res = UDR0;if (status & 0x1c) return -1; // If error, return -1return res;}//等待从RS232接收一个有效的字节char uart_waitchar(void){int c;while((c=uart_getchar())==-1);}//计算CRCint calcrc(char *ptr, int count){int crc = 0;char i;while (--count >= 0){crc = crc ^ (int) *ptr++ //退出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的USART0UBRR0H = BAUD_H;UBRR0L = BAUD_L; //Set baud rateUCSR0B = 0x18; //Enable Receiver and TransmitterUCSR0C = 0x0E; //Set frame. format: 8data, 2stop bit//初始化M128的T/C0,15ms自动重载OCR0 = 0xEA;TCCR0 = 0x0F;//向PC机发送开始提示信息while(startupString!='\0'){uart_putchar(startupString);i++;}//3秒种等待PC下发"d",否则退出Bootloader程序,从0x0000处执行应用程序{if(uart_getchar()== 'd') break;if (TIFR & 0x02) //timer0 over flow{if (++timercount > 200) quit(); //200*15ms = 3sTIFR = 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个字节数据{data[bufferPoint]= uart_waitchar();bufferPoint++;}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页加1bufferPoint = 0;}uart_putchar(XMODEM_ACK); //正确收到一个数据块packNO++; //数据块编号加1}{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高级编写,结构性好,程序的相应部分都给出了比较详细的注释说明,读者非常容易读懂和理解。