atmel Studio 6.1环境下的bootloader

合集下载

Atmel Studio 6 微控制器开发环境介绍说明书

Atmel Studio 6 微控制器开发环境介绍说明书

Atmel® Studio 6 is the integrated development environment (IDE) for developing and debugging embedded applications based on Atmel AVR® and ARM® Cortex™-M microcontrollers (MCUs) in C/C++ and assembly code. The IDE makes editing and debugging source code easier by seamlessly bringing together an intelligent editor with assisted code writing, a wizard for quickly creating new projects, the Atmel Software Framework with free source code library, a GNU C/C++ Compiler, a powerful simulator, and the front-end for all Atmel programmers and in-circuit debuggers.Atmel Studio 6 is free of charge and available for download at /atmelstudio.What’s New in Atmel Studio 6• Support for Atmel ARM Cortex-M based MCUs• Fully integrated Atmel QTouch® Composer• Full support for C++Your Avenue to Atmel AVR and ARM Cortex-M Based MCU DesignDesigners using AVR MCUs are already familiar with our IDE, previously known as AVR Studio® 5. Now, the communityof ARM Cortex-M design engineers can take advantage of the same easy-to-use, professional and highly integrated development platform.Integrated QTouch ComposerFully integrated into Atmel Studio 6, Atmel QTouch Composermakes it easy to build touch functionality into your design.QTouch Composer is the front-end software used to displayand evaluate the data reported from your touch design,making it easy for you to inspect how well your touchimplementation performs. With this integration, you can easilyand seamlessly develop capacitive touch functionality into yourapplication. You won’t need to toggle between different toolsto edit the code in Atmel Studio 6 and fine-tune your touchdesign in QTouch Composer.Atmel Software FrameworkThe Atmel Software Framework contains drivers for all peripherals,communication stacks, graphics, digital signal processing (DSP) and audiolibraries, and nearly 1,000 complete example designs. Using free source codefrom the Atmel Software Framework will accelerate the development of newapplications, while lowering your overall costs.Debugging Made EasyAtmel Studio 6 connects directly to Atmel debuggers and programmers. One of thebiggest advantages of modern MCUs is their ability to send debug data to your PC, givingyou a perfect view of what goes on inside. With a debugger connected, Atmel Studio 6can present the status of all processors, memories, communication interfaces and analoginterfaces in nicely formatted views, giving you access to critical system parameters. Theresimply is no faster way to identify bugs and optimize a design—in the lab or in the field.To learn more or download Atmel Studio 6 free of charge, visit /atmelstudio .© 2012 Atmel Corporation. All rights reserved. / Rev.: 8487B-Studio6-E-A4-09/12Atmel ®, Atmel logo and combinations thereof, and others are registered trademarks or trademarks of Atmel Corporation or its subsidiaries. ARM ®, ARMPowered ® logo and others are the registered trademarks or trademarks of ARM Ltd. Other terms and product names may be the trademarks of others. Atmel logo and combinations thereof, and others are registered trademarks or trademarks of Atmel Corporation or its subsidiaries.Disclaimer: The information in this document is provided in connection with Atmel products. No license, express or implied, by estoppel or otherwise, to any intellectual property right is granted by this document or in connection with the sale of Atmel products. EXCEPT AS SET FORTH IN THE ATMEL TERMS AND CONDITIONS OF SALES LOCATED ON THE ATMEL WEBSITE, ATMEL ASSUMES NO LIABILITY WHATSOEVER AND DISCLAIMS ANY EXPRESS, IMPLIED OR STATUTORY WARRANTY RELATING TO ITS PRODUCTS INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE, SPECIAL OR INCIDENTAL DAMAGES (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS AND PROFITS, BUSINESS INTERRUPTION, OR LOSS OF INFORMATION) ARISING OUT OF THE USE OR INABILITY TO USE THIS DOCUMENT, EVEN IF ATMEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Atmel makes no representations or warranties with respect to the accuracy or completeness of the contents of this document and reserves the right to make changes to specifications and products descriptions at any time without notice. Atmel does not make any commitment to update the information contained herein. Unless specifically provided otherwise, Atmel products are not suitable for, and shall not be used in, automotive applications. Atmel products are not intended, authorized, or warranted for use as components in applications intended to support or sustain life. Atmel Corporation 1600 Technology Drive, San Jose, CA 95110 USA T: (+1)(408) 441-0311 F: (+1)(408) 487-2600 | 。

