数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 5247|回复: 24

[AVR] bootloader不再神秘 AVR单片机折腾 教小白如何在ArduinoIDE制作适合自己的开发板

    [复制链接]
发表于 2021-4-17 21:10:18 | 显示全部楼层 |阅读模式

认识众多玩家高手/拆客/DIYer,查阅更多资源,一起学习技术知识

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

x
之前项目上不能使用的ATmega168(以下称168)为了对其测试,做了一个AVR并行熔丝恢复器 ,经过一系列的测试,原来是芯片的时钟有点问题了。

过程:
选用并行编程将熔丝位恢复为默认(Lfuse,Hfuse,Efuse:)62DFF9,这时ISP可以对其进行读写了,用的软件是progisp1.72版本。说明芯片没有完全坏掉。想写个测试程序测试下芯片工作情况,由于是使用内部1MHz的RC振荡作为时钟,没有对应的Bootloader,所以没法在ArduinoIDE里直接下载程序,但,可以用ArduinoIDE编译成HEX文件,用progisp写入到芯片FLASH里。测试程序是使用Arduino数字口0、1、11、13来做个分频的闪灯。
20 调试中.jpg

下图是好芯片在NANO板的运行结果,熔丝值为FFDDF8,外部16M晶振,以此为参考。
01 NANO16Mtest.png

占空比都是50%,脉宽分别是:0口是125ms、1口是250ms、11口是500ms(0.5s)、13口是1s。以11口(第三行)脉宽0.5秒为参照。

下面进行坏芯片测试:
熔丝值:62DFF9,4 个LED规律、稳定闪烁。
02 N08d8M_F.PNG
03 N08d8M_W.PNG

测得第三行脉宽为8秒。8/0.5=16倍,时钟由标准的16M降为1M,默认熔丝设定也是内部1M的RC振荡。熔丝值:E2DFF9,只有数字13口的LED微亮,其它LED不亮。芯片应该没有工作起来。此为内部8MRC振荡。熔丝值:FFDFF9,使用外部晶体振荡,晶振为16M,与使用内部8M一样,芯片不工作。熔丝值:7FDFF9,使用外部晶体振荡,且设置8分频。
04 Wxxd8M_F.PNG

下面使用不同的晶振测试,先来4M,4 个LED规律、稳定闪烁。
05 W04d8M_W.PNG

第三行脉宽为16秒。16/0.5=32倍,时钟由标准的16M降为0.5M(16/32=0.5)。使用8M晶振,4 个LED规律、稳定闪烁。
06 W08d8M_W.PNG

第三行脉宽为8秒。8/0.5=16倍,实际时钟是1M。使用16M晶振,4 个LED规律、稳定闪烁。
07 W16d8M_W.PNG

第三行脉宽为5秒。4/0.5=8倍,实际时钟是2M。使用20M晶振,4 个LED规律、稳定闪烁。
08 W20d8M_W.PNG

第三行脉宽为3.2秒。3.2/0.5=6.4倍,实际时钟是2.5M。使用22M晶振,4 个LED规律、稳定闪烁。
09 W22d8M_W.PNG

第三行脉宽为2.89秒。2.89/0.5=5.78倍,实际时钟是2.768M。使用24M晶振,4 个LED规律、稳定闪烁。
10 W24d8M_W.PNG

第三行脉宽为2.667秒。2.667/0.5=5.334倍,实际时钟约为3M。如果这个规律成立,芯片工作在4M时,外接32M晶振就可以。手头没有。直接上个48M晶振,4 个LED规律、稳定闪烁。依规律计算,芯片应该工作在6M。然而,
11 W48d8M_W.PNG

第三行脉宽为4秒。4/0.5=8倍,实际时钟是2M。正如手册说明,当CKSEL3..1为111时,低功率晶体振荡器可用8.0 - 16.0M满振幅晶体振荡器可用0.4-25M。48M不在范围内。通过测试,可见芯片的时钟在3M以下时工作是正常的。 接下来就是重新编译一个适合这个芯片的Bootloader了。这里又要确定两个值:一个是串口的波特率;另一个是Bootloader的起始地址。因为这个芯片不能工作在较高的时钟下了,计划使用内部8M的RC振荡进行8分频,实际工作时钟就是1M,这样熔丝位也可以使用出厂的默认值。查了下Arduino各种板的串口波特率(每秒的位传输速度),大部分使用的是115200的波特率,这时的时钟为外置16M晶振,若使用1M时钟,是不是波特率也要降16倍,变为7200呢?根据AVR的波特率计算公式算出时钟为1M时,各种波特率的误差,从表中查到,误差小的可以使用4800,这样的速度是很慢的,9600的波特率也是可以接受的。
12 1M波特率.png

