数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3009|回复: 32

[AVR] atmega328P 写入 Boot Loader的那点事

    [复制链接]
发表于 2019-6-11 19:55:32 | 显示全部楼层 |阅读模式

马上注册,认识更多玩家好友,查阅更多资源,享有更多功能

您需要 登录 才可以下载或查看,没有帐号?立即注册 微信登录

x
Arduino是开源的,这很好。想当年在学校时,每当考试时,同学们在考场上都不开源给我,所以学了BASIC、汇编、FOXBASIC、VB都跟没有学似的,看到满屏的字母只能笑。


这几天忽然对atmega328P的了兴趣,有位坛友也发了不少Arduino实验的贴子,但新买来的atmega328P大部分是没有引导程序BOOT LOADER的,必须进行烧写。
下面说说如何烧写。

一、初识atmega328P集成IC

新买来的328P不做特别说明的一般都是没有引导程序BootLoader的,这就要先对328P进行Boot Loader的烧写。下面就如何烧写进行说明。

(一)328P两种封装的脚位对应情况
atmega328P-AU封装脚位
001 atmega328AU封装脚位.png

atmega328P—PU封装脚位
002 atmega328PU封装脚位.png

ARDUINO 与两种封装脚位对应关系
003 脚位对应1.jpg

要注意Arduino PIN和集成块的PIN是不同的。

(二)制作一个最小系统
以AU为例参考图
004 328P AU 最小系统.jpg

atmega328P-PU的最小系统情况
005 PU最小系统.jpg

atmega328P-AU封装的使用转接板接出引脚
006 328P001.jpg 007 328P002.jpg 008 328P003.jpg 009 328P004.jpg




这时开始的棚搭
328 AU取小系统.jpg

后来用面包板了
328AU的最小系统情况参考:
010 AU最小系统.jpg




二、使用USB编程器

关键是设置熔丝位(FUSE)和找对相应的HEX文件。
这里使用的是51单片机的下载器
011 ATMEL-ISP 0.jpg

安装好驱动
012 驱动.JPG

与ARDUINO的接线关系
013 下载线接口脚位.jpg 014 下载线脚位.JPG

熔丝位和HEX文件的设置在IDE的安装目录中的boards.txt文件中可以找到。
015 BOARDS.JPG
1.找到相应的熔丝位
016 boards.JPG
在IDE安装目录中..\arduino-nightly\hardware\arduino\avr找到boards.txt文件

这个文件用写字板打开,在“##”后可以找要烧写的“开发板”型号,下面就可以看到低位熔丝、高位熔丝、扩展位、加密位及bootloader.file(HEX文件)。

这是Nano Old Bootloader 的情况:
nano.menu.cpu.atmega328old=ATmega328P (Old Bootloader)
nano.menu.cpu.atmega328old.upload.maximum_size=30720
nano.menu.cpu.atmega328old.upload.maximum_data_size=2048
nano.menu.cpu.atmega328old.upload.speed=57600
nano.menu.cpu.atmega328old.bootloader.low_fuses=0xFF
nano.menu.cpu.atmega328old.bootloader.high_fuses=0xDA
nano.menu.cpu.atmega328old.bootloader.extended_fuses=0xFD
nano.menu.cpu.atmega328old.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex
nano.menu.cpu.atmega328old.build.mcu=atmega328p


2.连接好ISP线,插好USB下载器,打开progisp,
017 PORGISP界面说明.jpg
每项操作,下面的白色窗口都有反馈的,最后的操作在最上现一行显示。

选好片
017 PRO002.JPG

3.Fuse设置好要点“写入”,然后点“读出”,确保与写入的一样才算写入了
018 fuse.JPG

4.调入Flash文件。根据
nano.menu.cpu.atmega328old.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex
对应的bootloader文件在IDE的安装目录中可以找到:
019 Nano.JPG
..\arduino-nightly\hardware\arduino\avr\bootloaders\atmega
020 调入FLASH.JPG


5.检查无误后,点“自动”,窗口最下面的“状态”有提示的
021 下载1.JPG
022 下载2.JPG


当下载好后,如果在D13上接有LED,LED会闪的。(只有Nano ATmega328P (old bootloader)会闪,UNO和Nano ATmega328P是不会闪的)
三、使用arduino as ISP方式
如果手上没有下载器,可以使用正常的Arduino UNO开发板作为烧写器给单片机芯片烧写BootLoader。
在这里采用一块Arduino UNO板作为烧写器,讲一下对328P进行Arduino BootLoader 的烧写。
(一)将Arduino UNO板(上位机)变成个ISP设备。
1.将作为烧写器的ArduinoUNO板通过USB线连接到电脑,打开ArduinoIDE 。
2.选择并设置好开发板型号、处理器及COM口。(注意要选择的型号为作为上位机的Arduino 型号)
023 ideISP.JPG
3.在工具栏选择 —〉文件->示例—〉11.Arduino ISP —〉ArduinoISP,打开ArduinoISP程序,编译(验证)、下载到UNO开发板中。

