我试图理解Arduino引导程序。我在这里找到了一些介绍:Arduino Bootloader,但我需要更多细节,因此我会寻求帮助。
在我的研究过程中,我找到了一个起点:好的,Arduino(atmega系列)有一个专用于bootloader的特定闪存块。一旦mcu有一个引导加载程序,它就可以通过串口下载新程序并将其存储在闪存中,地址为0x00。
让我们为这个问题签署atmega328p。
#1 - 如果您查看第343页的数据表,您将看到一个表格,其中显示了有关引导加载程序大小的一些信息:
通过这个表我理解:如果我将BOOTSZ1 / 0设置为0/0,我可以有一个2K的引导程序,它将存储在闪存堆栈中:0x3800~0x3FFF。
#2 - 如果您打开Arduino生成的ATMEGA328_BOOTLOADER的hex文件,您将看到存储在以下位置的引导加载程序:
:10**7800**000C94343C0C94513C0C94513C0C94513CE1
到
:10**7FF0**00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91
如果您考虑7FF0 - 7800,您将获得7F0(2K字节的程序)
#3 - 如果你打开makefile(C:\ Program Files(x86)\ Arduino \ hardware \ arduino \ avr \ bootloaders \ atmega),你会看到atmega328的这个参数:
atmega328: LDSECTION = --section-start=.text=0x7800
其中0x7800与bootloader中的hexa文件匹配。
问题:
1-为什么数据表告诉我,我有一个特殊的地方用于bootloader和Arduino的makefile强制它存储在不同的地方?
2-什么意思是hexa文件的行?
:10E000000D9489F10D94B2F10D94B2F10D94B2F129
:10 : (?)
E000 : Address
00 : (?)
0D9489F10D94B2F10D94B2F10D94B2F1 : data (?)
29 : CRC (?)
答案 0 :(得分:1)
首先,我不确定我们是否有相同的atmel数据表;你的桌子在我的桌子上是27-7,但无论如何数据都是一样的。
免责声明:我对此并不是百分之百确定,但我非常自信。
我认为"问题"这是"单词"。阅读他们写的核心概述
大多数AVR指令都有一个16位字格式。每个程序存储器地址都包含一个16位或32位指令
这意味着指令宽度为2个字节。因此,您的地址0x3800对应于从内存开始的0x7000字节,而引导加载程序0x3FFF的末尾对应于字节0x7FFE和0x7FFF。
这由内存大小确认:0x7FFF对应32k,这是可用的闪存。由于引导加载程序位于内存的末尾(如DS中的图片所示),这意味着0x3FFF应该是最后一个内存单元。
编辑:
当我回答时,我没有阅读问题的第二部分。格式是所谓的英特尔二进制格式。有关详细信息,请参阅Wikipedia。这是一个简短的总结。
您正确识别了字段分割:
: : Start code
10 : Number of data bytes (in this case: 16)
E000 : Starting address of the data bytes
00 : Record type (in this case: data)
0D9489F10D94B2F10D94B2F10D94B2F1 : data payload (in this case: 16 bytes)
29 : CRC
记录类型可以是
获得CRC总和所有字节(从长度1开始,所以最开始),然后得到LSB,最后得到2补码。在这种情况下,总和为2519,十六进制为0x9D7。低位字节D7对应于215.它的2补码可以计算为256 - x,所以41,这意味着0x29为十六进制。