另外,1M的时钟,一个时钟周期是1us。当9600的波特率传输时,传输一位所用时间约是(1s/9600=)104us,完全可以的,所以取9600测试。Bootloader的起始地址需要配置相关的熔丝位,不要害怕,只要配置BOOTSZ和BOOTRST,168芯片是熔丝扩展位。
image.png

设<BOOTSZ=10>,这样Boot区的大小(256Words),Boot区起始地址(0x1F00)。设<BOOTRST=0>,将复位向量移至Boot区起始地址处。这里的地址是以“字”为单位的,若换算为“字节”要乘以2,Boot区起始地址以字计算是0x1F00,以字节计算是0x3E00。在Mekefile文件中加入如下内容:
13 Makefile.png


简单说明下:
-DBAUD_RATE=9600是使用9600波特率--section-start=.text=0x3e00 是BOOT区起始地址--section-start=.version=0x3ffe 是BOOT区结束地址AVR_FREQ= 1000000L是时钟频率为1Matmega168_1MRC.hex是输出bootloader的文件名LFUSE= 62 HFUSE = DD EFUSE = 04熔丝值,使用内部RC振荡1M时钟;掉电检测是2.7V;512字节空间的BOOT区。运行omake atmega168_1MRC命令进行编译,产生atmega168_1MRC.HEX文件。
在boards文件中加入如下内容:
14 board.png

一看就懂,不多讲。打开ArduinoIDE,看看开发板是不是多了一个使用内部RC振荡1M时钟的选项
15 BOAD.png

测试程序可以直接上传了,说明以上的串口波特率和Bootloader的设置都没有问题。
16 SUC.PNG

现在是使用内部1M时钟,测试程序上传完成后,数字口0、1、11、13接着的LED规律、稳定闪烁,
17 INTrc1M_62_W.png

从图中可见,占空比都是50%,脉宽分别是:0口125ms、1口250ms、11口500ms(0.5s)、13口1s。11口(第三行)脉宽0.5秒,与第一幅图的标准对比不差。说明芯片可以在低时钟下工作,可能坏在低位熔丝的“CLKDIV8”位上了,不能进行有效的8分频。推测可以使用外置24M晶振,进行8分频后得3M,用于芯片时钟。这时的波特率可选14400,可想速度快点可以选择38400。然后更换相应的Makefile和boards文件即可。
18 3M波特率.png

测试中使用到的硬件及工具
19 所用工具0.jpg
19 所用工具1.jpg
19 所用工具2.jpg
19 所用工具3.jpg

楼下讲讲怎样在ArduinoIDE中加入一个新的开发板,伸出小手点个赞


打赏

参与人数 18M币 +1325 收起 理由
hfsp + 20 謝謝分享
10655188 + 20
mydigit + 1000 恭喜获得原创文章热度奖励1000M.
玛德陛下 + 20 謝謝分享
miqi328 + 20
寂静的春天 + 20
超级女生 + 20 謝謝分享
kyhwhb + 20 優秀文章
411183343 + 20
hongo + 20 原創內容

查看全部打赏

本帖被以下淘专辑推荐:

 楼主| 发表于 2021-4-17 21:10:49 | 显示全部楼层

bootloader不再神秘 AVR单片机折腾 教小白如何在ArduinoIDE制作适合自己的开发板

在ArduinoIDE中加入一个新的开发板:
以1.8.9版本的ArduinoIDE为例,主目录是arduino-1.8.9
ArduinoIDE中每一个开发板,在boards.txt文件中都对应一段定义,如Arduino Nano的ATmega328P:
01.png

