技术热线: 4007-888-234

PIC单片机的十六进制文件格式:Hex文件

更新时间: 2019-08-27
阅读量:6861

Microchip通过在一个Hex文件中包含编程PIC单片机所需的所有信息,在Atmel AVR上取得了相当的成功。这包括代码、EEPROM数据、用户字节(用户ID)以及最重要的配置字。

这使得将项目从开发转移到生产或工程师之间变得更加容易,因为所需的所有信息都在一个文件中。Atmel现在已经被Microchip接管,他们已经姗姗来迟地添加了一个可以做同样事情的ELF生产文件格式。下面英锐恩将讲解有关PIC单片机Hex文件的问题。


QQ截图20190815175004.png

一、在源文件中创建配置字节

您需要在C或汇编程序中将配置字节数据添加到源文件中。对于不同的工具和C或汇编程序,语法确实有所不同。Microchip C或汇编程序中的PIC16F示例使用__Config指令,例如

__CONFIG(0x3F72);

汇编程序中的另一个示例是:

__config _CP_OFF&_HS_OSC&_WDT_OFF&_PWRTE_ON&_LVP_OFF&_BODEN_ON

PIC18F通常使用CONFIG指令,例如,

CONFIG WDT = OFF; 禁用看门狗定时器
CONFIG MCLRE = ON;
CONFIG DEBUG = ON时MCLEAR引脚; 启用调试模式
CONFIG LVP = OFF;

XC8和XC16编译器使用pragma指令,例如

#pragma config FOSC = HS //振荡器选择
#pragma config WDTE = OFF //看门狗定时器使能(禁止WDT)
#pragma config PWRTE = OFF //上电延时定时器使能(PWRT)禁用)
#pragma config MCLRE = ON // MCLR引脚功能选择
#pragma config CP = OFF //闪存程序存储器代码保护
#pragma config CPD = OFF //数据存储器保护

查看编译器文档以获取更多详细信息 配置位名称从PIC单片机到PIC单片机不同,有关配置字节的详细信息,请参见PIC单片机数据手册中的“CPU部分的特殊功能”。

二、MPLAB X配置工具

最新的MPLAB X在C文件中以不同方式处理配置字节。使用MPLAB X汇编程序文件时,__ CONFIG和CONFIG指令仍然有效,但C编译器需要不同的格式。它需要使用#pragma config WDTE = ON语法。

生成所需#pragma指令的最简单方法是使用内置的配置字节工具。

转到窗口菜单->PIC内存视图->配置位。

将打开一个窗口,其中列出了项目中设置的可用配置字节。PIC18F芯片的可用配置字节不同,但方法相同。按照您的需要设置它们,然后单击“生成源代码到输出”按钮。这会创建您需要剪切并粘贴到主源文件中的代码,或者放入单独的C文件并使用#include 主文件中的指令。

MPLAB X中的PIC18F配置字节示例

#include <xc.h>
// #pragma config语句应该在项目文件包含之前。
//使用项目枚举代替#define进行ON和OFF。
// CONFIG1H
#pragma config OSC = RCIO //振荡器(外部RC振荡器,RA6上的端口功能)
#ppma config FCMEN = OFF //故障保护时钟监视器使能位(禁用故障保护时钟监视器)
#pragma config IESO = OFF //内部/外部振荡器切换位(禁用振荡器切换模式)

MPLAB X中的PIC16F配置字节示例

// #pragma config语句应位于项目文件包含之前。
//使用项目枚举代替#define进行ON和OFF。
// CONFIG1

#pragma config FOSC = HS //振荡器选择位(HS振荡器:RA6 / OSC2 / CLKOUT和RA7 / OSC1 / CLKIN上的高速晶体/谐振器)
#pragma config WDTE = ON //看门狗定时器使能位( WDT使能)
#pragma config PWRTE = OFF //上电延时定时器使能位(PWRT禁止)
#pragma config MCLRE = ON // RE3 / MCLR引脚功能选择位(RE3 / MCLR引脚功能为MCLR)
#pragma config CP = OFF //代码保护位(禁止程序存储器代码保护)
#pragma config CPD = OFF //数据代码保护位(禁止数据存储器代码保护)
#pragma config BOREN = OFF //欠压复位选择位(BOR禁用)
#pragma config IESO = ON //内部外部切换位(内部/外部切换模式已启用)
#pragma config FCMEN = ON //故障保护时钟监视器使能位(启用故障保护时钟监视器)
#pragma config LVP =关闭