AtmelStudio-6.0简易入门教程(精炼实用)(2021年整理精品文档)

AtmelStudio-6.0简易入门教程(精炼实用)(2021年整理精品文档)

(完整word版)AtmelStudio-6.0简易入门教程(精炼实用)编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整word 版)AtmelStudio-6.0简易入门教程(精炼实用))的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整word版)AtmelStudio-6.0简易入门教程(精炼实用)的全部内容。

一、建议工程文件AtmelStudi6。

0这个全新的环境使用起来极其不顺手,因为首先我对AtmelStudio以前的版本也根本没有使用经验,就根据很陌生,其次,这个新版本软件还根本没有人用,根本没有任何的相关教程资料,唯一可以参考的只是官网的比较简单的视频教程,还是英文讲解,反正没怎么搞透。

不过还是硬着头皮用下去,因为软件是免费的,而且当后来我知道代码编辑环境其实就是微软VS环境的时候,我就更不犹豫了,大家应该都了解VS的代码编写环境是很智能的,尤其自动补全功能。

现在,我已经能很熟练的使用AtmelStudio6。

0软件了,随着使用我也更加喜欢玩AVR单片机做一些小作品了,而不再用普通51和STC了。

当使用熟练以后也就感觉到其实这个免费智能的编译环境其实是很简单的,那现在我就帮助更多喜欢使用AVR而没用使用AtmelStudio软件的同学们轻松越过这一个门槛,进入一个美好的编程世界.该软件的不足之处:一是软件相对较大,打开比较慢,但是运行还是比较顺利的;二是不支持山寨仿真器,这可苦了没钱的劳苦电工们了。

(不过我都是用ISP烧录调试,一般不用仿真)最下面附件有一个简单的LED_test工程文件,编译通过的.大家可以试用。

AtmelStudio6.0 下程序的烧录操作

AtmelStudio6.0 下程序的烧录操作

AtmelStudio6.0 下程序的烧录操作
点击tools->Device Programming
出现如下画面:
选择Tool->JTAGICE mkll070000004699,这个选项是选择仿真器类型的,根据自己的仿真器类型选择就行了。

选择Device下的下拉菜单,选择自己的单片机型号。

选择Interface下的下拉菜单,选择ISP,然后点击Apply。

依次点击Target Voltage和Device signature下的Read,此时会读出当前片子的电压和地址。

点击左边栏目中的Memories,在右侧的复选框中找到工程路径下的.hex文件,点击Program,即可将程序下载到单片机内。

下载完成后会出现如下界面:
点击Fuses,此处是对单片机熔丝位的设置,所以选择要谨慎,否则单片机会被锁。

根据自己的晶振选择系统时钟,INTRCOSC为内部时钟信号,EXTXOSC 为外部时钟信号;内部时钟信号是以单片机内部的时钟为参考,外部时钟信号是以外接晶振为参考;由于atmega88单片机内部的晶振是LC震荡,所以并不精确,因此要用到定时器或者时序等,建议用外部晶振。

选择内部晶振:
选择外部晶振:
选择完成之后点击Program ,之后会出现如下显示,表示下载完成;如果熔丝位没有更改此处就不需要点击Program,如果更改了则需要重新Program之后才能生效。

AtmelStudio-6.0简易入门教程(精炼实用).

AtmelStudio-6.0简易入门教程(精炼实用).

一、建议工程文件AtmelStudi6.0这个全新的环境使用起来极其不顺手,因为首先我对AtmelStudio以前的版本也根本没有使用经验,就根据很陌生,其次,这个新版本软件还根本没有人用,根本没有任何的相关教程资料,唯一可以参考的只是官网的比较简单的视频教程,还是英文讲解,反正没怎么搞透。

不过还是硬着头皮用下去,因为软件是免费的,而且当后来我知道代码编辑环境其实就是微软VS环境的时候,我就更不犹豫了,大家应该都了解VS的代码编写环境是很智能的,尤其自动补全功能。

现在,我已经能很熟练的使用AtmelStudio6.0软件了,随着使用我也更加喜欢玩AVR单片机做一些小作品了,而不再用普通51和STC了。

