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