这些指令将配置字节添加到输出Hex文件,这将在下面描述。

三、PIC18F单片机的HEX文件格式

Microchip格式的Hex文件是扩展的Intel Hex文件,包含代码,数据,配置字节和用户ID。您需要选择输出文件类型为INHX32。这是32位寻址,因为配置字节存储在64KB以上,这是8位Intel Hex格式INHX8的限制。所有PIC程序员都应该能够应对这种格式,而PIC编译器应该能够生成它。

文件中的每一行都有这种格式:

:BBAAAATT [DDDDDDDD] CC

其中,

:是行标记
BB的开始是行
AAAA上的数据字节数是以字节为单位的地址
TT是类型。00表示数据,01表示EOF,02表示线性地址,04表示扩展地址
DD是数据字节,数字取决于BB值
CC是校验和(2s补码,字节数+地址+数据)

四、扩展和线性寻址

标准Intel Hex文件只能处理64KB数据(0..FFFFh),扩展寻址通过为每64KB添加扩展地址线来克服此限制,例如:

:020000040001F9 - 64KB标记
:020000040002F9 - 128KB标记
扩展地址 - 04 - 标记意味着移动04 16个位置后给出的值。
行:020000040001F9表示向左移动1 16个位置,给出10000h,十进制为65536或64KB。向左移动2 16个位置可提供20000h或128KB等等。
标记后面的所有数据的地址都添加了标记值。

下一个复杂因素是某些编译器使用线性地址而不是扩展地址。这以类似的方式工作,但是标记是02而不是04,并且该值仅向左移动4个位置。线性寻址格式的等效64KB标记是

:020000021000EC - 64KB标记

在02标记之后移动值,即1000,剩下四个位置也给出10000或64KB。请注意,校验和将更改。您可能会看到PIC Hex文件中使用的任一格式。

一些编译器包括空代码行(所有FF),但其他编译器省略这些行以节省空间。

代码:它位于文件的顶部,可以通过扩展地址行进行 - :020000040000FA,其中04是扩展地址的类型或线性地址02.在这两种情况下,结果地址值仍然是0x0000所以它实际上没有任何效果。

EEPROM数据:由扩展地址线 - 0200000400F00A继续。EEPROM部分是可选的。

配置字节:这些字节存储在300000h,前面是扩展地址行 - :020000040030CA。正确的格式是8个Fuse字节和6个Lock字节都在同一行,但不同的编译器和汇编器有不同的显示这些字节的方法。如果未设置锁定字节,有时会省略锁定字节,有时数据会分布在多行上。

标准格式将未使用的位显示为1(例如,FF表示未使用的字节),但在PIC单片机上,它们读为0.编程器应将未使用的位屏蔽为0,以便配置字节将正确验证。

用户ID:这些是用户存储数据的字节,例如代码版本号。它们存储在200000h。同样,它们之前是扩展地址行:020000040020DA。标准格式需要8个字节,但有些编译器再次省略了未使用的字节。

文件结束:所有Intel Hex文件的End of File标记为:00000001FF

例如,

:100000003C932014BBE0AD7A3EAC4D261FB267A4F2
:100010008121F4C2D641A503B6038C9932A36EBCEC
:10002000D204306AE84404FCE8C7452DE0BE3160E4
:100030005CC6E94D3F4E62765AC237EAD3C2895157
:0200000400F00A
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:020000040030CA
:1000000000270F0F0083F500FFC0FFE0FF400000C5
:020000040020DA
:080000000102030405060708D4
:00000001FF

这显示4行代码,1行EEPROM数据:0200000400F00A,8位用户用户字节位于:020000040020CA,16位配置字节位于:020000040030CA,最后2位是假人,因为它只有14个配置字节。

五、PIC16F单片机的HEX文件格式

PIC16F文件具有与PIC18F文件类似的格式,但由于PIC16F单片机较小,因此不使用扩展寻址。对于最新的PIC16F1xxx芯片,此部分不正确 - 请参见下面的单独部分。

代码:代码始终位于.hex文件的顶部。布局因编译器和汇编器的不同而不同,例如每行的数据量,是否包含空行等。请注意,PIC16F单片机使用14位指令,因此代码存储为低字节优先的字。因此,未使用的位置显示为FF3F。但是,寻址是以字节为单位的。

