專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應用測試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導入到強大技術支援服務 全程貼心伴隨服務,創(chuàng)造無限潛能!
Microchip通過在一個Hex文件中包含編程PIC單片機所需的所有信息,在Atmel AVR上取得了相當?shù)某晒?。這包括代碼、EEPROM數(shù)據(jù)、用戶字節(jié)(用戶ID)以及最重要的配置字。
這使得將項目從開發(fā)轉移到生產(chǎn)或工程師之間變得更加容易,因為所需的所有信息都在一個文件中。Atmel現(xiàn)在已經(jīng)被Microchip接管,他們已經(jīng)姍姍來遲地添加了一個可以做同樣事情的ELF生產(chǎn)文件格式。下面英銳恩將講解有關PIC單片機Hex文件的問題。
一、在源文件中創(chuàng)建配置字節(jié)
您需要在C或匯編程序中將配置字節(jié)數(shù)據(jù)添加到源文件中。對于不同的工具和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引腳; 啟用調(diào)試模式
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 //數(shù)據(jù)存儲器保護
查看編譯器文檔以獲取更多詳細信息 配置位名稱從PIC單片機到PIC單片機不同,有關配置字節(jié)的詳細信息,請參見PIC單片機數(shù)據(jù)手冊中的“CPU部分的特殊功能”。
二、MPLAB X配置工具
最新的MPLAB X在C文件中以不同方式處理配置字節(jié)。使用MPLAB X匯編程序文件時,__ CONFIG和CONFIG指令仍然有效,但C編譯器需要不同的格式。它需要使用#pragma config WDTE = ON語法。
生成所需#pragma指令的最簡單方法是使用內(nèi)置的配置字節(jié)工具。
轉到窗口菜單->PIC內(nèi)存視圖->配置位。
將打開一個窗口,其中列出了項目中設置的可用配置字節(jié)。PIC18F芯片的可用配置字節(jié)不同,但方法相同。按照您的需要設置它們,然后單擊“生成源代碼到輸出”按鈕。這會創(chuàng)建您需要剪切并粘貼到主源文件中的代碼,或者放入單獨的C文件并使用#include 主文件中的指令。
MPLAB X中的PIC18F配置字節(jié)示例
#include <xc.h>
// #pragma config語句應該在項目文件包含之前。
//使用項目枚舉代替#define進行ON和OFF。
// CONFIG1H
#pragma config OSC = RCIO //振蕩器(外部RC振蕩器,RA6上的端口功能)
#ppma config FCMEN = OFF //故障保護時鐘監(jiān)視器使能位(禁用故障保護時鐘監(jiān)視器)
#pragma config IESO = OFF //內(nèi)部/外部振蕩器切換位(禁用振蕩器切換模式)
MPLAB X中的PIC16F配置字節(jié)示例
// #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 //數(shù)據(jù)代碼保護位(禁止數(shù)據(jù)存儲器代碼保護)
#pragma config BOREN = OFF //欠壓復位選擇位(BOR禁用)
#pragma config IESO = ON //內(nèi)部外部切換位(內(nèi)部/外部切換模式已啟用)
#pragma config FCMEN = ON //故障保護時鐘監(jiān)視器使能位(啟用故障保護時鐘監(jiān)視器)
#pragma config LVP =關閉
這些指令將配置字節(jié)添加到輸出Hex文件,這將在下面描述。
三、PIC18F單片機的HEX文件格式
Microchip格式的Hex文件是擴展的Intel Hex文件,包含代碼,數(shù)據(jù),配置字節(jié)和用戶ID。您需要選擇輸出文件類型為INHX32。這是32位尋址,因為配置字節(jié)存儲在64KB以上,這是8位Intel Hex格式INHX8的限制。所有PIC程序員都應該能夠應對這種格式,而PIC編譯器應該能夠生成它。
文件中的每一行都有這種格式:
:BBAAAATT [DDDDDDDD] CC
其中,
:是行標記
BB的開始是行
AAAA上的數(shù)據(jù)字節(jié)數(shù)是以字節(jié)為單位的地址
TT是類型。00表示數(shù)據(jù),01表示EOF,02表示線性地址,04表示擴展地址
DD是數(shù)據(jù)字節(jié),數(shù)字取決于BB值
CC是校驗和(2s補碼,字節(jié)數(shù)+地址+數(shù)據(jù))
四、擴展和線性尋址
標準Intel Hex文件只能處理64KB數(shù)據(jù)(0..FFFFh),擴展尋址通過為每64KB添加擴展地址線來克服此限制,例如:
:020000040001F9 - 64KB標記
:020000040002F9 - 128KB標記
擴展地址 - 04 - 標記意味著移動04 16個位置后給出的值。
行:020000040001F9表示向左移動1 16個位置,給出10000h,十進制為65536或64KB。向左移動2 16個位置可提供20000h或128KB等等。
標記后面的所有數(shù)據(jù)的地址都添加了標記值。
下一個復雜因素是某些編譯器使用線性地址而不是擴展地址。這以類似的方式工作,但是標記是02而不是04,并且該值僅向左移動4個位置。線性尋址格式的等效64KB標記是
:020000021000EC - 64KB標記
在02標記之后移動值,即1000,剩下四個位置也給出10000或64KB。請注意,校驗和將更改。您可能會看到PIC Hex文件中使用的任一格式。
一些編譯器包括空代碼行(所有FF),但其他編譯器省略這些行以節(jié)省空間。
代碼:它位于文件的頂部,可以通過擴展地址行進行 - :020000040000FA,其中04是擴展地址的類型或線性地址02.在這兩種情況下,結果地址值仍然是0x0000所以它實際上沒有任何效果。
EEPROM數(shù)據(jù):由擴展地址線 - 0200000400F00A繼續(xù)。EEPROM部分是可選的。
配置字節(jié):這些字節(jié)存儲在300000h,前面是擴展地址行 - :020000040030CA。正確的格式是8個Fuse字節(jié)和6個Lock字節(jié)都在同一行,但不同的編譯器和匯編器有不同的顯示這些字節(jié)的方法。如果未設置鎖定字節(jié),有時會省略鎖定字節(jié),有時數(shù)據(jù)會分布在多行上。
標準格式將未使用的位顯示為1(例如,F(xiàn)F表示未使用的字節(jié)),但在PIC單片機上,它們讀為0.編程器應將未使用的位屏蔽為0,以便配置字節(jié)將正確驗證。
用戶ID:這些是用戶存儲數(shù)據(jù)的字節(jié),例如代碼版本號。它們存儲在200000h。同樣,它們之前是擴展地址行:020000040020DA。標準格式需要8個字節(jié),但有些編譯器再次省略了未使用的字節(jié)。
文件結束:所有Intel Hex文件的End of File標記為:00000001FF
例如,
:100000003C932014BBE0AD7A3EAC4D261FB267A4F2
:100010008121F4C2D641A503B6038C9932A36EBCEC
:10002000D204306AE84404FCE8C7452DE0BE3160E4
:100030005CC6E94D3F4E62765AC237EAD3C2895157
:0200000400F00A
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:020000040030CA
:1000000000270F0F0083F500FFC0FFE0FF400000C5
:020000040020DA
:080000000102030405060708D4
:00000001FF
這顯示4行代碼,1行EEPROM數(shù)據(jù):0200000400F00A,8位用戶用戶字節(jié)位于:020000040020CA,16位配置字節(jié)位于:020000040030CA,最后2位是假人,因為它只有14個配置字節(jié)。
五、PIC16F單片機的HEX文件格式
PIC16F文件具有與PIC18F文件類似的格式,但由于PIC16F單片機較小,因此不使用擴展尋址。對于最新的PIC16F1xxx芯片,此部分不正確 - 請參見下面的單獨部分。
代碼:代碼始終位于.hex文件的頂部。布局因編譯器和匯編器的不同而不同,例如每行的數(shù)據(jù)量,是否包含空行等。請注意,PIC16F單片機使用14位指令,因此代碼存儲為低字節(jié)優(yōu)先的字。因此,未使用的位置顯示為FF3F。但是,尋址是以字節(jié)為單位的。
EEPROM數(shù)據(jù):如果單片機具有EEPROM,則數(shù)據(jù)在HEX文件中向上存儲在地址0x4200處。它以字格式存儲,但只有低字節(jié)包含數(shù)據(jù) - 高字節(jié)始終為0并被丟棄。
配置字:大多數(shù)PIC16F上只有一個14位配置字,存儲在地址0x400E。它首先存儲為高字節(jié)。有些設備最多有3個字。
用戶數(shù)據(jù):最多8個字節(jié)存儲在0x4000。
文件結束:所有Intel Hex文件的End of File標記為:00000001FF
例如,
:100000005D38A23BB437B11731090A0F1202E92358
:100010007B3E20286F335609A104A12BB00DE92D9A
:100020008D22260D260A931C951D510C6711131065
:10420000FF00FF00FF00FF00FF00FF00FF00FF00B6
:06400E00FF3FFF3FFF3FF2
:08400000FF3FFF3FFF3FFF3FC0
:00000001FF
六、PIC16F1xxx單片機的HEX文件格式
早期的PIC16F微控制器的代碼存儲器不到16KB。EEPROM數(shù)據(jù),用戶ID和配置字節(jié)也存儲在64KB以下,因此標準的Intel Hex文件很好。
較新的PIC16F1xxx單片機更大,最新的64KB程序空間。為了容納這個更大的閃存,hex文件中的其他數(shù)據(jù)移動到64KB以上,并且需要擴展或線性尋址才能訪問它 - 有關這些尋址模式的完整描述,請參見PIC18F部分。
1.代碼
它仍然存儲在地址0x0000中,但在開始時可能有一個擴展或線性地址線,例如:020000040000FA。這仍然意味著在0x0000處啟動代碼。由于最大代碼大小為64KB,因此該文件實際上不需要擴展尋址來容納代碼。
2.EEPROM
EEPROM數(shù)據(jù)從地址0x1E000開始存儲。這意味著它必須在它之前有一個擴展地址標記:020000040001FA或:020000021000EC。這給出了一個0x10000的基地址,并且從E000開始添加了EEPROM數(shù)據(jù)地址,在文件中給出了0x1E000作為EEPROM地址。
:10E00000FF00FF00FF00FF00FF00FF00FF00FF0018
請注意,8位EEPROM數(shù)據(jù)填充為00,在PIC單片機編程時將被丟棄。
3.用戶ID用戶ID
有4個14位字,存儲在地址0x10000到0x10003。它們通常存儲在一條線上,但可以分布在不同的線上。
4.配置字節(jié)
數(shù)從2到5不等,實際上是14位字。它們從地址0x1000E開始,可能出現(xiàn)在一行上,或者每行可能有自己的行。
示例 盡管EEPROM存儲在較高的地址(0x1E000),但它通常出現(xiàn)在用戶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相同的生成工具以完全相同的方式創(chuàng)建組態(tài)數(shù)據(jù)。不同PIC24FJ單片機的配置字節(jié)數(shù)和名稱數(shù)會有所不同。
最新的PIC24FJxxGB4xx和PIC24FJxxGB7微控制器具有單獨的OTP(一次性可編程)存儲器,用于存儲用戶數(shù)據(jù)。這是永久性的,是一個大小的編程頁面,64或128條指令(192或384字節(jié))??梢允褂肳indow - > PIC Memory Views - > User OTP Memory菜單在MPLAB中創(chuàng)建該部分。
配置字節(jié)存儲在閃存的最后一頁,并在復位時加載到配置寄存器,因此閃存的最后一頁可以用hex文件中的擴展地址標記分隔。
在GA4/GB4設備上,OTP內(nèi)存通常列在最后一頁代碼之前的文件中,即使它位于遠高于設備實際大小的更高地址。
此部分具有擴展地址標記:020000040100F9,大小為192或384字節(jié)。
閃存的最后一頁將具有擴展地址,但這將隨設備的大小而變化。對于PIC24FJ64單片機,它將是:020000021000EC它們實際上大于64KB。