реклама на сайте
подробности

 
 
> Пишу AT91SAM7A3 UART bootloader, есть проблемы и вопросы :)
Aaron
сообщение Aug 24 2011, 12:02
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Доброго времени суток. Так сложилось, что до сих пор я ни разу не работал с загрузчиками - хватало разъёма JTAG. Но времена меняются, - надо делать загрузчик для своих железок (под UART). Естественно, под gcc (раз уж я начал его изучать) - бутлоадер выступает в роли подопытного кролика wink.gif
Накопал кучу бутлоадеров, выбрал наиболее понравившийся - USB-бутлоадер, и на его основе начал параллельно изучать gcc и особенности работы с flash памятью.
Внёс в проект кучу своего "мусора", в частности из проекта at91sam7a3-getting-started с сайта Atmel взял startup код. Как-то из разных мест ещё интересные моменты подглядывал-вставлял, разобрался с makefile и в итоге сейчас проект выглядит вот так: Прикрепленный файл  AT91_Bootloader.7z ( 233.2 килобайт ) Кол-во скачиваний: 102

Файлы компилируются, проект собирается - но я ничего не вижу ни в терминале, ни в осциллографе (контролирую ножку LED, которая на PA20 находится) - при включении порт встаёт в "1" и ничего не делает. Отладчиком в eclipse ещё не учился пользоваться, чую скоро придётся засесть изучать wink.gif Для прошивки использую MT-Link, при работе через консоль j-link показывает, что PC крутится в районе адресов 0x0 - 0x300, после jtag-reset выдаёт сообщение:
Цитата
WARNING: PC of target system has unexpected value of 0x0000023C after reset.

Адрес в warning тоже постоянно меняется в этом же диапазоне.
Чую себя новичком sm.gif Прошиваю at91sam7a3-getting-started - всё работает, прошиваю свой проект - ничего не работает sm.gif Кто поможет разобраться? Исходники рабочего бутлоадера (если и когда он появится) обязательно выложу.

Что происходит (в теории)?
1. инициализируем стеки прерываний (flash-reset.s: Reset_Handler)
2. инициализируем раздел bss (flash-reset.s: _init_data, _init_bss)
3. переходим в наш сишный код бутлоадера (bootrom.c: Bootrom)
4. обрабатываем пакеты, пишем во флэш.

Я так понимаю, что затык идёт на 2м этапе скорее всего, чую - перемудрил с секциями. Поэтому кто решится помочь - в первую очередь прошу поглядеть, как я объявил секции (AT91-Bootloader\bootrom\prj\ldscript-flash.lds)!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Aaron
сообщение Feb 20 2012, 12:00
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Доделал проект по большей части, выкладываю для интересующихся. В архиве Прикрепленный файл  at91_bootloader_programmer.7z ( 112.42 килобайт ) Кол-во скачиваний: 95
два проекта - под микроконтроллер (at91-bootloader) и приложение для ПК для связи с бутлоадером (isp-bootloader).
Сразу предупреждаю, - код не претендует на красоту, изящество и структурную и идеологическую правильность: код писался с большими перерывами в качестве упражнения на изучение eclipse/gcc/make с одной стороны и понимание прямой работы с флэш памятью контроллера с другой стороны; отдельные куски кода взяты готовыми из разных источников, так что присутствует и захламлённость, и разная стилистика. Однако код снабжён исчерпывающими комментариями, и разобраться в нём не составит труда.
Остаётся два открытых вопроса, которые я пока не смог решить, и по которым мне нужна помощь:
1. Как правильно из бутлоадера передать управление в пользовательскую прошивку? в проекте два варианта - через указатель:
Код
static void (*BL_StartUserApplication)(void);    // указатель на старт юзер-проги
BL_StartUserApplication = (void(*)(void))FLASH_USER_START;
BL_StartUserApplication();
и через ассемблерный код:
Код
// we want to set the LSb in order to switch in to Thumb mode
// when we bx.
// addr = 0x2801 = (0x5 << 11) | 1
asm("mov r3, #5\n");
asm("lsl r3, r3, #11\n");
asm("mov r4, #1\n");
asm("orr r3, r4\n");
asm("bx r3\n");
Через указатель у меня МК просто рестартится и снова входит в бутлоадер, а через ассемблерный код затихает, и я не знаю, что дальше происходит. Может, и работает? Подскажите плз.
2. Как мне правильно изменить существующие проекты, написанные под МК (среда разработки - Keil), чтобы они запускались после передачи им управления от бутлоадера? Вопрос связан с тем, что происходит ведь уже в бутлоадере инициализация стеков, прерываний (но я их отключаю), взводится кварц, карта памяти в конце концов меняется.
UPD: всплыл косяк, в функции Parser_BIN::ParserOpen надо раскомментировать флаг O_BINARY: this->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, ... без него символ возврата коретки модифицируется в записываемом бинарном файле sm.gif

Сообщение отредактировал Aaron - Feb 21 2012, 07:17
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 02:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016