当使用熟练以后也就感觉到其实这个免费智能的编译环境其实是很简单的,那现在我就帮助更多喜欢使用AVR而没用使用AtmelStudio软件的同学们轻松越过这一个门槛,进入一个美好的编程世界。

该软件的不足之处:一是软件相对较大,打开比较慢,但是运行还是比较顺利的;二是不支持山寨仿真器,这可苦了没钱的劳苦电工们了。

(不过我都是用ISP烧录调试,一般不用仿真)最下面附件有一个简单的LED_test工程文件,编译通过的。

大家可以试用。

下面开始介绍的软件工程的建立。

1. 软件总界面总体界面还是比较简洁的,和其他编译软件都是差不多的,而且和KEIL软件的界面是很相似的,使用很方便。

2. 新建工程新建工程很简单:FILE->NEW->Project 然后就看到下面的新建工程界面了,选择第一个GCC C Executable工程就可以,第二个GCC C static Library 是用来新建 .h文件的。

然后下面蓝圈1是C文件的名称,蓝圈2 Solution Name 是工程的文件,中间的Location是文件存放位置,自己选择合适的位置即可。

点击下面的OK3. 下面接着是单片机型号选择界面,选择合适的单片机就可以了。

Bootloader编译与下载

Bootloader编译与下载

Bootloader编译与下载Bootloader编译与下载3.1 实验目的:完成Bootloader编译与下载。

3.2 实验内容:参照指导书给出的步骤,一步一步地完成Bootloader编译与下载。

3.3 实验设备:1)硬件环境(硬件连接方法与Android版本一样)设备硬件连接方法必用的设备:串口线一根,网线一根,USB OTG线缆一根。

UART port0 : 作为监测中使用的端口连接串行线。

Ethernet port : 利用 Ethernet,为了高速传送,连接 LAN 线缆。

USB OTG Cable : 利用 USB,为了更新映像时使用,进行连接。

引导模式开关位于试验箱的右下角在下载映像文件之前注意设置引导模式开关设定引导模式NAND Flash 引导模式IROM 引导模式2)软件环境Linux 开发环境- VMWare在XP系统安装虚拟机,通过虚拟机加载一个Linux系统开发环境- Linux内核(CD提供ubuntu 8.04版本)串口监测工具 : minicom开发工具 : 交叉编译器 (CD提供gcc 4.4.1)3.4 实验步骤:操作步骤:提供CD 中“ubuntu_8.04”目录复制到“D:\”目录中。

在这个目录中,双击“ubuntu8.04_android.vmx”文件,运行ubuntu 8.04。

运行Ubuntu 8.04 映像前,需要安装VMware Player 或者WMware Workstation。

出版 CD 中提供了 VMware Player (路径 : tools\vmware-player\VMware-player-3.1.2-301548.exe)。

如果双击“ubuntu8.04_android.vmx”文件,如错误!未找到引用源。

],运行已安装的VMware Player 或者VMware Workstation。

这时,按下 Power On this virtual machine按钮。

BootLoader

BootLoader

BootLoader锁定本词条由“科普中国”百科科学词条编写与应用工作项目审核。

行之前运行。

可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最U也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。

在一个基于ARM7TDM I00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。

中文名启动装载外文名BootLoader说明系统启动前引导程序操作模式启动模式、交互模式1背景介绍Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。

[1]对于嵌入式系统,Bootloader是基于特定硬件平台来实现的。

因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader 。

Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。

对于2块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的B ootloader程序也能运行在另一块板子上,一般也都需要修改Bootloader的源程序。

反过来,大部分Bootloader仍然具有很多共性,某些Bo otloader也能够支持多种体系结构的嵌入式系统。

例如,U-Boot就同时支持PowerPC、ARM、MIPS和X86等体系结构2操作模式1.自启动模式:在这种模式下,bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。

2.交互模式:在这种模式下,目标机上的bootloader将通过串口或网络等通行手段从开发主机(Host)上下载内核映像等到RAM中。

可以被bootloader写到目标机上的固态存储媒质中,或者直接进入系统的引导。

实验一 交叉编译环境的建立和bootloader的使用

实验一 交叉编译环境的建立和bootloader的使用

