Я пытаюсь понять HEX-файл, который я скомпилировал с помощью Microchip MPLAB X IDE с помощью компилятора Microchip MPLAB XC16 .
Что касается MCU, я ориентируюсь на PIC24EP512GU814. Однако объем этого вопроса должен относиться как минимум ко всем микроконтроллерам PIC24.
Чтобы скомпилировать приведенный ниже пример HEX, во время работы мастера «Новый проект» я выбрал Samples > Microchip Embedded > PIC24 C Template и выбрал конфигурацию XC16_24EP512GU814 .
Согласно разделу 4.1.1 таблицы данных PIC24EP / dsPIC33 , стр. 48, память сегментирована на 16-битные слова, так что каждая позиция (0x0000, 0x0001, ...) содержит 16 бит. На той же странице таблицы данных инструкции программы называются 24-битными и занимают 2 слова, так что старший байт старшего слова равен нулю (00000000b).
Это не соответствует скомпилированному HEX-файлу. Вот первые 5 строк файла, пронумерованные и с различными частями, разделенными в соответствии со спецификациями Intel HEX .
1. :02 0000 04 0000 fa
2. :08 0000 00 0002040000000000 f2
3. :02 0000 04 0000 fa
4. :10 0008 00 c8020000ce020000e4020000d4020000 92
5. :10 0018 00 da020000e8020000ec020000e0020000 42
Рассмотрим строки 4 и 5. Первое поле правильно считает 0x10 (16) байт в поле данных. Однако второе поле, обозначающее местоположение в памяти, перескакивает с 0x0008 на 0x0018 или 0x0010 (16) позиций.
Из моей интерпретации это означает, что этот конкретный HEX-файл является 8-битным, а не 16-битным, потому что каждая позиция занята одним байтом.
Файлы Intel HEX всегда имеют байтовую адресацию. Это не означает, что они не могут обрабатывать информацию для других размеров слов, просто необходимо соглашение о том, как эти слова сопоставляются с байтами HEX-файла.
Как и во всех других PIC с небайтовой адресацией (PIC 10, 12 и 16), адреса в HEX-файле удваиваются. Программное обеспечение PIC-программатора знает об этом и соответствующим образом интерпретирует адреса HEX-файлов. Конечно, все это хорошо задокументировано в спецификации программирования для любой части, которую вы хотите запрограммировать.
Вы говорите, что хотите сделать свой собственный программатор. Это нормально, если вы понимаете, что это займет гораздо больше времени и разочарований, чем просто получение заведомо работающего. Если дело в опыте и обучении делать свои собственные, то хорошо, но в противном случае идите и купите его.
Если вы действительно хотите сделать свой собственный, вам следует посмотреть код для моих программаторов PIC. Весь код хоста и микропрограммы открыты и доступны в выпуске программного обеспечения для разработки по адресу http://www.embedinc.com/picprg/sw.htm . Просматривая исходный код хоста, вы можете увидеть, что есть флаги, указывающие, удваиваются ли адреса файлов HEX для различных частей памяти PIC.
Если вы сделаете свой программатор совместимым с моим протоколом программаторов PIC , вы сможете использовать все мои инструменты на стороне хоста. Это может быть очень полезно при настройке вашей системы, поскольку вы знаете рабочий код на другой стороне. Спецификация протокола на первый взгляд может показаться пугающей, но присмотритесь внимательно, и вы увидите, что большая ее часть является необязательной, особенно если вы планируете поддерживать только один PIC.
Файлы Intel HEX всегда указываются в байтах, а адреса в файле измеряются в байтах. Это просто удобный формат, используемый для передачи двоичных данных между вашим компоновщиком и программным обеспечением. Программное обеспечение для программирования, которое вы используете, должно интерпретировать данные и их адреса и правильно вводить их в PIC.
Хотя Олин Латроп ответил на вопрос, я дополняю его ответ примером того, как он будет применяться к шаблону, который я вставил в свой исходный пост.
После дальнейшего изучения IDE я нашел программу просмотра памяти, выбрав Window > PIC Memory Views > Program Memory .
Сравнивая представленную в этом окне таблицу с HEX-файлом, мы можем заметить, как устроены инструкции. В следующем примере я разделил каждое поле адреса на два и расставил инструкции:
1. :02 0000 04 0000 fa
2. :08 0000 00 00020400 00000000 f2
3. :02 0000 04 0000 fa
4. :10 0004 00 c8020000 ce020000 e4020000 d4020000 92
5. :10 000C 00 da020000 e8020000 ec020000 e0020000 42
Поскольку данные представлены в форме с прямым порядком байтов, байты отображаются в порядке, обратном шестнадцатеричному литералу. Таким образом, преобразование данных в шестнадцатеричные литералы приводит к следующему:
1. :02 0000 04 0000 fa
2. :08 0000 00 0x00040200 0x00000000 f2
3. :02 0000 04 0000 fa
4. :10 0004 00 0x000002c8 0x000002ce 0x000002e4 0x000002d4 92
5. :10 000C 00 0x000002da 0x000002e8 0x000002ec 0x000002e0 42
Даниэль