EEPROM数据:如果单片机具有EEPROM,则数据在HEX文件中向上存储在地址0x4200处。它以字格式存储,但只有低字节包含数据 - 高字节始终为0并被丢弃。

配置字:大多数PIC16F上只有一个14位配置字,存储在地址0x400E。它首先存储为高字节。有些设备最多有3个字。

用户数据:最多8个字节存储在0x4000。

文件结束:所有Intel Hex文件的End of File标记为:00000001FF

例如,

:100000005D38A23BB437B11731090A0F1202E92358
:100010007B3E20286F335609A104A12BB00DE92D9A
:100020008D22260D260A931C951D510C6711131065
:10420000FF00FF00FF00FF00FF00FF00FF00FF00B6
:06400E00FF3FFF3FFF3FF2
:08400000FF3FFF3FFF3FFF3FC0
:00000001FF

六、PIC16F1xxx单片机的HEX文件格式

早期的PIC16F微控制器的代码存储器不到16KB。EEPROM数据,用户ID和配置字节也存储在64KB以下,因此标准的Intel Hex文件很好。

较新的PIC16F1xxx单片机更大,最新的64KB程序空间。为了容纳这个更大的闪存,hex文件中的其他数据移动到64KB以上,并且需要扩展或线性寻址才能访问它 - 有关这些寻址模式的完整描述,请参见PIC18F部分。

1.代码

它仍然存储在地址0x0000中,但在开始时可能有一个扩展或线性地址线,例如:020000040000FA。这仍然意味着在0x0000处启动代码。由于最大代码大小为64KB,因此该文件实际上不需要扩展寻址来容纳代码。

2.EEPROM

EEPROM数据从地址0x1E000开始存储。这意味着它必须在它之前有一个扩展地址标记:020000040001FA或:020000021000EC。这给出了一个0x10000的基地址,并且从E000开始添加了EEPROM数据地址,在文件中给出了0x1E000作为EEPROM地址。

:10E00000FF00FF00FF00FF00FF00FF00FF00FF0018

请注意,8位EEPROM数据填充为00,在PIC单片机编程时将被丢弃。

3.用户ID用户ID

有4个14位字,存储在地址0x10000到0x10003。它们通常存储在一条线上,但可以分布在不同的线上。

4.配置字节

数从2到5不等,实际上是14位字。它们从地址0x1000E开始,可能出现在一行上,或者每行可能有自己的行。

示例 尽管EEPROM存储在较高的地址(0x1E000),但它通常出现在用户ID之前的十六进制文件中,存储在0x10000,而配置存储在0x1000E。某些工具也可以将程序代码存储在正常的地址顺序之外。

:020000040000FA Extended Address 0x0000
:020000000428D2 Code
:040002000034003492
:080008004001003094004001AA
:10001000FF308E0000308E001120FF308E00112046
:100020000A280130A0000130A1000A30A200A00B74
:0C0030001728A10B1728A20B17280800A6 End of Code
:020000040001F9 Extended Address 0x10000
:10E0000061006200630064006500660067006800EC EEPROM
:10E01000FF00FF00FF00FF00FF00FF00FF00FF0008 EEPROM
:080000000100020003000400EE User ID 0x10000
:02000E00DA1FF7 Configuration starting at 0x1000E
:020010003F2986
:020012009F0746
:02001400FC3EB0
:02001600FF3FAA Last configuration
:00000001FF End of File

七、PIC24FJ单片机

使用#pragma和与PIC18F相同的生成工具以完全相同的方式创建组态数据。不同PIC24FJ单片机的配置字节数和名称数会有所不同。

最新的PIC24FJxxGB4xx和PIC24FJxxGB7微控制器具有单独的OTP(一次性可编程)存储器,用于存储用户数据。这是永久性的,是一个大小的编程页面,64或128条指令(192或384字节)。可以使用Window - > PIC Memory Views - > User OTP Memory菜单在MPLAB中创建该部分。

配置字节存储在闪存的最后一页,并在复位时加载到配置寄存器,因此闪存的最后一页可以用hex文件中的扩展地址标记分隔。

在GA4/GB4设备上,OTP内存通常列在最后一页代码之前的文件中,即使它位于远高于设备实际大小的更高地址。

此部分具有扩展地址标记:020000040100F9,大小为192或384字节。

闪存的最后一页将具有扩展地址,但这将随设备的大小而变化。对于PIC24FJ64单片机,它将是:020000021000EC它们实际上大于64KB。