历史上的今天
返回首页

历史上的今天

今天是:2025年03月16日(星期日)

正在发生

2020年03月16日 | Atmega32 Bootloader测试程序详解

2020-03-16 来源:eefocus

Atmega32的Bootloader程序,下面是源码。


在使用时需要将熔丝位进行配置:

1.编程BOOTSZ0、BOOTSZ1和BOOTRST三处,然后通过下载器将BOOTLOADER的hex下载到单片机中,重启后就从BOOTLOADER处运行了。


2.注意本例子使用的是内部8MHz和9600的波特率。


3.启动后可以看到:

然后按下‘D’键进入Bootloader等待下载。

#include

#include

#include

#include

#include

//IO定義

#define PIN_RXD 0 //PD0

#define PIN_TXD 1 //PD1

//常數定義

#define SPM_PAGESIZE 128

#define DATA_BUFFER_SIZE SPM_PAGESIZE

#define BAUDRATE 9600

#undef F_CPU

#define F_CPU 8000000

//定義xmodem控制字符

#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_WAIT_CHAR 'C'

struct str_XMODEM

{

unsigned char SOH; //起始字节

unsigned char BlockNo; //数据块编号

unsigned char nBlockNo; //数据块编号反码

unsigned char Xdata[128]; //数据128字节

unsigned char CRC16hi; //CRC16校验数据高位

unsigned char CRC16lo; //CRC16校验数据低位

}

strXMODEM;

unsigned long FlashAddress; //FLASH地址

#define BootAdd 0x7000 //Boot区的首地址(应用区的最高地址)

unsigned char BlockCount; //数据块累计(仅8位,无须考虑溢出)

unsigned char STATUS; //运行状态

#define ST_WAIT_START 0x00 //等待启动

#define ST_BLOCK_OK 0x01 //接收一个数据块成功

#define ST_BLOCK_FAIL 0x02 //接收一个数据块失败

#define ST_OK 0x03 //完成

#define PROG_START 0x0000


//延時

void delay_ms(unsigned int t)

{

while(t--)

{

_delay_ms(1);

}

}

void write_one_page(void)