boards.txt文件中可以找到:
####################################
nano.name=Arduino Nano
nano.upload.tool=avrdude
nano.upload.protocol=arduino
nano.bootloader.tool=avrdude
nano.bootloader.unlock_bits=0x3F
nano.bootloader.lock_bits=0x0F
nano.build.f_cpu=16000000L
nano.build.board=AVR_NANO
nano.build.core=arduino
nano.build.variant=eightanaloginputs
## Arduino Nano w/ATmega328P
##--------------------------
nano.menu.cpu.atmega328=ATmega328P
nano.menu.cpu.atmega328.upload.maximum_size=30720
nano.menu.cpu.atmega328.upload.maximum_data_size=2048
nano.menu.cpu.atmega328.upload.speed=115200
nano.menu.cpu.atmega328.bootloader.low_fuses=0xFF
nano.menu.cpu.atmega328.bootloader.high_fuses=0xDA
nano.menu.cpu.atmega328.bootloader.extended_fuses=0xFD
nano.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex
nano.menu.cpu.atmega328.build.mcu=atmega328p

从定义中可知:
熔丝位为Lfuse:FF,Hfuse:DA,Efuse:FD,Lock:3F
时钟为16M,波特率为115200,FLASH大小为30720bytes,bootloader文件为optiboot_atmega328.hex等等。
boards.txt文件在:ArduinoIDE目录(arduino-1.8.9)\hardware\arduino\avr\boards.txt
接下为是bootloader文件,目录是:ArduinoIDE目录(arduino-1.8.9)\hardware\arduino\bootloaders\,这里不同开发板的bootloader文件在不同的目录里。

如optiboot\下就可以找到optiboot_atmega328.hex这个以328P为MCU构成的NANO板的bootloader文件,而这个文件产生,要使用Makefile文件进行编译。用记事本打开,可以找到如下一段:

atmega328: TARGET = atmega328
atmega328: MCU_TARGET = atmega328p
atmega328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
atmega328: AVR_FREQ = 16000000L
atmega328: LDSECTIONS  =-Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega328: $(PROGRAM)_atmega328.hex
atmega328: $(PROGRAM)_atmega328.lst
atmega328_isp: atmega328
atmega328_isp: TARGET = atmega328
atmega328_isp: MCU_TARGET = atmega328p
# 512 byte boot, SPIEN
atmega328_isp: HFUSE = DE
# Low power xtal (16MHz) 16KCK/14CK+65ms
atmega328_isp: LFUSE = FF
# 2.7V brownout
atmega328_isp: EFUSE = 05
atmega328_isp: isp
这里面定义了熔丝位,波特率,boot区的大小及起始地址,与boards.txt对应。

了解了以上,就可以自己为ArduinoIDE,定制一块开发板了,朋友项目中使用了内部8M的时钟,下面我们一起来做个使用内部1M时钟的。
首先,要下载一个1.0.4版本的ArduinoIDE,主要是为了做出bootloader文件,因为在1.8.9的版本内精简了文件,不能做出bootloader文件,1.0.4测试通过的。

第一步:在arduino-1.0.4\hardware\arduino\bootloaders\optiboot\目录下找到Makefile文件,没有扩展名的。用编辑器(可以用记事本)打开,适当位置加入以下这部分并保存:
# Standard atmega168, only at 9,600 baud for closer clock accuracy ANDusing 1Mhz internal RC oscillator BY-jf201006
#
atmega168_1MRC: TARGET = atmega168
atmega168_1MRC: MCU_TARGET = atmega168
atmega168_1MRC: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=9600'
atmega168_1MRC: AVR_FREQ = 1000000L
atmega168_1MRC: LDSECTIONS  =-Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe
atmega168_1MRC: $(PROGRAM)_atmega168_1MRC.hex
atmega168_1MRC: $(PROGRAM)_atmega168_1MRC.lst
atmega168_1MRC_isp: atmega168
atmega168_1MRC_isp: TARGET = atmega168
atmega168_1MRC_isp: MCU_TARGET = atmega168
# 2.7V brownout, SPIEN
atmega168_8MRC_isp: HFUSE = DD
# Int. RC Osc. 1MHz, slowly rising power-65ms
atmega168_1MRC_isp: LFUSE = 62
# 512 byte (256Words) boot
atmega168_1MRC_isp: EFUSE = 04
atmega168_1MRC_isp: isp

在命令窗口运行omake atmega168_1MRC命令进行编译,
02 omake.png

运行结束后会在optiboot目录下多出两个文件:optiboot_atmega168_1MRC.hex和optiboot_atmega168_1MRC.lst,我们只要HEX文件。
记事本打开可以看到如下内容:
07 optiboot_atmega168_1MRC.png

将optiboot_atmega168_1MRC.hex拷贝到现以使用的ArduinoIDE(arduino-1.8.9)\hardware\arduino\avr\bootloaders\optiboot\目录下。

