AN3927 Freescale USB Mass Storage Device Bootloader Application Note Rev. 0, 11/2009 (перевод)
4.4 Добавление загрузчика в проект для ColdFire V2
Данный раздел предлагает пошаговую инструкцию, добавляющую загрузчик в имеющийся проект в среде CodeWarrior для ColdFire V2. Для демонстрации используется пример HID_DEMO фирмы CMX для ColdFire V2, основанный на стеке USB той же фирмы. По лицензионным соображениям исходные тексты CMX не включены в состав кода, сопровождающего данную статью, тем не менее, предлагаемые шаги позволяют включить загрузчик в указанный пример. Программное обеспечение фирмы CMX включено в состав идущего с отладочной платой под MCF52259 диска. Документ, озаглавленный "Лабораторные работы на основе облегченного стека USB фирмы CMX для MCF52259" (M52259CMXUSBLAB), описывает использование примеров фирмы CMX с отладочной платой.
Пути к упоминаемым в тексте файлам загрузчика даются относительно корневого каталога сопровождающего данную статью кода. Пути к файлам примеров CMX даются относительно каталога, в который установлено программное обеспечение указанной фирмы.
-
Все объявления вектора сброса и прерываний должны быть убраны из приложения. Загрузчик использует вектор сброса для перехода на собственную стартовую процедуру, принимающую решение о продолжении работы загрузчика или запуске целевого приложения. Оставленное в приложении объявление вектора вызовет ошибку компоновщика при попытке размещения двух векторов по однму адресу в программной памяти.
Стандартным методом определения вектора сброса в приложении является объявление адресной константы, размещённое в каком-либо из файлов проекта, например "mcf5222x_vectors.s". Расположение вектора в программной памяти устанавливается как прямым указанием адреса, так и определением сегментов памяти в LCF-файле компоновщика. При интеграции в приложение загрузчика указанный вектор должен быть изъят. Процедура переадресации прерываний детализируется в последующих шагах.
Пример CMX использует такую же таблицу векторов, как и загрузчик в файле "mcf5222x_vectors.s". При объединении проектов используется таблица загрузчика. Текст примера CMX следует изменить для сохранения кода инициализации. Для файла:
-
\usb-peripheral\projects\CodeWarrior\mcf52223\mcf5222x_vectors.s
следует провести следующие изменения:
-
Уберите " VECTOR_TABLE " со всеми векторами прерываний. Эта таблица будет заменена таблицей загрузчика.
-
Уберите ссылки на энергонезависимые регистры, перечисленные ниже. Данные регистры будут устанавливаться загрузчиком.
-
.org 0x400 KEY_UPPER: .long 0x00000000 KEY_LOWER: .long 0x00000000 CFMPROT: .long 0x00000000 CFMSACC: .long 0x00000000 CFMDACC: .long 0x00000000 CFMSEC: .long 0x00000000
-
-
Измените функцию " start ". Поправленный код должен вызывать ассемблерный вариант функции. Добавьте перед именем функции подчёркивание, чтобы C-код мог к ней обращаться:
-
_start:
-
-
Объявите стартовую функцию публичной, чтобы разрешить к ней внешние вызовы. Для этого добавьте в секцию объявлений строку:
-
.global _start
-
Полный текст исправленного файла "mcf5222x_vectors.s" приводится в приложении "Appendix A - mcf5222x_vectors.s из примера CMX для Coldfire V2".
-
-
Скопируйте файлы:
-
Bootloader_V2.h
mcf5225x_vectors.s
usr_entry_V2.c
V2_Bootloader.lib
из проекта загрузчика:
-
\Shared Source\V2_Source
в каталог приложения:
-
\usb-peripheral\src\mcf5222x\hid-demo
Добавьте скопированные файлы в проект CodeWarrior, для чего в проектном окне среды следует открыть правой кнопкой мыши контекстное меню, выбрать команду "Add File" и добавить новые файлы в проект.
-
Bootloader_V2.h
-
Теперь файлы загрузчика должны быть видны в окне проекта среды CodeWarrior, как показано на рисунке 15.
Рисунок 15. Окно проекта примера CMX для Coldfire_V2 -
Скопируйте и отредактируйте LCF-файл компоновщика. Сведения о его структуре можно почерпнуть в руководстве пользователя. файл из проекта загрузчика следует использовать как заготовку, внося изменения согласно теребованиям приложения. Обратите особенное внимание на секции памяти и стека в файле из проекта приложения. Для примера CMX требуются следующие изменения:
-
Используйте предлагаемый файл компоновщика из проекта загрузчика, как стартовую точку. Переименуйте и скопируйте файл:
-
\Shared Source\V2_Source\mcf52259_bl_flash.lcf
в каталог примера CMX вместо файла:
-
\usb-peripheral\projects\CodeWarrior\mcf52223\mcf522x_evb_flash.lcf
-
-
Добавьте в файл данные для таблицы описателей буферов USB (BDT). Пример CMX использует для определения их местоположения LCF-файл. Скопируйте код из оригинального LCF-файла примера в новый файл после строки " __BSS_END = .; " в секции " .bss ":
-
/* Buffer descriptor base address shall be aligned to 512 byte boundary. Size shall be 512 bytes. */ . = ALIGN(512); __BDT_BASE = .; . = . + 512; __BDT_END = .;
-
Полный тескт исправленного файла компоновщика приводится в приложении "Appendix B - LCF-файл из примера CMX для Coldfire V2".
-
-
Внесите изменения в приложение для объединения с загрузчиком. Для примера CMX поправьте файл "hid_main.c" следующим образом:
-
Включите ссылку на заголовочный файл загрузчика:
-
#include "Bootloader_V2.h
-
-
Добавьте вектор пользователя. В примере CMX точкой входа приложения является функция " start ":
-
extern asm void start(void); void usb_it_handler(void); const byte _UserEntry[] @ USER_ENTRY_ADDRESS = { 0x4E, 0x71, 0x4E, 0xF9 //asm NOP(0x4E71), asm JMP(0x4EF9) }; void (* const _UserEntry2[])()@(USER_ENTRY_ADDRESS+4)= { start, };
-
-
Добавьте переназначаемые в оперативную память вектора прерываний. В примере CMX, использующем только прерывание от USB, вектор прерывания от USB под номером 53 должен указывать на " usb_it_handler() ". Добавьте в начале функции " main() " до вызова " hw_init() " строку:
-
__VECTOR_RAM[64 + 53] = (hcc_u32) usb_it_handler;
-
-
Добавьте код переназначающий вектора прерываний в оперативную память. После вызова " hw_init() ", назначающего вектора прерываний в программную память, следует добавить строку:
-
mcf5xxx_wr_vbr((hcc_u32) __VECTOR_RAM);
-
Полный текст исправленного файла приводится в приложении "Appendix C - hid_main.c из примера CMX для ColdFire V2".
-
-
Попытка трансляции проекта вызовет ошибку. Дело в том, что пример CMX и загрузчик используют для описания регистров ColdFire разные заголовочные файлы. Измените в файлах "Bootloader_V2.h" и "usr_entry_V2.c" строку:
-
#include "support_common.h
на строку:
-
#include "mcf5222x_reg.h
-
-
Компиляция в этой точке вызовет ошибку, т.к. "usr_entry_V2.c" ссылается на стартовую функцию для проекта загрузчика. Замените два вызова функции " asm_startmeup() " на " start() ". Полный текст исправленного файла приводится в приложении "Appendix D - usr_entry_V2.c из примера CMX для ColdFire V2".
-
Компоновщик должен знать имя функции, исполняющей роль точки входа. Измените имя точки входа в свойствах проекта CMX "Settings -> Linker -> Coldfire Linker". Измените содержимое поля "Entry Point" на " __Entry " и сохраните изменения.
Примечание.
Используйте два знака подчёркивания в имени.
Рисунок 16. Опции компоновщика примера CMX для ColdFire V2 -
Соберите проект и запишите его в отладочную плату. Пример CMX должен работать как описано в документе "Лабораторные работы с облегченным стеком USB фирмы CMX для MCF52259". Для перехода в режим загрузки зафиксируйте в нажатом состоянии кнопку SW1, после чего кратковременно нажмите кнопку сброса. В управляющем компьютере появится диск загрузчика. Скопируйте на него файл S19 для другого примера и убедитесь в смене приложения. В качестве примера можно взять любой файл S19 для ColdFire V2 из каталога "\S19 Files". Активируйте загрузчик ещё раз и восстановите на отладочной плате пример CMX, используя файл из каталога:
-
\usb-peripheral\projects\CodeWarrior\mcf52223\hid-demo\hid-demo.elf.S19
-
4.5 Добавление загрузчика в проект для ColdFire V1
Данный раздел содержит пошаговую инструкцию, добавляющую загрузчик в имеющийся проект для ColdFire V1 в среде CodeWarrior. Для демонстрации используется пример HID-DEMO фирмы CMX для ColdFire V1, основанный на стеке USB той же фирмы. По лицензионным условиям исходные тексты стека CMX не включены в состав кода, сопровождающего данную статью, тем не менее, предлагаемая последовательность действий позволяет добавить загрузчик в указанный пример. Программное обеспечение CMX может быть загружено с сайта Freescale.
Пути к упоминаемым в тексте исходным файлам загрузчика отсчитываются от корневого каталога сопровождающего данную статью кода. Пути к файлам примеров CMX даются относительно каталога, в который установлено программное обеспечение указанной фирмы.
-
Скопируйте файлы:
-
Bootloader_V1.c
Bootloader_V1.h
exceptions.c
exceptions.h
usr_entry_V1.c
Bootloader_Headers.h
из проекта загрузчика:
-
\Shared Source\V1_Source\
в каталог приложения:
-
\usb-peripheral\projects\CodeWarrior-6.x\mcf51xx\hid-demo\Sources\
Добавьте скопированные файлы в проект CodeWarrior, для чего в проектном окне среды следует выбрать группу файлов примера "hid-demo", открыть правой кнопкой мыши относящееся к нему контекстное меню, выбрать команду "Add File" и добавить новые файлы в проект.
-
Bootloader_V1.c
-
Скопируйте в то же место и добавьте в проект файлы:
-
FAT16.c
FAT16.h
ParseS19.hc
ParseS19.h
SCSI_Process.c
SCSI_Process.h
из проекта загрузчика:
-
\Shared Source\Common_Across_Cores\
-
FAT16.c
-
Теперь файлы загрузчика видны в составе проекта приложения, как показано на рисунке 17.
Рисунок 17. Файлы примера CMX для Coldfire V1 -
Скопируйте и отредактируйте файл компоновщика. Сведения о его структуре можно почерпнуть в руководстве пользователя. LCF-файл из проекта загрузчика следует использовать как заготовку, внося изменения согласно требованиям приложения. Обратите особенное внимание на секции памяти и стека в файле из проекта приложения. Для примера CMX откройте файл компоновщика:
-
\usb-peripheral\projects\CodeWarrior-6.x\mcf51xx\hid-demo\prm\Project_flash.lcf
и внесите следующие изменения:
-
Секцию " MEMORY " следует изменить, чтобы она разделяла память загрузчика и приложения на разные области. Для этого замените секцию " MEMORY " в файле приложения содержимым одноимённой секции из файла загрузчика:
-
MEMORY { bootcode (RX) : ORIGIN = 0x000410, LENGTH = 0x00001BF0 code (RX) : ORIGIN = 0x002200, LENGTH = 0x0001DE00 #code (RX) : ORIGIN = 0x000410, LENGTH = 0x0001FBF0 #userram (RWX) : ORIGIN = 0x800000, LENGTH = 0x00004000 vectorram (RWX) : ORIGIN = 0x800000, LENGTH = 0x00000200 userram (RWX) : ORIGIN = 0x800200, LENGTH = 0x00003E00 bootsram (RWX) : ORIGIN = 0x8006E0, LENGTH = 0x00003B60 }
-
-
Увеличте размер стека. Загрузчик и приложение разделяют один стек, таким образом, он должен соответствовать размерам большего из двух, то есть стеку загрузчика. Измените размер, как указано ниже:
-
___stack_size = 0x400;
-
-
В LCF-файл необходимо добавить загрузочную секцию, чтобы сообщить компоновщику где следует располагать код загрузчика и его переменные. Скопируйте следующие секции из LCF-файла проекта загрузчика и добавьте их в LCF-файл примера CMX после секции " .code ":
-
.bootcode: { ___Boot_START = .; Bootloader_V1.c (.text) Bootloader_V1.c (.rodata) usr_entry_V1.c (.text) ParseS19.c (.text) ParseS19.c (.rodata) SCSI_Process.c (.text) SCSI_Process.c (.rodata) FAT16.c (.text) FAT16.c (.rodata) exceptions.c (.text) . = ALIGN (0x4); ___Boot_END =.; } > bootcode .bootsram: { ___Boot_RAM_START = .; Bootloader_V1.c (.bss) Bootloader_V1.c (.sbss) usr_entry_V1.c (.bss) usr_entry_V1.c (.sbss) ParseS19.c (.bss) ParseS19.c (.sbss) SCSI_Process.c (.bss) SCSI_Process.c (.sbss) FAT16.c (.bss) FAT16.c (.sbss) . = ALIGN (0x4); ___Boot_RAM_END =.; } > bootsram
-
-
Измените местоположение стека, описываемое в секции " .custom " файла компоновщика. Данные о размещении стека следует брать в аналогичном файле из проекта загрузчика. Измените секцию " .custom ", как показано ниже:
-
.custom : { ___HEAP_START = .; ___heap_addr = ___HEAP_START; ___HEAP_END = ___HEAP_START + ___heap_size; . = ___HEAP_END; . = ALIGN(512); __BDT_BASE = .; . = . + 512; __BDT_END = .; ___SP_INIT = ___RAM_ADDRESS + ___RAM_SIZE; ___SP_END = ___SP_INIT - ___stack_size; } >> userram
-
Полный текст файла компоновщика со всеми необходимыми изменениями приведён в приложении "Appendix E - LCF-файл из примера CMX для ColdFire V1".
-
-
Измените главный файл приложения для включения загрузчика в его состав. Внесите следующие изменения в "hid_main.c":
-
Добавьте ссылку на заголовочный файл загрузчика.
-
#include "Bootloader_V1.h
-
-
Добавьте вектор пользователя. Для примера CMX имя точки входа - " _startup ":
-
extern asm void _startup(void); const byte _UserEntry[] @ USER_ENTRY_ADDRESS = { 0x4E, 0x71, 0x4E, 0xF9 //asm NOP(0x4E71), asm JMP(0x4EF9) }; void (* const _UserEntry2[])() @(USER_ENTRY_ADDRESS+4)= { _startup, };
-
-
Уберите объявление вектора сброса из текста приложения. Загрузчик использует вектор сброса для запуска собственнй начальной процедуры, принимающей решение о продолжении работы загрузчика или старте целевого приложения. Оставленное в тексте приложения объявление вектора вызовет ошибку компоновщика при попытке размещения двух векторов по одному адресу в программной памяти.
Стандартным методом задания вектора сброса является создание адресной константы в каком-либо из файлов проекта, например, "exceptions.c". Расположение вектора в программной памяти управляется либо прямым указанием нужного адреса при объявлении, либо при распределении сегментов памяти в файле компоновщика. При включении в приложение загрузчика объявление вектора сброса должно быть изъято. Процедура переадресации векторов прерываний описывается далее.
В примере CMX приложение использует таблицу векторов, расположенную в файле "exceptions.c", для доступа к функции " _startup() ". Перезапись файла "exceptions.c", произведённая на первом шаге, уже включает в себя необходимые изменения.
-
Таблица переадресованных векторов прерываний будет добавлена на следующем шаге. Для подготовки к нему добавьте в "hid_main.c" следующие строки:
-
__interrupt void dummy_ISR(void) {} typedef void (* pFun)(void);
-
-
Добавьте таблицу переадресованных векторов и заполните её адресами обработчиков прерываний целевого приложения. В примере CMX используется только прерывание от USB. Таблица векторов слишком велика, чтобы приводить её здесь целиком, поэтому скопируйте таблицу " RAM_vector[] " из файла "\V1 USB Bootloader Projects\USB Bootloader V1 Blinks PTE2\Sources\main.c" в файл "hid_main.c". Затем измените имя обработчика прерывания USB - вектора 69 - на " usb_it_handler() ". В скопированной таблице необходимо заменить содержимое вектора 77 - прерывания от таймера, использовавшееся в проекте простого загрузчика, на " dummy_ISR() ". Посмотрите, что должно получиться в результате:
-
void (* const RAM_vector[])() @REDIRECT_VECTORS = { (pFun)&dummy_ISR, // vector_0 INITSP (pFun)&dummy_ISR, // vector_1 INITPC ... (pFun)&dummy_ISR, // vector_68 Vspi2 (pFun)&usb_it_handler, // vector_69 Vusb (pFun)&dummy_ISR, // vector_70 VReserved70 (pFun)&dummy_ISR, // vector_71 Vtpm1ch0 (pFun)&dummy_ISR, // vector_72 Vtpm1ch1 (pFun)&dummy_ISR, // vector_73 Vtpm1ch2 (pFun)&dummy_ISR, // vector_74 Vtpm1ch3 (pFun)&dummy_ISR, // vector_75 Vtpm1ch4 (pFun)&dummy_ISR, // vector_76 Vtpm1ch5 (pFun)&dummy_ISR, // vector_77 Vtpm1ovf (pFun)&dummy_ISR, // vector_78 Vtpm2ch0 ... (pFun)&dummy_ISR, // vector_110 VL1swi };
-
-
Целевое приложение должно переназначить прерывания в оперативную память и скопировать туда же таблицу векторов. Для примера CMX поместите приводимый код в начало функции " main() " файла "hid_main.c":
-
/* !! This section needs to be here to redirect interrupt vectors !! */ dword *pdst,*psrc; byte i; asm (move.l #0x00800000,d0); asm (movec d0,vbr); pdst=(dword*)0x00800000; psrc=(dword*)&RAM_vector; for (i=0; i<111; i++, pdst++, psrc++) { *pdst=*psrc; } /* !! Start application code below here !! */
-
Полный текст файла со всеми необходимыми изменениями приводится в приложении "Appendix F - hid_main.c из примера CMX для ColdFire V1".
-
-
Измените существующую таблицу векторов прерываний приложения. В приложении она размещена в защищённой области программной памяти и должна быть перемещена. Для начала, следует изменить объявления обработчиков прерываний в тексте приложения.
Если при написании обработчика прерывания обозначить в заголовке функции номер вектора прерывания, среда CodeWarrior автоматически помещает имя объявленного обработчика в стандартную таблицу векторов на место, соответствующее указанному номеру вектора. При использовании загрузчика из объявлений обработчиков прерываний следует убрать номера соотвествующих им векторов.
Другим распространённым методом объявления векторов является создание массива адресных констант в каком-либо из файлов проекта, например, "exceptions.c". Расположение такой таблицы в программной памяти управляется либо прямым указанием нужного адреса при объявлении таблицы, либо распределением сегментов памяти в файле компоновщика. При включении в приложение загрузчика указанная таблица векторов также должна быть изъята.
В примере CMX используется только прерывание от USB. Номер вектора необходимо убрать из объявления обработчика " usb_it_handler() ". В файле "usb.c" следует изменить существующее объявление:
-
interrupt VectorNumber_Vusb void usb_it_handler(void)
на новое:
-
interrupt void usb_it_handler(void)
-
-
Измените уровень оптимизации проекта. В примере CMX оптимизация выключена, и результирующий код загрузчика не помещается в защищённых секторах памяти. Для изменения ситуации в меню "Edit -> DEMOJM Flash Settings -> Global Optimizations" следует установить движок уровня оптимизации в положение "Level 1".
Рисунок 18. Опции компилятора примера CMX для ColdFire V1 -
Соберите проект и запишите его в отладочную плату. Пример CMX должен работать как описано в документе "Приложение к лабораторным работам с платой DEMOJM для 32-х разрядного семейства Flexis JM128". Для перехода в режим загрузки зафиксируйте в нажатом состоянии кнопку PTG0, после чего кратковременно нажмите кнопку "Reset". В управляющем компьютере появится диск загрузчика. Скопируйте на него файл S19 для другого примера и убедитесь в смене приложения. В качестве примера можно взять любой файл S19 для ColdFire V1 из каталога "\S19 Files". Активируйте загрузчик ещё раз и восстановите на отладочной плате пример CMX, используя файл из каталога:
-
\usb-peripheral\projects\CodeWarrior-6.x\mcf51xx\hid-demo\bin\hid_demo.abs.S19
-
4.6 Добавление загрузчика в проект для MC9S08
Этот раздел даёт пошаговую инструкцию по включению загрузчика в имеющийся проект в среде CodeWarrior для MC9S08. Для демонстрации используется пример HID-DEMO фирмы CMX, использующий стек USB той же фирмы. По лицензионным условиям исходные тексты стека CMX не включены в состав кода, сопровождающего данную статью, тем не менее, предлагаемая последовательность действий показывает как можно добавить загрузчик в означенный пример. Программное обеспечение фирмы CMX можно загрузить с сайта Freescale.
Пути к упоминаемым в тексте исходным файлам загрузчика отсчитываются от корневого каталога сопровождающего данную статью кода. Пути к файлам примеров CMX даются относительно каталога, в который установлено программное обеспечение указанной фирмы.
-
Скопируйте файлы:
-
S08_Bootloader.abs.s19
Bootloader_S08.h
из проекта загрузчика:
-
\Shared Source\S08_Source\
в каталог приложения:
-
\usb-peripheral\projects\CodeWarrior\hc9S08jm60\hid-demo\Sources\
-
S08_Bootloader.abs.s19
-
Скопируйте и отредактируйте PRM-файл компоновщика. Сведения о его структуре можно почерпнуть в руководстве пользователя. Используйте PRM-файл из каталога загрузчика в качестве заготовки, внося в него требуемые приложением изменения. Обратите особенное внимание на секции памяти и стека в файле из проекта приложения. Для примера CMX следует сделать следующие шаги:
-
Скопируйте PRM-файл компоновщика из проекта загрузчика:
-
\S08 USB Bootloader Projects\Application with Bootloader S08 Blinks PTE2\prm\Project.prm
на место файла приложения:
-
\usb-peripheral\projects\CodeWarrior\hc9S08jm60\hid-demo\prm\Project.prm
-
-
Измените размер стека. Загрузчик использует для стека 80 байт, что является в среде CodeWarrior размером стека по умолчанию. Пример CMX использует под стек 114 байт. Измените в PRM-файле строки:
-
MY_STACK = READ_WRITE 0x1020 TO 0x10AF; Application_RAM = READ_WRITE 0x0100 TO 0x101F;
-
Полный текст результирующего файла приведён в приложении "Appendix G - PRM-файл из примера CMX для MC9S08".
-
-
Для включения загрузчика измените главный файл примера, в примере CMX это "hid_main.c":
-
Включите ссылку на заголовочный файл загрузчика, для чего добавьте строку:
-
#include "Bootloader_S08.h
-
-
Добавьте вектор пользователя, в примере CMX точкой входа является " _Startup() ":
-
void _Startup(void); // User Application code entry volatile const JumpVect UsrEntry@ USER_ENTRY_ADDRESS = { 0xCC, // op-code for JMP _Startup };
-
-
Добавьте используемую при переадресации таблицу векторов прерываний приложения. В примере CMX используется только прерывание от USB:
-
interrupt void Dummy_ISR(void) {} // User Interrupt Jump Vector Table volatile const JumpVect UserJumpVectors [InterruptVectorsNum] @ VectorAddressTableAddress = { { 0xCC, Dummy_ISR}, // 29 – RTC { 0xCC, Dummy_ISR}, // 28 – IIC { 0xCC, Dummy_ISR}, // 27 – ACMP { 0xCC, Dummy_ISR}, // 26 - ADC Conversion { 0xCC, Dummy_ISR}, // 25 – KBI { 0xCC, Dummy_ISR}, // 24 - SCI2 Transmit { 0xCC, Dummy_ISR}, // 23 - SCI2 Receive { 0xCC, Dummy_ISR}, // 22 - SCI2 Error { 0xCC, Dummy_ISR}, // 21 - SCI1 Transmit { 0xCC, Dummy_ISR}, // 20 - SCI1 Receive { 0xCC, Dummy_ISR}, // 19 - SCI1 Error { 0xCC, Dummy_ISR}, // 18 - TPM2 Overflow { 0xCC, Dummy_ISR}, // 17 - TPM2 Channel1 { 0xCC, Dummy_ISR}, // 16 - TPM2 Channel0 { 0xCC, Dummy_ISR}, // 15 - TPM1 Overflow { 0xCC, Dummy_ISR}, // 14 - TPM1 Channel5 { 0xCC, Dummy_ISR}, // 13 - TPM1 Channel4 { 0xCC, Dummy_ISR}, // 12 - TPM1 Channel3 { 0xCC, Dummy_ISR}, // 11 - TPM1 Channel2 { 0xCC, Dummy_ISR}, // 10 - TPM1 Channel1 { 0xCC, Dummy_ISR}, // 9 - TPM1 Channel0 { 0xCC, Dummy_ISR}, // 8 – Reserved { 0xCC, usb_it_handler}, // 7 - USB Status { 0xCC, Dummy_ISR}, // 6 - SPI2 { 0xCC, Dummy_ISR}, // 5 - SPI1 { 0xCC, Dummy_ISR}, // 4 - MCG Loss Lock { 0xCC, Dummy_ISR}, // 3 - Low VoltDetect { 0xCC, Dummy_ISR}, // 2 – IRQ { 0xCC, Dummy_ISR}, // 1 – SWI };
-
Результирующий файл приводится целиком в приложении "Appendix H - hid_main.c из примера CMX для MC9S08".
-
-
Убрите объявление вектора сброса из текста приложения. Загрузчик использует вектор сброса для запуска собственнй начальной процедуры, принимающей решение о продолжении работы загрузчика или старте целевого приложения. Оставленное в тексте приложения объявление вектора вызовет ошибку компоновщика при попытке размещения двух векторов по одному адресу в программной памяти.
Стандартным для среды CodeWarrior методом определения вектора сброса является объявление его в PRM-файле. Все объявления вида
-
VECTOR 0 _Startup
из файла компоновщика должны быть изъяты.
Другим распространённым методом задания вектора является объявление адресной константы в каком-либо из файлов проекта, например, "Vectors.c". Расположение вектора в программной памяти управляется либо прямым указанием нужного адреса при объявлении константы, либо при распределении сегментов памяти в файле компоновщика. При включении в приложение загрузчика объявление вектора сброса должно быть изъято. Процедура переадресации векторов прерываний описывается далее.
В примере CMX используется объявление " VECTOR 0 _Startup " в PRM-файле компоновщика. Все необходимые изменения уже внесены в файл, скопированный на шаге 2 из каталога загрузчика.
-
-
Имеющаяся таблица векторов приложения располагается в защищённых секторах памяти и должна быть переадресована. Первый шаг - изменить в целевом приложении объявления имеющихся процедур обработки прерываний.
Если при объявлении обработчика указывается номер соответствующего ему прерывания, среда CodeWarrior автоматически вносит адрес обработчика в стандартную таблицу векторов, что приводит к конфликту с таблицей, объявляемой загрузчиком. При использовании загрузчика номера векторов из объявлений обработчиков необходимо изъять.
Другим распространённым методом является размещение в каком-либо из проектных файлов, например "Vectors.c", векторов прерываний в виде таблицы адресных констант. Адрес размещения таблицы в программной памяти указывается либо в заголовке таблицы, либо в файле компоновщика при объявлении сегментов памяти. Созданные таким образом таблицы векторов прерываний также должны быть изъяты.
В примере CMX используется только прерывание от USB. Номер прерывания должен быть исключён из объявления обработчика " usb_it_handler() ", для чего в файле "usb.c" следует привести строку:
-
interrupt 7 void usb_it_handler(void)
к виду:
-
interrupt void usb_it_handler(void)
-
-
Соберите проект и запишите его в отладочную плату. Пример CMX должен работать как описано в сопроводительной документации на плату DEMOJM для 8-и разрядных контроллеров серии JM60 семейства Flexis. Для входа в режим загрузчика зафиксируйте в нажатом состоянии кнопку PTG0, после чего, кратковременно нажмите кнопку "Reset". В управляющей машине должен появиться диск загрузчика. Скопируйте на него файл S19 другого проекта и убедитесь в смене рабочего приложения. Вы можете использовать любой файл для MC9S08 из каталога "\S19 Files". Войдите в режим загрузчика ещё раз и восстановите на плате пример CMX, используя файл
-
\usb-peripheral\projects\CodeWarrior\hc9S08jm60\hid-demo\bin\Project.abs.s19
-
4.7 Перенос загрузчика на другие контроллеры
Данный загрузчик был написан для трёх указанных моделей контроллеров потому, что все они используют периферийные модули USB с одинаковым набором регистров и функциональностью. В момент написания статьи в число контроллеров Freescale, использующих такие модули входили: семейство Flexis JM, включающее контроллеры MC9S08 и ColdFire V1, семейство ColdFire V2 модели MCF522xx и семейство MC9S08JS. Планируется расширение модельного ряда.
Данную статью сопровождает код для трёх перечисленных моделей, который может быть легко переписан под любой контроллер, использующий указанный модуль USB. В процессе переноса кода на другой контроллер следует обращать внимание на следующие моменты:
-
измените макросы определяющие карту памяти в соответствующем файле Bootloader_xx.h (например, Bootloader_V2.h). Эти макросы объявляют диапазоны оперативной и программной памяти конкретных моделей контроллеров, начало защищаемых секторов памяти, расположение вектора пользователя, размер страницы программной памяти и адреса буферов USB.
-
измените файл компоновщика под новую карту памяти. Информацию о структуре файла компоновщика можно найти в руководствах пользователя.
-
проверьте прерывания в новом контроллере и исправьте под них таблицы реальных и переадресованных векторов прерываний.
-
проверьте инициализацию, включая тактирование как самого контроллера, так и его программной памяти, в файлах "Bootloader_xx.c" и "usr_entry_xx.c".
-
измените, если нужно, процедуру принудительного перевода устройства в режим загрузчика в файле "usr_entry_xx.c". Измените, например, вывод контроллера, используемый совместно с выводом "Reset".
- проверьте регистры защиты программной памяти. Для MC9S08 и ColdFire V1 меняется значение NVPROT в файле "Bootloader_xx.c", для ColdFire V2 - значение CFMPROT в файле "mcf5225x_vectors.s".
- блог пользователя teap0t
- 54183 просмотра
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
- Self-powered камера
- Фоновый модулятор: беспроводная связь из ничего (перевод)
- Texas Instruments Analog Applications Journal SLYT612 "Снижение искажений в аналоговых КМОП ключах" (перевод)
- USB MSD. Часть 6. Команды SCSI (перевод)
- USB MSD. Часть 3. USB класс накопителей данных (перевод)
- Texas Instruments Application Report SBAA042 "Кодовые схемы, используемые в аналогово-цифровых преобразователях" (перевод)
- 10 принципов правильного интерфейса
- Релиз SDK на русский микропроцессор КРОЛИК
Recent comments
5 лет 20 недель назад
5 лет 35 недель назад
5 лет 45 недель назад
5 лет 47 недель назад
6 лет 3 недели назад
6 лет 27 недель назад
6 лет 28 недель назад
6 лет 31 неделя назад
6 лет 42 недели назад
7 лет 22 недели назад