4.在工具栏选择—〉工具—〉编程器—〉Arduino as ISP
024 as ISP.JPG

到此,上位机就成了一个ISP下载器了。
(二)连接线路
连接好上位机与下位机的线,下位机的电源和地要与上位机连接。
在ArduinoISP 程序的73、85、86、87行给出了UNO板作为ISP的接线:
D10—〉RESET
D11—〉MOSI
D12—〉MISO
D13—〉SCK
对应接线情况:
025 Arduino as ISP接线.jpg

如果上位机是Nano则在reset与地接一个10UF的电容(我试过4.7100uF都可以)。网上说UNO接这个电容,其实UNO不用接的。
(三)进行烧写
在工具栏选择—〉工具—〉烧录引导程序
026 ISP烧录.JPG

6.等待完成
027 烧录完成.JPG

如果是Nano ATmega328P (oldbootloader)D13上接有LED,LED会闪的。
四、验证
(一)使用CH340等,通过TXRX下载程序进行验证
1.电路连接:
029 TTL下载接线.JPG
目标板上的RESET通过1K电阻上拉到VCC(5V)。RESET串10UF电容,接到CH340的DTR或RTS,可以自动下载。我接的是220UF的,稳定下载
如果没有串电容,等IDE提示“上传”时,RESET对地短路一下也可。就是按一下复位键。隔壁的图


028 ch340.png
2.选择并设置好开发板型号、处理器及COM口。(注意要选择的型号为刚烧写的Arduino 型号)为了区别示例的Blink,下载了一个“SOS”

(二)使用Arduino作为ISP上传
保持上面Arduino作为ISP设备的姿势(接线不要动)。
打开验证程序
030 SOS.JPG
在工具栏选择—〉项目—〉使用编程器上传
031 as ISP y.JPG
也可以按着shift键,用鼠标点上传图标(右箭头)
031 SOS.JPG

下载成功后观察。

当然可能用下图这个验证
032.jpg

下面这个是双灯。一个是SOS,一个是呼吸灯,同时闪
044.jpg

费心作了两个板子进行实验
055.jpg

下面这个上位机是NANO,所以在RESET与GND之间接了一个电容,
066.jpg

楼下对熔丝配置的说明,网上收集的
next

打赏

参与人数 19M币 +356 收起 理由
玛德陛下 + 20 謝謝分享
锰子 + 20 謝謝分享
佳维 + 20 謝謝分享
myhaly + 16
eros8269 + 16
aping365 + 10
福源人 + 20
人艰不拆了 + 20
newnet1234 + 20 謝謝分享
kyhwhb + 20 優秀文章

查看全部打赏

 楼主| 发表于 2019-6-11 19:56:52 | 显示全部楼层
328P熔丝配置的说明

下面是NANO的熔丝位
n.JPG

下面是UNO的熔丝位
u.JPG

熔丝位配置:熔丝位 “0” = 已编程(允许); “1” = 未编程(禁止)
熔丝低位(low fuse):

1.CKDIV8
CKDIV8位是配置mcu时钟的8分频,出厂默认是0,如果你是用16MHz(arduino uno 和 nano默认时钟)的话需要将这位改成1。

2.CKOUT
CKOUT位允许系统时钟从PORTB0输出,一般默认1就行,不用去配。

3.复位启动时间选择
SUT 1/0:  当选择不同晶振时,SUT有所不同。如果没有特殊要求推荐SUT 1/0设置复位启动时间稍长,使电源缓慢上升。默认“01”

4.CKSEL3/0:时钟源选择(默认“0100”)
CLKSEL0、CLKSEL1、CLKSEL2、CLKSEL3用于选择系统的时钟源。有五种不同类型的时钟源可供选择(每种类型还有细的划分)。芯片出厂时的默认情况为CLKSEL3..0和SUT1..0分别是“0001”和“10”。即使用内部1MHz RC振荡器,使用最长的启动延时。这保证了无论外部振荡电路是否工作,都可以进行最初的ISP下载。对于CLKSEL3..0熔丝位的改写需要十分慎重,因为一旦改写错误,会造成芯片无法启动。

Low Power Crystal Oscillator                                   1111 – 1000
Full Swing Crystal Oscillator                             0111 – 0110
Low Frequency Crystal Oscillator                      0101 – 0100
Internal 128kHz RC Oscillator                            0011
Calibrated Internal RC Oscillator                        0010
External Clock 0000 Reserved                            0001
ATMEGA328P芯片出厂默认是8MHz再8分频,最终为1MHz的时钟。
而UNO默认是用16MHz外部晶振所以 CKSEL3/0= “1111”   SUT 1/0 = “11”