第二步:在arduino-1.8.9\hardware\arduino\avr目录下找到boards.txt并打开(可以使用记事本)。加入如下部分并保存:
######################################################
atmega168_1MRC.name=ATmega168 Optiboot @ 9,600baud w/ 1MHz IntRC.
atmega168_1MRC.upload.tool=avrdude
atmega168_1MRC.upload.protocol=arduino
atmega168_1MRC.upload.maximum_size=14336
atmega168_1MRC.upload.maximum_data_size=1024
atmega168_1MRC.upload.speed=9600
atmega168_1MRC.bootloader.tool=avrdude
atmega168_1MRC.bootloader.low_fuses=0x62
atmega168_1MRC.bootloader.high_fuses=0xDF
atmega168_1MRC.bootloader.extended_fuses=0xFC
## atmega168_1MRC.bootloader.path=optiboot
atmega168_1MRC.bootloader.file=optiboot/optiboot_atmega168_1MRC.HEX
atmega168_1MRC.bootloader.unlock_bits=0x3F
atmega168_1MRC.bootloader.lock_bits=0x0F
atmega168_1MRC.build.board=AVR_NANO
atmega168_1MRC.build.mcu=atmega168
atmega168_1MRC.build.f_cpu=1000000L
atmega168_1MRC.build.core=arduino
atmega168_1MRC.build.variant=standard

第三步:打开ArduinoIDE查看:
03 OK.png

已经有我们做的开发板了。

使用方法:168芯片熔丝低位设置为62,高位DF(可根据实际设置),扩展位为FC。为芯片下载bootloader文件,就是第一步做出来的optiboot_atmega168_1MRC.HEX。之后就可以在ArduinoIDE中使用了。

根据此方法可以做出自己项目中需要的开发板来。

另附上optiboot_atmega168_1MRC.hex文件的内容:
:103E0000112484B714BE81FFF0D085E08093810037
:103E100082E08093C00088E18093C10086E08093B7
:103E2000C2008CE08093C4008EE0C9D0259A86E061
:103E300023EC3FEF91E0309385002093840096BB04
:103E4000B09BFECF1D9AA8958150A9F7CC24DD2404
:103E500088248394B5E0AB2EA1E19A2EF3E0BF2E27
:103E6000A2D0813461F49FD0082FAFD0023811F076
:103E7000013811F484E001C083E08DD089C0823420
:103E800011F484E103C0853419F485E0A6D080C024
:103E9000853579F488D0E82EFF2485D0082F10E0EE
:103EA000102F00270E291F29000F111F8ED0680127
:103EB0006FC0863521F484E090D080E0DECF843678
:103EC00009F040C070D06FD0082F6DD080E0C816C8
:103ED00088E3D80618F4F601B7BEE895C0E0D1E053
:103EE00062D089930C17E1F7F0E0CF16F8E3DF0614
:103EF00018F0F601B7BEE89568D007B600FCFDCF14
:103F0000A601A0E0B1E02C9130E011968C911197C0
:103F100090E0982F8827822B932B1296FA010C01A0
:103F200087BEE89511244E5F5F4FF1E0A038BF07D0
:103F300051F7F601A7BEE89507B600FCFDCF97BE86
:103F4000E89526C08437B1F42ED02DD0F82E2BD092
:103F50003CD0F601EF2C8F010F5F1F4F84911BD0D7
:103F6000EA94F801C1F70894C11CD11CFA94CF0C53
:103F7000D11C0EC0853739F428D08EE10CD084E9ED
:103F80000AD086E07ACF813511F488E018D01DD0B0
:103F900080E101D065CF982F8091C00085FFFCCFD4
:103FA0009093C60008958091C00087FFFCCF809158
:103FB000C00084FD01C0A8958091C6000895E0E688
:103FC000F0E098E1908380830895EDDF803219F06E
:103FD00088E0F5DFFFCF84E1DECF1F93182FE3DF0A
:103FE0001150E9F7F2DF1F91089580E0E8DFEE2736
:043FF000FF2709940A
:023FFE000404B9
:0400000300003E00BB
:00000001FF




如果觉着有用就伸出小手点个赞
谢谢观赏!!
祝坛友们周末快乐!!


打赏

参与人数 9M币 +190 收起 理由
有点发烧 + 20 謝謝分享
超级女生 + 20 謝謝分享
kkdkj + 20 謝謝分享
10655188 + 20
itutu1 + 30 謝謝分享
ljlun + 20 恭喜授精
8139 + 20 優秀文章
qrut + 20 謝謝分享
玛德陛下 + 20 謝謝分享