实验一交叉编译环境的建立和bootloader的使用实验目的1.建立嵌入式软件的交叉编译环境。

2.下载和使用bootloader。

实验内容1.安装串口支持文件。

2.安装编译器。

3.安装bootloader。

4.下载内核并运行。

嵌入式LINUX开发环境有几个方案:1.基于PC机WINDOWS操作系统下的CYGWIN;2.在WINDOWS下安装虚拟机后,再在虚拟机中安装LINXUX操作系统;3.直接安装LINUX操作系统。

基于WINDOWS的环境要么有兼容性问题,要么速度有影响,所以我推荐大家使用纯LINUX操作系统开发环境。

我们实际的开发环境为REDHAT9,它已经支持中文,并且包含了绝大部分的开发工具,不用担心装了LINUX就不能使用WINDOWS的问题。

一般的情况都是用户已经有了WINDOWS操作系统,再安装LINUX,LINUX会自动安装一个叫作GRUB的启动引导软件,可以选择引导多个操作系统。

绝大多数Linux 软件开发都是以native 方式进行的,即本机(HOST)开发、调试,本机运行的方式。

这种方式通常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机(即板子上系统)运行开发工具和调试工具。

通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。

交叉编译调试环境建立在宿主机(即一台PC 机)上,对应的开发板叫做目标板。

运行Linux 的PC【宿主机】开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行),然后把可执行文件下载到目标机上运行。

调试时的方法很多,可以使用串口,以太网口等,具体使用哪种调试方法可以根据目标机处理器提供的支持做出选择。

宿主机和目标板的处理器一般不相同,宿主机为Intel 处理器,而目标板如UP-NetARM2410-S 开发板为三星S3c2410.GNU 编译器提供这样的功能,在编译器编译时可以选择开发所需的宿主机和目标机从而建立开发环境。

离线加密编程器中的BootLoader程序设计

离线加密编程器中的BootLoader程序设计

离线加密编程器中的BootLoader程序设计引言离线加密编程器是一种独立于PC 机,并通过SPI 接口直接对ATmega 系列单片机进行编程操作的设备。

在整个系统中,编程器与目标板之间的结合部分是一个最可能被解密的地方,因为可以通过抓取SPI 总线上的时序得到所传输的数据,因此编程器与目标板之间传输的数据必须是经过加密的。

而有效的编程数据不能为加密数据,所以加密数据需要经过解密还原才能用于单片机的编程。

本设计中BootLoader 程序的作用就是接收离线加密编程器的加密数据,对加密数据进行解密,然后完成目标板的编程操作。

首先编程目标板单片机的BootLoaoler 引导程序,最后与BootLoacler 程序建立连接。

编程器将加密数据传送给。

BootLoader 程序,由BootLoacler 程序对加密数据进行解密,然后完成编程操作。

这样做既可以确保数据不被外界破解,又能方便程序的升级操作。

BootLoader 程序的下载对具有知识产权保护要求的离线编程器设计是一个关键步骤,它的成功与否直接决定离线编程器设计能否成功。

本文将以ATmegal69 为例进行BootLoader 程序下载的介绍。

1 系统硬件设计本系统主要由单片机、显示部分、按键开关、存储部分和串行通信部分等组成,硬件结构框图如图1所示。

图1 中,AVR ATmegal69P(V)单片机是一种高性能、低功耗的8 位微处理器,采用先进的RISC 结构,130 条指令大多数可以在1 个时钟周期内完成,满足了本系统对执行速度的要求。

它具有非易失性的程序和数据存储器,16 KB 的系统内可编程Flash,具有4 乘以25 段的LCD 驱动器的ATmegal69P(V),输入电压3.3 V,串行USART,可工作于主机/从机模式的SPI 串行接口;存储部分采用ATmel 公司8 个引脚的串口存储芯片AT45DB041B,主存容量大小为528 KB,一共2 048 页,每页264B,具有2 个大小为265B 的数据缓存,允。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