熔丝高位(high fuse):

1.RSTDISBL: 复位或I/O功能选择
为硬复位功能使能端,如果置0,可以将reset端做数字IO使用,这样会造成ISP的下载编程无法进行,因为在进入ISP方式编程时前,需要将RESET引脚拉低,使芯片先进入复位状态。所以这里置1。(此位如果配成0,芯片变板砖……)

2.DWEN:调试线使能
DWEN用来激活DW调试,默认未编程。

3.SPIEN:使能串行程序和数据下载(默认“0”)
使用ISP串行方式下载编程时,应配置SPIEN熔丝位为“0”。芯片出厂时SPIEN位的状态默认为“0”,表示允许ISP串行方式下载数据。只有该位处于编程状态“0”,才可以通过AVR的SPI口进行ISP下载,如果该位被配置为未编程“1”后,ISP串行方式下载数据立即被禁止,此时只能通过并行方式或JTAG编程方式才能将SPIEN的状态重新设置为“0”,开放ISP。一般保留其状态。

4.WDTON:是否一直启用看门狗
WDTON默认为“1”,即禁止看门狗的定时器始终开启。如果该位设置为“0”后,看门狗的定时器就会始终打开,不能被内部程序控制了,这是为了防止当程序跑飞时,未知代码通过写寄存器将看门狗定时器关断而设计的。一般我们的非工业制作都不使用看门狗功能,所以这里置1即可。

5.EESAVE: 执行芯片擦除时EEPROM 的内容保留
执行擦除命令时是否保留E2PROM中的内容,默认状态为“1”,表示E2PROM中的内容同Flash中的内容一同擦除。如果该位设置为“0”,对程序进行下载前的擦除命令只会对FLASH代码区有效,而对E2PROM区无效。这对于希望在系统更新程序时,需要保留E2PROM中数据的情况下是十分有用的。

6.BOOTSZ1/0: boot区大小
这两位确定了BOOTLOADER区的大小以及其起始的首地址。默认的状态为“00”,表示BOOTLOADER区为4096字,起始首地址为0xF000。
00:1024Word
01:512Word
10:256Word
11:128Word

7.BOOTRST: 复位向量选择
决定芯片上电起动时,第一条执行指令的地址。默认状态为“1”,表示起动时从0x0000开始执行。如果BOOTRST设置为“0”,则起动时从BOOTLOADER区的起始地址处开始执行程序。BOOTLOADER区的大小由BOOTSZ1和BOOTSZ0决定,因此其首地址也随之变化。
如果你的芯片里面烧写了bootloader并想要复位后从引导区开始,就需要配置此位0。
熔丝扩展位(extended fuse):

8.BODLEVEL 2/0:BOD触发电平
使用方法:如果启动掉电检测,则检测电平由BODLEVEL决定。一旦VCC下降到触发电平以下,MCU复位;当VCC电平大于触发电平后,经过tTOUT 延时周后重新开始工作。
BODLEVEL 2/0 熔丝位              BOD VOLT
111                                             禁用BOD
110                                            1.8V
101                                            2.7V
100                                             4.3V
另:扩展熔丝位只有BODLEVEL这3位。

最后你可以到boards.txt里看一下各板子的熔丝配置就可以知道每块板子是如何工作的。

现在知道UNO和NANO的默认熔丝配置了吧
UNO = FF-DE-FD (LOW-HIGH-EXT)
NANO = FF-DA-FD (LOW-HIGH-EXT)






后续:atmega328P 写入 Boot Loader的那点事 之 互相伤害
https://www.mydigit.cn/forum.php?mod=viewthread&tid=59096

打赏

参与人数 14M币 +271 收起 理由
锰子 + 20 謝謝分享
佳维 + 20 謝謝分享
myhaly + 18
wjhwpp + 18
人艰不拆了 + 20
萧错 + 20 優秀文章
wska + 20
ch104517745 + 20
qrut + 20 優秀文章
cushion + 20 優秀文章

查看全部打赏

发表于 2019-6-11 20:20:45 | 显示全部楼层
高手,绝对是高手

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

发表于 2019-6-11 20:34:26 | 显示全部楼层
手持筷子围观楼主折腾

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

发表于 2019-6-11 21:29:10 | 显示全部楼层
恭喜精华了!
高级,没玩过,学习一下
等牙膏ing

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

发表于 2019-6-11 21:50:49 | 显示全部楼层
请问楼主,能不能改Arduino IDE的配置文件,然后每次点Upload刷芯片的时候都能更新熔丝位?

点评

好像不行吧,这样的话不小心FUSE就乱了  详情 回复 发表于 2019-6-13 19:49

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 歡迎探討 好像不行吧,这样的话不小心FUSE.

查看全部打赏

发表于 2019-6-12 11:47:03 | 显示全部楼层
会玩单片机就是好哈哈

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享 我也小白一个 哈哈