查看全部打赏

回复 支持 5 反对 0

使用道具 举报

发表于 2021-4-17 22:05:01 | 显示全部楼层
看起来真厉害,俺是看不懂。

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-18 08:18:53 来自手机浏览器 | 显示全部楼层
那个ISP下载器不能烧熔丝位吗?

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-18 10:20:17 来自手机浏览器 | 显示全部楼层
触景情伤 发表于 2021-4-18 08:18
那个ISP下载器不能烧熔丝位吗?

当然可以。但我是折腾一个项目上拆下来的芯片,各种情况都有,自己做的熔丝恢复器可以读出原来们熔丝值,以查看问题所在。

打赏

参与人数 2M币 +40 收起 理由
8139 + 20 精彩回帖
ljlun + 20 谢谢分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-18 13:28:24 来自手机浏览器 | 显示全部楼层
jf201006 发表于 2021-4-18 10:20
当然可以。但我是折腾一个项目上拆下来的芯片,各种情况都有,自己做的熔丝恢复器可以读出原来们熔丝值, ...

我还以为我买错了呢,吃灰了几年,就因为手里有几片AT89c52的单片机

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-19 11:17:57 | 显示全部楼层
配件真齊全啊!
牙膏擠滿了。。。

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-19 14:08:57 | 显示全部楼层
一堆代码,看着头晕

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-20 19:00:35 | 显示全部楼层
又有的折腾了

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-22 23:19:22 | 显示全部楼层
有了BootLoader确实方便,不同厂家,不同型号的单片机可以共用同一个上位机软件更新APP程序。现在玩AVR的不多了吧,大多是用8051或ARM,ARM的BootLoader很简单,8051的BootLoader会比较麻烦一点,但是不复杂,只是设置起来比较麻烦,原理都一样。

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-23 08:59:19 来自手机浏览器 | 显示全部楼层
595953427@qq 发表于 2021-4-22 23:19
有了BootLoader确实方便,不同厂家,不同型号的单片机可以共用同一个上位机软件更新APP程序。现在玩AVR的不 ...

是的,玩AVR的少。找些相关的例程也不方便。

打赏

参与人数 2M币 +40 收起 理由
8139 + 20 我很贊同
ljlun + 20 我很贊同

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-23 17:32:06 | 显示全部楼层
jf201006 发表于 2021-4-18 10:20
当然可以。但我是折腾一个项目上拆下来的芯片,各种情况都有,自己做的熔丝恢复器可以读出原来们熔丝值, ...

谢谢分享!

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-25 20:58:03 | 显示全部楼层
学习了!Q~万恶的字数。。。。。。。。。。。。

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-28 15:28:38 | 显示全部楼层
完全看不懂
。。。。。

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-28 15:36:03 | 显示全部楼层
jf201006 发表于 2021-4-23 08:59
是的,玩AVR的少。找些相关的例程也不方便。

现在ARM比较流行

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 我很贊同

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-5-1 16:32:17 | 显示全部楼层
LZ有研究在arduino里添加mega8/16/32通用的AVR进行二次开发吗?就像UNO 或者ATMEGA官方开发板那样,用串口更新固件update。
之前有了解过,好像貌似bootloader这块始终没有搞定

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 没有研究过

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-5-1 17:27:34 | 显示全部楼层
大佬 大佬 这个bootloader可以用另一片arduino uno r3 下载进去吧

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 应该是可以吧

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-5-1 19:53:57 | 显示全部楼层
在涨价前进了些STC8G1K08A-36I-SOP8,希望高手能折腾个arduino ide环境支持。

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 找找方法,自己搞出来

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
595953427@qq 发表于 2021-4-22 23:19
有了BootLoader确实方便,不同厂家,不同型号的单片机可以共用同一个上位机软件更新APP程序。现在玩AVR的不 ...

stm32用的bootloader是只要找一个所有型号都通用吗?
avr的我知道不通用.arm没研究太多

打赏

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

查看全部打赏

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

活动推荐上一条 /1 下一条

Archiver|手机版|小黑屋|关于我们|联系我们|网站条款|数码之家

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2021-5-9 09:28 , Processed in 0.156000 second(s), 17 queries , Redis On.

Powered by Discuz!

© 2006-2021 MyDigit.cn

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