网上有关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——>文件名porperties——>toolchain出现如图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 <avr/io.h>#include<avr/boot.h>#include <inttypes.h>#include <avr/interrupt.h>#include <avr/pgmspace.h>#include <util/delay.h>#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.\n\r\0"; UCHAR data[DATA_BUFFER_SIZE];long address = 0;#define USART0_T PORTE |= (1<<PORTE2) //USART0发送使能#define USART0_R PORTE &= ~(1<<PORTE2) //USART0接收使能/*void boot_page_ew(long p_address,char code){asm("mov r30,r22\n""mov r31,r23\n""out 0x3b,r24\n"); //将页地址放入Z 寄存器和RAMPZ 的Bit0 中SPMCSR = code; //寄存器SPMCSR 中为操作码asm("spm\n"); //对指定Flash 页进行操作}//填充Flash 缓冲页中的一个字void boot_page_fill_1(unsigned int address,int data){asm("mov r30,r24\n""mov r31,r25\n" //Z 寄存器中为填冲页内地址"mov r0,r22\n""mov r1,r23\n"); //R0R1 中为一个指令字SPMCSR = 0x01;asm("spm\n");}//等待一个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<SPM_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页的完整处理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;i<SPM_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;}/*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; i<SPM_PAGESIZE; i+=2){// Set up little-endian word.uint16_t w = *buf++;w += (*buf++) << 8;boot_page_fill (page + i, w);}boot_page_write (page); // Store buffer in flash page.boot_spm_busy_wait(); // Wait until the memory is written.// Reenable RWW-section again. We need this if we want to jump back// to the application after bootloading.boot_rww_enable ();// Re-enable interrupts (if they were ever enabled).SREG = sreg;}*///从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 receivedstatus = 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);return (char)c;}//计算CRCint calcrc(char *ptr, int count){int crc = 0;char i;while (--count >= 0){crc = crc ^ (int) *ptr++ << 8;i = 8;do{if (crc & 0x8000)crc = crc << 1 ^ 0x1021;elsecrc = crc << 1;} 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 清零初始化SPMCSR = SPMCSR&0XFE;boot_rww_enable();asm("jmp 0x0000\n"); //跳转到Flash 的0x0000 处,执行用户的应用程序uart_putchar('O');uart_putchar('K');}//主程序void main(void){int i = 0;unsigned int timercount = 0;unsigned char packNO = 1;int bufferPoint = 0;unsigned int crc;UCHAR K1,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); //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 = (1<<WGM32)|(1<<CS31)|(1<<CS30); //64分频,CTC模式TIMSK3 = (1<<OCIE3A);TIFR3 = (1<<TOV3);TCNT3H = 0;TCNT3L = 0;OCR3AH = 0x03;//定时为5ms,0x030D OCR3AL = 0x0D;//向PC机发送开始提示信息while(startupString[i]!='\0'){USART0_T;uart_putchar(startupString[i]);i++;}//3秒种等待PC下发“d”,否则退出Bootloader程序,从0x0000处执行应用程序while(1){if(uart_getchar()== 'd') break;if (TIFR3 & 0x02) //timer0 over flow{if (++timercount > 600)quit(); //600*5ms = 3sTIFR3 = TIFR3|0x02;}}//每秒向PC机发送一个控制字符“C”,等待控制字〈soh〉while(uart_getchar()!=XMODEM_SOH) //receive the start of Xmodem{if(TIFR3 & 0x02) //timer0 over flow{if(++timercount > 200) //wait about 1 second{USART0_T;uart_putchar(XMODEM_RECIEVING_WAIT_CHAR); //send a "C"timercount=0;}TIFR3=TIFR3 | 0x02;}}//开始接收数据块do{K1=uart_waitchar();K2=(~uart_waitchar());if ((packNO == K1) && (packNO ==K2)){ //核对数据块编号正确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页加1bufferPoint = 0;}USART0_T;uart_putchar(XMODEM_ACK); //正确收到一个数据块packNO++; //数据块编号加1}else{USART0_T;uart_putchar(XMODEM_NAK); //要求重发数据块}}else{USART0_T;uart_putchar(XMODEM_NAK); //要求重发数据块}}while(uart_waitchar()!=XMODEM_EOT); //循环接收,直到全部发完USART0_T;uart_putchar(XMODEM_ACK); //通知PC机全部收到if(bufferPoint)write_one_page(); //把剩余的数据写入Flash中quit(); //退出Bootloader程序,从0x0000处执行应用程序}。

相关文档
最新文档