查看全部打赏

发表于 2019-6-12 12:13:04 | 显示全部楼层
只是不知道 熔丝 真的熔了么,,烧断后还能复活?

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享 只是一种叫法,就是能使位而已.

查看全部打赏

发表于 2019-6-12 13:21:26 | 显示全部楼层
看不懂,火钳刘明

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

发表于 2019-6-12 14:08:31 | 显示全部楼层
这个精华必须的

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

发表于 2019-6-12 17:49:03 | 显示全部楼层
考场上答题如果同学开源给你,该用啥协议呢 是否应该标明出处?还是强制继续开源给别人

点评

我觉得WTFPL很合适  详情 回复 发表于 2019-6-12 18:16

打赏

参与人数 2M币 +12 收起 理由
jf201006 + 2 精彩回帖 所以我开源
oscillator + 10

查看全部打赏

回复 支持 2 反对 0

使用道具 举报

发表于 2019-6-12 18:16:43 | 显示全部楼层
f@tfox 发表于 2019-6-12 17:49
考场上答题如果同学开源给你,该用啥协议呢 是否应该标明出处?还是强制继续开源给别人 ...

我觉得WTFPL很合适

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

发表于 2019-6-12 21:36:44 | 显示全部楼层

Arduino是开源的

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享 是的,但很多国外开源的都被墙了.

查看全部打赏

发表于 2019-6-13 09:06:58 | 显示全部楼层
以前刷mp3的时候没有售后的bootloader 安全没有办法,膜拜大神

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

 楼主| 发表于 2019-6-13 19:49:20 | 显示全部楼层
mitchel 发表于 2019-6-11 21:50
请问楼主,能不能改Arduino IDE的配置文件,然后每次点Upload刷芯片的时候都能更新熔丝位?
...

好像不行吧,这样的话不小心FUSE就乱了

打赏

参与人数 1M币 +10 收起 理由
人艰不拆了 + 10 歡迎探討

查看全部打赏

发表于 2019-6-13 20:19:18 来自手机浏览器 | 显示全部楼层
复杂的一笔啊

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2019-6-13 21:45:22 | 显示全部楼层
我就是芯片变板砖那个,话说还有救吗,刷imax b6刷了一次然后1602没显示且不识别,换一个再刷,又一个砖

点评

用外部有源晶振就能救活。我也因为那个讨厌的熔丝位搞变砖过,用有源的晶振救活了。很久不碰atmega了,太麻烦了。  详情 回复 发表于 2019-6-14 11:50
imax b6的主控是328p-AU,你烧写Boot Loader了吗?现在还能写入Fuse吗?试试用外部晶振救砖  详情 回复 发表于 2019-6-14 09:05
 楼主| 发表于 2019-6-14 09:05:09 来自手机浏览器 | 显示全部楼层
cbcb4cb 发表于 2019-6-13 21:45
我就是芯片变板砖那个,话说还有救吗,刷imax b6刷了一次然后1602没显示且不识别,换一个再刷,又一个 ...

imax b6的主控是328p-AU,你烧写Boot Loader了吗?现在还能写入Fuse吗?试试用外部晶振救砖

打赏

参与人数 1M币 +10 收起 理由
人艰不拆了 + 10 歡迎探討

查看全部打赏

发表于 2019-6-14 09:29:06 | 显示全部楼层
虽然说了那么多年电子爱好者,但一直没学习编程,51也一直没学,最近买了STM32的,计划学习起来!

看你这个好像跟那个有点类似。。。

点评

用STM32做ARDUINO吧,挺好玩的,还简单。  详情 回复 发表于 2019-7-1 18:33

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享 进了门就好了,祝你成功!.

查看全部打赏

发表于 2019-6-14 11:50:00 | 显示全部楼层
cbcb4cb 发表于 2019-6-13 21:45
我就是芯片变板砖那个,话说还有救吗,刷imax b6刷了一次然后1602没显示且不识别,换一个再刷,又一个 ...

用外部有源晶振就能救活。我也因为那个讨厌的熔丝位搞变砖过,用有源的晶振救活了。很久不碰atmega了,太麻烦了。

点评

其实很多AVR已经不怕这个了,假如选错了时钟,芯片是运行在内部32KHz振荡器上面的。这就需要把ISP编程时钟调节到8KHz(F_CPU的 1/4),然后就能正常恢复芯片了。但最便宜的那种ISP线是不能调节编程速度的还是无解。  详情 回复 发表于 2019-6-19 09:36

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 精彩回帖

查看全部打赏

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

Archiver|手机版|小黑屋|关于我们|联系我们|网站条款|数码之家 ( 闽ICP备05031405号 )

GMT+8, 2019-9-16 23:14 , Processed in 0.217326 second(s), 15 queries , MemCache On.

Powered by Discuz!

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表