Компилятор MPLAB XC16, выводящий 8-битные HEX-файлы для PIC24?

Я пытаюсь понять 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-битным, потому что каждая позиция занята одним байтом.

  • Есть ли способ заставить компилятор выводить 16-битный файл?
  • Этот файл все еще действителен для 16-битного MCU? Как я могу интерпретировать файл HEX, чтобы вручную прошить MCU?

Ответы (3)

Файлы Intel HEX всегда имеют байтовую адресацию. Это не означает, что они не могут обрабатывать информацию для других размеров слов, просто необходимо соглашение о том, как эти слова сопоставляются с байтами HEX-файла.

Как и во всех других PIC с небайтовой адресацией (PIC 10, 12 и 16), адреса в HEX-файле удваиваются. Программное обеспечение PIC-программатора знает об этом и соответствующим образом интерпретирует адреса HEX-файлов. Конечно, все это хорошо задокументировано в спецификации программирования для любой части, которую вы хотите запрограммировать.

Вы говорите, что хотите сделать свой собственный программатор. Это нормально, если вы понимаете, что это займет гораздо больше времени и разочарований, чем просто получение заведомо работающего. Если дело в опыте и обучении делать свои собственные, то хорошо, но в противном случае идите и купите его.

Если вы действительно хотите сделать свой собственный, вам следует посмотреть код для моих программаторов PIC. Весь код хоста и микропрограммы открыты и доступны в выпуске программного обеспечения для разработки по адресу http://www.embedinc.com/picprg/sw.htm . Просматривая исходный код хоста, вы можете увидеть, что есть флаги, указывающие, удваиваются ли адреса файлов HEX для различных частей памяти PIC.

Если вы сделаете свой программатор совместимым с моим протоколом программаторов PIC , вы сможете использовать все мои инструменты на стороне хоста. Это может быть очень полезно при настройке вашей системы, поскольку вы знаете рабочий код на другой стороне. Спецификация протокола на первый взгляд может показаться пугающей, но присмотритесь внимательно, и вы увидите, что большая ее часть является необязательной, особенно если вы планируете поддерживать только один PIC.

Я был близок к тому, чтобы купить Пикит. Однако я не хочу быть привязанным к одному производителю. У меня есть другие проекты, которые могут использовать или не использовать чипы Atmel. Вместо того, чтобы покупать новый программатор для каждого производителя, я мог бы научиться делать это сам. Я также считаю это полезным опытом.

Файлы Intel HEX всегда указываются в байтах, а адреса в файле измеряются в байтах. Это просто удобный формат, используемый для передачи двоичных данных между вашим компоновщиком и программным обеспечением. Программное обеспечение для программирования, которое вы используете, должно интерпретировать данные и их адреса и правильно вводить их в PIC.

Я понимаю, что программное обеспечение для программирования должно интерпретировать файл HEX, однако мой текущий проект заключается в создании собственного программного обеспечения для программирования. Я использую Arduino для взаимодействия с MCU. Пока у меня есть прошивка Arduino и оболочка с графическим интерфейсом. Все, чего мне сейчас не хватает, это интерпретировать HEX-файл, чтобы я мог отправить правильную информацию в Arduino. Я знаю о других проектах программатора Arduino->PIC, однако ни один из них не совместим с PIC24.

Хотя Олин Латроп ответил на вопрос, я дополняю его ответ примером того, как он будет применяться к шаблону, который я вставил в свой исходный пост.

После дальнейшего изучения 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
Единственное изменение, которое я бы внес в преобразованные шестнадцатеричные строки, это изменение адреса на 24-битные адреса pic24.
1. :02 0000 04 0000                                                                                                                                                         фа 2. :08 0000 00 0x00040200 0x00000000                                                                                       f2 3. :02 0000 04 0000                                                                                                                                                         фа 4. :10 0002 00 0x000002c8 0x000002ce 0x000002e4 0x000002d4 92 5. :10 0006 00 0x000002da 0x000002e8 0x000002ec 0x000002e0 42