{

unsigned char i;

unsigned char *buf;

unsigned int w;

boot_page_erase(FlashAddress);

boot_spm_busy_wait();

buf=&strXMODEM.Xdata[0];

for(i=0;i{

w=*buf++;

w+=(*buf++)<<8;

boot_page_fill(i,w);

}

boot_page_write(FlashAddress);

boot_spm_busy_wait();

}

void put_c(unsigned char c) //发送采用查询方式

{

loop_until_bit_is_set(UCSRA,UDRE);

UDR=c;

}

void put_s(unsigned char *ptr)

{

while (*ptr)

{

put_c(*ptr++);

}

put_c(0x0D);

put_c(0x0A); //结尾发送回车换行

}

unsigned char get_data(unsigned char *ptr,unsigned char len,unsigned int timeout)

{

unsigned count=0;

do

{

if (UCSRA & (1<{

*ptr++ = UDR; //如果接收到数据,读出

count++;

if (count>=len)

{

break; //

}

}

if(TIFR & (1<{

TIFR|=(1<timeout--;

}

}while (timeout);

return count;

}

unsigned int calcrc(unsigned char *ptr, unsigned char count)

{

unsigned int crc = 0;

while (count--)

{

crc =_crc_xmodem_update(crc,*ptr++);

}

return crc;

}

int main(void)

{

unsigned char c = 0;

unsigned char i;

unsigned int crc;

WDTCR &= ~(1<DDRD=(1<GICR = (1<GICR = (0<cli();

UCSRC = (1<UBRRL = (F_CPU/BAUDRATE/16-1)%256; //设定波特率

UBRRH = (F_CPU/BAUDRATE/16-1)/256;

UCSRA = 0x00;

UCSRB = (1<OCR0 = 28;

TCCR0 = (1<//CTC模式下,溢出标志是输出比较匹配OCF0,对应的中断是输出比较匹配中断;

put_c(0x0c);

put_c(0x0c);

put_c(0x0c); //超級終端清屏

put_s("User want updata the programme,please touch [d]rnOtherwise the MCU run the old programme.rn");

get_data(&c,1,3000); //限时3秒,接收一个数据

if ((c=='d')||(c=='D'))

{

STATUS=ST_WAIT_START; //并且数据='d'或'D',进入XMODEM

put_s("Please use xmodem transmit the *.bin file.");

}

else

{

STATUS=ST_OK; //退出Bootloader程序

}

FlashAddress=0x0000;

BlockCount=0x01;

while(STATUS!=ST_OK)

{

if (STATUS==ST_WAIT_START)

{//XMODEM未启动

put_c(XMODEM_WAIT_CHAR); //发送请求XMODEM_WAIT_CHAR

}

i=get_data(&strXMODEM.SOH,133,1000);

if(i)

{

//分析数据包的第一个数据 SOH/EOT/CAN

switch(strXMODEM.SOH)

{

case XMODEM_SOH: //收到开始符SOH

if (i>=133)

{

STATUS=ST_BLOCK_OK;

}

else

{

STATUS=ST_BLOCK_FAIL; //如果数据不足,要求重发当前数据块

put_c(XMODEM_NAK);

}

break;

case XMODEM_EOT: //收到结束符EOT

put_c(XMODEM_ACK); //通知PC机全部收到

STATUS=ST_OK;

put_s("Updata the programme success.");

break;

case XMODEM_CAN: //收到取消符CAN

put_c(XMODEM_ACK); //回应PC机

STATUS=ST_OK;

put_s("Warning! It canceled by user to updata the programme.");

break;

default: //起始字节错误

put_c(XMODEM_NAK); //要求重发当前数据块

STATUS=ST_BLOCK_FAIL;

break;

}

}

if (STATUS==ST_BLOCK_OK) //接收133字节OK,且起始字节正确

{

if (BlockCount != strXMODEM.BlockNo)//核对数据块编号正确

{

put_c(XMODEM_NAK); //数据块编号错误,要求重发当前数据块

continue;

}

if (BlockCount !=(unsigned char)(~strXMODEM.nBlockNo))

{

put_c(XMODEM_NAK);

continue;

}

crc=strXMODEM.CRC16hi<<8;

crc+=strXMODEM.CRC16lo;

if(calcrc(&strXMODEM.Xdata[0],128)!=crc)

{

put_c(XMODEM_NAK); //CRC错误,要求重发当前数据块

continue;

}

//正确接收128个字节数据,刚好是M16的一页

if (FlashAddress<(BootAdd-SPM_PAGESIZE))

{ //如果地址在应用区内

write_one_page(); //将收到128字节写入一页Flash中

FlashAddress+=SPM_PAGESIZE; //Flash页加1

}

else

{

put_c(XMODEM_CAN); //程序已满,取消传送

put_c(XMODEM_CAN);

put_c(XMODEM_CAN);

STATUS=ST_OK;

put_s("The programme is out of the flash,cancle transmitted. ");

break;

}

put_c(XMODEM_ACK); //回应已正确收到一个数据块

BlockCount++; //数据块累计加1

}

}

put_s("LET'S GO!");

loop_until_bit_is_set(UCSRA,UDRE); //等待结束提示信息回送完成

GICR = (1<GICR = (0</* 无论BootLoader是否使用中断,将中断向量表迁移到应用程序区头部,会增强程序的健壮性*/

boot_rww_enable (); //RWW区读允许,否则无法马上执行用户的应用程序

asm volatile("jmp 0x0000"); //跳转到Flash的0x0000处,执行用户的应用程序

}


推荐阅读

史海拾趣

ACE [ACE Technology Co., Ltd.]公司的发展小趣事

由于ACE Technology Co., Ltd. 公司的发展故事涉及具体的事件和详细经过,而这些信息可能并不公开或详细记录,因此我无法为您直接提供5个具体的电子行业里ACE公司的发展故事。但我可以基于已知的信息,为您概述ACE公司的一些可能的发展历程和关键点,这些可以作为您编写故事的参考。

  1. 创业初期与核心技术积累

ACE Technology Co., Ltd. 成立于2001年,早期便专注于电源管理IC和内存类IC的研发。公司的创始团队拥有深厚的电子行业经验和技术背景,他们看到了电源管理和内存技术的巨大市场潜力,并决定将其作为公司的核心竞争力。在公司成立初期,ACE投入大量资源进行技术研发,逐步积累了宝贵的技术专利和知识产权。

  1. 全球化布局与研发中心建设

随着公司业务的不断扩展,ACE意识到全球化布局的重要性。于是,公司决定在美国硅谷设立研发中心,利用当地的人才和技术优势,进一步提升IC设计水平。同时,为了降低研发成本并更好地服务亚洲市场,ACE还在印度建立了另一个研发中心。这些研发中心的建立,为公司的技术创新和产品升级提供了有力支持。

  1. 市场拓展与合作伙伴关系建立

在产品研发的同时,ACE也注重市场拓展。公司积极参加各种行业展会和交流活动,与国内外众多客户建立了合作关系。特别是在中国市场,ACE与深圳市欣诺泰电子有限公司等代理商建立了长期稳定的合作关系,通过他们的渠道将产品推广至本土工程师和厂商。这些合作伙伴关系的建立,为公司的业务发展奠定了坚实基础。

  1. 产品升级与品牌塑造

随着技术的不断进步和市场需求的变化,ACE不断对产品进行升级和优化。公司注重产品性能和稳定性的提升,同时关注客户反馈和市场需求,不断优化产品设计。此外,ACE还加强了品牌塑造工作,通过提升品牌形象和知名度,进一步增强了公司在行业内的竞争力。

  1. 应对挑战与未来发展规划

在电子行业的激烈竞争中,ACE也面临着诸多挑战。为了应对这些挑战,公司加强了内部管理,提升了运营效率。同时,ACE还制定了未来发展规划,包括进一步拓展国际市场、加强技术创新和研发投入、优化产品线等。这些举措将有助于公司在未来继续保持竞争优势并实现可持续发展。

以上是基于已知信息对ACE公司可能的发展历程和关键点的概述。如果需要更具体的发展故事,建议查阅公司官方网站、行业报告或相关新闻报道以获取更多详细信息。

G-Two Inc公司的发展小趣事

背景:2003年,福斯特的创始人林建华,一位在纺织业和化工领域有着丰富经验的工程师,决定跨界进入光伏材料行业。当时,国内光伏组件封装所需的光伏胶膜几乎全部依赖进口,被国外几家大公司垄断。

发展:林建华凭借在热熔网膜领域的技术积累,带领团队成功研发出EVA胶膜,打破了国外技术垄断。这一技术突破不仅降低了国内光伏组件的生产成本,也为福斯特在光伏材料领域的崛起奠定了坚实基础。

成果:2008年,福斯特的EVA胶膜产品凭借优异的性能和价格优势,成功打入国内光伏组件企业的供应名录,并跻身全球EVA胶膜供应商前三强。

Acculin Inc公司的发展小趣事

随着电子行业的竞争加剧,Acculin Inc面临着市场份额下降的挑战。为了应对这一变化,公司决定调整战略方向,将重点转向智能穿戴设备市场。通过研发具有独特功能的智能手环和智能手表,Acculin成功吸引了年轻消费者的关注,并在新的市场领域取得了突破。

Greenliant公司的发展小趣事

在光伏产业快速发展的背景下,GPS于2020年进军光伏逆变器市场。公司凭借其深厚的技术积累和创新能力,开发出了一系列高效、可靠的光伏逆变器产品。这些产品不仅转换效率高,而且具备智能监控和远程控制功能,大大提升了光伏电站的运行效率和安全性。GPS的光伏逆变器产品迅速获得市场认可,成为众多光伏项目的首选设备。

北京人民电器厂公司的发展小趣事

近年来,随着新能源产业的快速发展,北京人民电器紧跟时代步伐,在新能源领域取得了重要突破。公司推出的真安型零飞弧直流断路器,解决了直流低压系统中长期存在的外喷电弧问题,为新能源行业的发展提供了重要的技术支持。这一创新成果不仅得到了行业的广泛认可,也为公司在新能源领域的发展打开了新的局面。

这五个故事只是北京人民电器在电子行业发展历程中的一部分,但它们足以展现出公司在技术创新、产品应用、生产自动化、人才队伍建设以及新能源领域发展等方面的努力和成就。这些故事不仅记录了北京人民电器的成长轨迹,也见证了中国电子行业的蓬勃发展。

BELDEN公司的发展小趣事

作为一家拥有百年历史的电子企业,BELDEN公司始终保持着持续创新和可持续发展的理念。公司不断投入研发资金,加强技术研发和创新能力,推出了一系列具有自主知识产权的新产品和技术。同时,公司还注重环保和可持续发展,积极采用环保材料和生产工艺,致力于降低生产过程中的能耗和排放。这些举措不仅提升了公司的竞争力和市场份额,还为公司的长期发展奠定了坚实的基础。

这五个故事从不同角度展示了BELDEN公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BELDEN公司的历史与现状,不含任何褒贬之意。

问答坊 | AI 解惑

上拉电阻和下拉电阻的选择

上拉电阻和下拉电阻的选择应结合开关管特性和下级电路的输入特性进行设定,主要需要考虑以下几个因素:1. 驱动能力与功耗的平衡。以上拉电阻为例,一般地说,上拉电阻越小,驱动能力越强,但功耗越大,设计是应注意两者之间的均衡。2. 下级电路的 ...…

查看全部问答>

wince下socket编程问题请教

问题一:       如下是服务器端的部分程序,accept成功后,客户端给服务器端发送两次消息,分别为\"01\",\"02\".      发现:如果把szText[]的大小改为3,则只能成功接受一次数据,改成16就能接受两次。 ...…

查看全部问答>

初学Windows驱动开发, 请推荐些资料和书籍, 谢谢!

初学Windows驱动开发, 主要是做网络方面的, 比如数据报的抓包、发包之类。 请推荐些资料和书籍, 谢谢!…

查看全部问答>

毕业设计 基于DSP的SPWM技术实现

紧急求助专家帮忙。本人大四毕业设计,做DSP的SPWM技术实现。用的是2407的芯片,要求仿真出波形图,并且还要进行算法的计算和改进,提出优化,对误差进行分析,并对死区控制进行分析。 本人现在急求 2407的SPWM C语言的程序,并且最好给张仿真的波 ...…

查看全部问答>

请教搞硬件方面的高手:我的研究生定向问题,不甚感激!

各位硬件达人,我现在是研一,现在面临选向的问题,本科是自动化(并非电气自动化,就是传说中的“万金油”的那个自动化专业),研究生我没有报双控,报的是模式识别与智能系统(我是在研究所读研,报那个不重要,关键是自己选向)。师哥建议我搞电 ...…

查看全部问答>

求助 :Compact Framework中播放mp3等音频文件…

在Compact Framework中除了调用media player控件 还有其它什么播放音频文件的方法吗??…

查看全部问答>

谁有LM3S8962的SD读写程序,发上来个研究一下

谁有LM3S8962的SD读写程序,发上来个研究一下我这边的stellarisware光盘里面的SD卡程序用不了,谁有个能用的,给个!谢谢…

查看全部问答>

学C遇到的问题

现在学习C,是自己买了本谭浩强的C语言程序设计自己在家边看边用电脑写写,发现在看书看了几次能看明白了,再做后面的练习又不会了,不知道怎么下手,看了答案才知道原来是这样的怎么办?越看越没有信心了,尤其是指针,就感觉我拿到问题不知道怎么 ...…

查看全部问答>

工程师应掌握的20个经典模拟电路

工程师应掌握的20个经典模拟电路 [ 本帖最后由 aishuang 于 2011-7-16 12:02 编辑 ]…

查看全部问答>