Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:4
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:8
Форум » starterkit.ru » ARM
Загрузка+векторы MAT91SAM9260 начинающему
AlexCorp
Добавлено 22.03.2010 15:33
0
Сообщение: 1
AlexCorp
5

Регистрация: 22.03.2010
Пол: Мужчина
Из: Комсомольск-на-Амуре
Помогите разобраться с загрузочными векторами at91sam9260.
Предыстория
В программировании микроконтроллеров у меня крошечный опыт - на третьем курсе программировали микропроцессорный комплект К580, но в программировании вообще, в том числе и на ассемблере, опыт большой.

Передо мной стоит задача создать анализатор акустического спектра на этой плате (дипломная работа).

Работаю в IAR на ассеблере, зашиваю самбой.
Для начала решил просто зажеч СИД, чтобы разобраться в принципах работы данного микроконтроллера.
СИД подключен к PIN_27 (PB18).
Вручную в самбе записав число 0х40000 поочереди в ячейки 0xFFFFF600, 0xFFFFF610 и 0xFFFFF634 он загорается.
Но мне то надо чтобы это делала программа. Соответственно написал ее:

PUBLIC __vector
PUBLIC __iar_program_start

SECTION .intvec : CODE

ARM
__vector:
DCD __iar_program_start
B .
B .
B .
B .
DCD 0x38 ; Размер в листинге указан 56 байт
B .
B .

__iar_program_start:

SECTION .text : CODE
ARM
main
LDR R0, =0xFFFFF600
LDR R1, =0x40000
STR R1, [R0, #0x0]
STR R1, [R0, #0x10]
STR R1, [R0, #0x34]
END

Компиляция для моего ядра проходит успешно, создается HEX файл:

:1000000020000000FEFFFFEAFEFFFFEAFEFFFFEA1E
:10001000FEFFFFEA18000000FEFFFFEAFEFFFFEA16
:100080000C009FE5401AA0E3001080E5101080E509
:08009000341080E500F6FFFFCB
:0400000300000020D9
:00000001FF

Его я конвертирую в BIN, который зашиваю самбой в DataFlash скриптом "SendFile" после "Enable_CS0".

Естественно диод не загорается.

А теперь собственно суть вопроса: я надеюсь что сама программа после main верна, остается грешить только на таблицу векторов прерываний. Про них нигде ничего не написано, в даташите на контроллер сказано, что по ним ориентуриется заводской загрузчик и что менять шестой вектор, содержащий размер исполняемой программы, про остальные ни слова. В моей проге блок этих векторов _vector: взят из примера в IAR.

Прошу Вас товарищи, обьясните за что отвечают эти векторы, как правильно их программировать, какие значения в них надо записывать, как определять эти значения.
И еще, есть ли разница с какого адреса ничинается сама программа, должна ли она начинаться сразу после векторов, или с любого адреса (как у меня в НЕХ, она нчаинается с 0х80, а команда "DCD __iar_program_start" записывает по адресу 0x0 значение 0х20)? Если с любого, то в каком векторе процессор определяет начальный адрес программы. И как правильно определить размер программы, считать его вместе с векторами, или с байта после них, или непосредственно с начала программы?
И последнее, нигде нормально не написано что такое REMAP, зачем он нужен и как им пользоваться.

Обьясните пожалуйста поподробнее, иначе я пропал. Тему диплома менять поздно.
Заранее премного благодарен.
Спуститься к концу Подняться к началу
Персональная информация
Strijar
Добавлено 22.03.2010 15:53 Сообщение: 2
Strijar
Ранг
5

Группа: Клиенты
Пункты: 1618
Регистрация: 21.04.2009
Пол: Мужчина
Попробуйте прошивать через "Send boot file" - там один вектор это длина "загрузчика" и sam-ba его умеет сама поправлять.
Спуститься к концу Подняться к началу
Персональная информация
AlexCorp
Добавлено 22.03.2010 15:58 Сообщение: 3
AlexCorp
5

Регистрация: 22.03.2010
Пол: Мужчина
Из: Комсомольск-на-Амуре
Да чем только я его не пробовал
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 22.03.2010 16:05 Сообщение: 4
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Сразу оговорюсь что с iar не работал и не собираюсь.

Цитата
А теперь собственно суть вопроса: я надеюсь что сама программа после main верна, остается грешить только на таблицу векторов прерываний. Про них нигде ничего не написано


Во первых это не вектора прерываний а вектора исключений, написано про них буквально во всех примерах от атмел.
Код

* Exception vectors (should be a branch to be detected as a valid code by the rom */
_exception_vectors:
b reset_vector /* reset */
b undef_vector /* Undefined Instruction */
b swi_vector /* Software Interrupt */
b pabt_vector /* Prefetch Abort */
b dabt_vector /* Data Abort */
.word _edata /* Size of the image for SAM-BA */
b irq_vector /* IRQ : read the AIC */
b fiq_vector /* FIQ */

Размер бинарника в байтах, в любом фаломенеджере посмотрите сколько он на диске занимает. Ну и прежде чем ножками дрыгать очевидно нужно настроить контроллер GPIO. В общем зайдите на сайт атмел и скачайте примеры для платы - там все разжевано.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 22.03.2010 16:51 Сообщение: 5
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
я в иаре не работал и надеюсь не придется :)
- посмотрите или покажите листинг того что генерит ваш компилятор - я попробовал подсунуть ИДЕ ваш hex-файл - ничего осмысленного там не увидел.. может оно.. того.. не генерит ничего из кода кроме таблицы векторов
- проверьте, может чего не хватает при вашей настройке пина
в сях это выглядит примерно так:
Код
*(int*)(mapped_base_c+PIO_PER) = PIN_MASK_PC1;
*(int*)(mapped_base_c+PIO_IDR) = PIN_MASK_PC1;
*(int*)(mapped_base_c+PIO_MDDR) = PIN_MASK_PC1;
*(int*)(mapped_base_c+PIO_PUDR) = PIN_MASK_PC1;
*(int*)(mapped_base_c+PIO_OWDR) = PIN_MASK_PC1;
*(int*)(mapped_base_c+PIO_OER) = PIN_MASK_PC1;

- еще неплохо в конце программы ставить банальный "loop" что-бы после исполнения программа не "улетала" хрен-знает-куда, а мирно крутила пустой цикл :)

зы асм для арм - это мрак :(

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
AlexCorp
Добавлено 22.03.2010 17:03 Сообщение: 6
AlexCorp
5

Регистрация: 22.03.2010
Пол: Мужчина
Из: Комсомольск-на-Амуре
Листинг:
1 PUBLIC __vector
2 PUBLIC __iar_program_start

3
4 SECTION .intvec : CODE

5
6
7 ARM
8 __vector:
9 00000000 ........ DCD __iar_program_start

10 00000004 FEFFFFEA B .

11 00000008 FEFFFFEA B .

12 0000000C FEFFFFEA B .

13 00000010 FEFFFFEA B .

14 00000014 38000000 DCD 0x38
15 00000018 FEFFFFEA B .
16 0000001C FEFFFFEA B .
17
18 __iar_program_start:
19
20 SECTION .text : CODE
21 ARM
22 main
23 00000000 0C009FE5 LDR R0, =0xFFFFF600
24 00000004 401AA0E3 LDR R1, =0x40000
25 00000008 001080E5 STR R1, [R0, #0x0]
26 0000000C 101080E5 STR R1, [R0, #0x10]
27 00000010 341080E5 STR R1, [R0, #0x34]

28 END
28.1 TABLE
28.2 00000014 00F6FFFF Reference on line 23
28.3 END (including table)
##############################
# CRC:0 #
# Errors: 0 #
# Warnings: 0 #
# Bytes: 56 #
##############################
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 22.03.2010 17:14 Редактировалось 22.03.2010 17:15 Сообщение: 7
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Код
STR R1, [R0, #0x34]

это Clear Output Data Register
чем светодиодик зажигаете - ноль или единица?
если второе, то 0x30

и цикл в конце программы

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 22.03.2010 17:44 Сообщение: 8
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
вот что дизассемблит ИДА в вашем хексе:

title

а вот примерно так должно выглядеть - это просто пример - на цифры смотреть не надо:

title

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
AlexCorp
Добавлено 23.03.2010 02:24 Сообщение: 9
AlexCorp
5

Регистрация: 22.03.2010
Пол: Мужчина
Из: Комсомольск-на-Амуре
Зажигаю нулем
Повторюсь, что вручную это делается элементарно, без инициализации всяких там Clock, Watchdog, Power controller.
Тупо вписывал 0х40000 по адресам: 0хFFFFF600
0xFFFFF610
0xFFFFF634

А как я понимаю из последнего рисунка, то обсуждаемые векторы это типа ссылки на обработчики своих исключеий, так? Но если так, то все равно не понятно с начальным адресом программы
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 23.03.2010 09:05 Сообщение: 10
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата
Повторюсь, что вручную это делается элементарно, без инициализации всяких там Clock, Watchdog, Power controller.


Что значит "вручную" ? Просто sam-ba инициализирует их за вас. Повторюсь - чтобы что-то заработало, скачайте примеры с сайта атмел, там есть и для iar, bootstrap тот же.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » ARM