一、题目:
AVR单片机BootLoader功能应用
二、特色芯片技术介绍、使用说明:
AVR单片机中多数Mega系列单片机具有片内引导程序自编程功能即BootLoader功能。MCU 通过运行一个常驻FLASH的BootLoader 程序,利用任何可用的数据接口读取代码后写入自身的FLASH存储器中,实现自编程目的。
BootLoader功能将FLASH程序存储器其分为应用程序区和引导加载区,通过设置熔丝位BOOTSZ0和BOOTSZ1可以配置不同大小的引导加载区空间;通过设置熔丝位BOOTRST用于设置复位向量,当BOOTRST未被编程时器件复位后从应用程序区首地址开始执行,当BOOTRST被编程时器件复位后从引导区首地址开始执行。在设置好BOOTSZ0、BOOTSZ1和BOOTRST熔丝位后,需要把BootLoader程序定位并写入到引导区中,其首地址由熔丝位ROOTSZ0和BOOTSZ1的编程状态决定。在单片机上电复位后BootLoader程序开始执行,BootLoader程序可以通过USART、TWI或其它方式从计算机或其它数据源读取应用程序代码并写入到应用区中。
#include "bootloader.h" //串口初始化 void ComInit(void) { UBRR0H = BAUDREG/256; UBRR0L = BAUDREG%256; UCSR0A = 0; UCSR0B = (1 << RXEN0)|(1 << TXEN0); UCSR0C = (1 << UCSZ00)|(1 << UCSZ01); } //使用定时器1:产生以毫秒为单位的时间 void TimerInit() { OCR1A = (unsigned int)(timeclk * (F_CPU / (1024 * 1000.0f))); TCCR1A = 0; TCCR1B = (1 << WGM12)|(1 << CS12)|(1 << CS10); } //更新一个Flash页 void write_one_page(unsigned char *buf) { boot_page_erase(FlashAddr); boot_spm_busy_wait(); for(pagptr = 0; pagptr < SPM_PAGESIZE; pagptr += 2) { boot_page_fill(pagptr, buf[pagptr] + (buf[pagptr + 1] << 8)); } boot_page_write(FlashAddr); boot_spm_busy_wait(); } //跳转到用户程序 void quit() { boot_rww_enable(); (*((void(*)(void))PROG_START))(); } //写入数据到串口 void WriteCom(unsigned char dat) { #if RS485 RS485Enable(); #endif UDR0 = dat; while(!(UCSR0A & (1< #if RS485 RS485Disable(); #endif } //等待串口数据 unsigned char WaitCom() { while(!(UCSR0A & (1< } //向串口输出字符串 void putstr(const char *str) { while(*str) WriteCom(*str++); WriteCom(0x0D); WriteCom(0x0A); } //CRC校验 void crc16(unsigned char *buf, unsigned char n) { unsigned char j; unsigned char i; unsigned int crc, t; crc = 0; for(j = n; j > 0; j--) { crc = (crc ^ (((unsigned int) *buf) << 8)); for(i = 8; i > 0; i--) { t = crc << 1; if(crc & 0x8000) t = t ^ 0x1021; crc = t; } buf++; } ch = crc / 256; cl = crc % 256; } int main(void) { unsigned char cnt; unsigned char packNO; unsigned char crch, crcl; unsigned char li; asm volatile("cli": : ); wdt_enable(WDTO_1S); TimerInit(); #if RS485 DDRREG(RS485PORT) |= (1 << RS485TXEn); RS485Disable(); #endif ComInit(); putstr(msg1); cnt = TimeOutCnt; cl = 0; while(1) { if(TIFR1 & (1< TIFR1 |= (1 << OCF1A); if(cl == CONNECTCNT) break; wdt_reset(); cnt--; if(cnt == 0) { putstr(msg2); quit(); } } if(DataInCom()) { if(ReadCom() == KEY[cl]) cl++; else cl = 0; } } putstr(msg3); cnt = TimeOutCntC; while(1) { if(TIFR1 & (1< TIFR1 |= (1 << OCF1A); WriteCom(XMODEM_RWC) ; wdt_reset(); cnt--; if(cnt == 0) {
avr-libc提供一组C程序接口API来支持BootLoader功能,包含在
boot_page_erase ( address ):擦除FLASH指定页,address是以字节为单位的FLASH地址。
boot_page_fill ( address, data ):填充BootLoader 缓冲页,address为以字节为单位的缓冲页地址(对mega8:0~64),而data是长度为两个字节的字数据,因此调用前address 的增量应为2。此时data的高字节写入到高地址,低字节写入到低地址。
boot_page_write ( address ):boot_page_write执行一次的SPM指令,将缓冲页数据写入到FLASH指定页。
boot_rww_enable ( ):RWW区读使能,根据自编程的同时是否允许读FLASH存储器。RWW(Read-While-Write)可同时读写区,在对RWW 区自编程即页写入或页擦除时,由硬件锁定RWW区,RWW区的读操作被禁止,在对RWW区的编程结束后应当调用boot_rww_enable()使RWW区开放。
三、驱动程序的流程图
本应用以实际使用的Mega系列单片机Mega168为例,说明AVR单片机BootLoader的功能应用。BootLoader程序通过串口与计算机进行通信,执行读、写以及跳转到FLASH应用区的操作。单片机与计算机通信使用Xmodem通信协议,Xmodem通信协议见相关文档。其程序流程如下图。(可见附件中“流程图.vsd”文件)
四、驱动程序的源程序
对应Mega168的BootLoader程序包括bootloader.c和bootloader.h。
源程序清单如下:(可见附件中“bootloader.c”和“bootloader.h”文件)
五、设计及调试技巧
BootLoader程序不使用中断,以查询的方式读写UART数据。退出BootLoader程序后程序指针跳转到应用程序区首地址,如果要重新执行BootLoader程序以加载应用区程序,必须使用硬件复位。
六、典型问题及解决办法
在程序升级过程中遇到多个模块通过485总线连接在一起时,引起多个模块响应,造成误擦除,升级不能成功,在硬件及Bootloader程序中设置升级条件,条件满足时升级模块程序,否则跳转到应用程序区。
单片机源程序如下:
上一篇:Atmega64 LCD1602+proteus仿真程序
下一篇:Key.h头文件下载-AVR系列单片机的4*4小键盘驱动头文件
推荐阅读
史海拾趣
ELM Electronics成立于XXXX年,由一群富有创新精神和电子技术专长的工程师创立。初创时期,公司专注于设计和生产高质量的电子元器件,以满足日益增长的电子产品市场需求。通过不断的技术创新和严格的质量控制,ELM逐渐在电子行业中树立了良好的口碑。
背景:随着全球对环境保护和可持续发展的重视程度不断提高,HCH Co公司积极响应号召,开始了绿色转型之路。公司致力于开发环保型电子产品和绿色生产技术,以减少对环境的影响。
发展:通过不断的技术创新和生产工艺的改进,HCH Co公司成功推出了一系列环保型电子产品,如可回收材料制成的外壳、低功耗的显示屏等。同时,公司还加强了废弃电子产品的回收和再利用工作,实现了资源的循环利用。绿色转型不仅提升了公司的社会形象,也为公司的长期发展注入了新的动力。
随着公司规模的扩大,Chino-Excel公司开始实施全球化战略布局。公司先后在多个国家和地区设立研发中心和生产基地,以充分利用当地资源和市场优势。同时,公司加强与全球合作伙伴的紧密合作,共同开发新产品和技术,进一步巩固了在全球市场的地位。
CMDS深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,积极引进优秀人才和先进技术设备。通过持续的研发投入和人才培养,CMDS不断推出具有创新性和竞争力的新产品和解决方案。这些新产品不仅满足了客户不断变化的需求,也推动了整个行业的发展和进步。
近年来,随着电子行业的快速发展和市场竞争的加剧,CMDS也面临着诸多挑战。例如,原材料价格波动、人工成本上升、环保要求提高等都给公司的生产和经营带来了压力。然而,CMDS凭借其强大的技术实力和市场竞争力,积极应对这些挑战。通过优化生产流程、提高生产效率、加强成本管理等措施,CMDS不仅成功克服了这些困难,还实现了稳健的发展。同时,公司还注重环境保护和社会责任,积极推动可持续发展战略的实施。
工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下( ...… 查看全部问答∨ |
|
脉冲量的控制多用于步进电机、伺服电机的角度控制、距离控制、位置控制等。以下是以步进电机为例来说明各控制方式。 1、 步进电机的角度控制。首先要明确步进电机的细分数,然后确定步进电机转一圈所需要的总脉冲数。计算“角度百分比=设定角度/36 ...… 查看全部问答∨ |
仿反激式DCM时发现VD有振铃现象,产生原因?比较以下两图,看能否看懂; 第一个图是取自别人的测量仿图;下图是FSZE1317的机理简易框图; 第二图的VD图我觉得不对 ,好像应该取反;该高电平的时候改成低电平 … 查看全部问答∨ |
M序列产生 module Mxulie(clk,rst,mout); input clk; input rst; output mout; reg mout; reg[3:0] temp; always @(posedge clk or negedge rst) begin if(!rst) b ...… 查看全部问答∨ |
在对wifi无线网络进行配置的时候,找到了wince提供的无线网络配置的工具WZC TOOL,但是我把WZC TOOL编译生成.exe文件,然后在shell.reg中进行加载,但是运行的时候,无线网络并没有配置好,不知道在wzctool.cpp中mai ...… 查看全部问答∨ |
纯C语言的Win32的程序(源文件的扩展名都是.c的)能用COM么? 纯C语言的Win32的程序(源文件的扩展名都是.c的)能用COM么?比如能用 IImagingFactory 和 IImage COM接口么?… 查看全部问答∨ |
|
编译已经通过并生成vxworks文件,通过网口加载vxworks,通过串口调试助手观察到,跑到starting就没下文了,大侠们赐教是什么原因。(我想在各个启动过程中所调用的函数中使用printf(“标记”);来观察到底执行到哪一个函数死掉了,结果不能将prin ...… 查看全部问答∨ |