2012-03-05 6 views
4

Я написал (ИМО) почти самое простое приложение ARM, и оно не сработало :) Что может быть неправильным? Что пропущено?Cortex-M3 Инициализация

После флэш-записи и сброса ЦП в корзинах есть мусор.

Пожалуйста, будьте добры, и если вы знаете, скажите мне, что нужно сделать для запуска простейшего приложения на STM32F1.

Может быть кто-то coud перечислит, что должно быть сделано до начала подачи заявки, т.е.

  1. стек Initialize (нужно?)
  2. Установить что-то.
  3. Установить что-то еще.

Применение:

@Directives 
    .thumb     @.code 16 
    .syntax unified 

.section .text 
    .org 0     @ Alters location of pointer - in this case set to zero 

vectors:     @ Define basic vectors for specific capabilities 
    .word _start + 1  @ Set - start address and increment pointer 
    .word _nmi_handler + 1 @ Below all other vectors will be declared: 
    .word _hard_fault + 1 
    .word _memory_fault + 1 
    .word _bus_fault + 1 
    .word _usage_fault + 1 

_start: 
    mov r0, #5 
    mov r1, #4 
    add r2, r0, r1 

_nmi_handler: 
_hard_fault: 
_memory_fault: 
_bus_fault: 
_usage_fault: 

Может быть кто-нибудь знает какие-либо учебники или книги, о компоновщик сценариев, процессора инициализации и т.д.?

Процессор: STM32F103VBT6

программируется: OpenOCD.

Заранее спасибо.

+0

У меня много коры головного мозга и большого пальца в общих примерах на http://github.com/dwelch67. для простой такой программы я бы поставил бесконечный цикл после добавления зависания: b зависает, что-то в этом роде. –

ответ

7

У меня есть много больших и Cortex-м на основе примеров http://github.com/dwelch67

Как Joachim указал вам не хватает первую запись в таблице векторов, указатель стека. в кортексе-m нет той же таблицы векторов, что и рука, что означает ту, которая загружается в режиме руки с командами рук.

Чтобы завершить ответ, хотя, для Cortex-м вы можете настроить стек, помещая начальное значение для указателя стека в том, что первое слово расположение

.cpu cortex-m3 
.thumb 

.word 0x10008000 /* stack top address */ 
.word _start  /* 1 Reset */ 
.word hang  /* 2 NMI */ 
.word hang  /* 3 HardFault */ 
.word hang  /* 4 MemManage */ 

вы можете, конечно, когда-то работает установить указатель стека вручную, как в режиме руки или в большинстве других процессоров.

Я бы хотел, чтобы ваш код попадал в бесконечный цикл, так что, как написано, вы не попадаете в неопределенные инструкции и т. Д. (Должно быть 0xFFs, которое на кортекс-m0, я думаю, не определено, на -m3 или -m4 с поддержкой armv7 thumb2, это может быть настоящая инструкция).

Обратите внимание, что я не использовал +1 на своих векторах. Вам нужно знать свои инструменты. Вам нужно, чтобы lsbit установил для указания большого пальца/большого пальца на ветке. Хотя я извлек урок о том, что (надо будет найти так вопрос)

Arm/Thumb: using BX in Thumb code, to call a Thumb function, or to jump to a Thumb instruction in another function

С ГНУ ассемблере, если вы поставите директиву.thumb_func перед меткой, этот ярлык помечен как метка большого пальца, а инструменты gnu будут использовать адрес | 1.

.thumb_func 
.globl _start 
_start: 

Вы должны строить и разбирать и теперь каждый раз, чтобы убедиться, что ваша таблица строится правильно и ветви, и такие, что используется правильный адрес.

0: 10008000 andne r8, r0, r0 
    4: 0000005b andeq r0, r0, fp, asr r0 
    8: 00000050 andeq r0, r0, r0, asr r0 
    c: 00000050 andeq r0, r0, r0, asr r0 
    10: 00000050 andeq r0, r0, r0, asr r0 

см, по-видимому, у меня есть ошибка в одном из моих примеров ... он никогда ничего, кроме сброса делает (нет прерывания, используемого в данном примере, так что, как я ушел с не зная). забыла .thumb_func

hang: b . 

производства

00000050 <hang>: 
    50: e7fe  b.n 50 <hang> 

изменение

.thumb_func 
hang: b . 

и таблица векторов переходит в

00000000 <hang-0x50>: 
    0: 10008000 andne r8, r0, r0 
    4: 0000005b andeq r0, r0, fp, asr r0 
    8: 00000051 andeq r0, r0, r1, asr r0 
    c: 00000051 andeq r0, r0, r1, asr r0 
    10: 00000051 andeq r0, r0, r1, asr r0 
    14: 00000051 andeq r0, r0, r1, asr r0 

это интересно, измените код на

.cpu cortex-m3 
.thumb 

.word 0x10008000 /* stack top address */ 
.word _start+1  /* 1 Reset */ 
.word hang+1  /* 2 NMI */ 
.word hang+1  /* 3 HardFault */ 
.word hang  /* 4 MemManage */ 
.word hang  /* 5 BusFault */ 

и он действительно не делает ничего, кроме одного или одного.

00000000 <hang-0x50>: 
    0: 10008000 andne r8, r0, r0 
    4: 0000005b andeq r0, r0, fp, asr r0 
    8: 00000051 andeq r0, r0, r1, asr r0 
    c: 00000051 andeq r0, r0, r1, asr r0 
    10: 00000051 andeq r0, r0, r1, asr r0 

Это немного тревожно. В нижней строке, хотя, две вещи, с помощью cortex-m, вы можете настроить указатель стека в векторной таблице, во-вторых, при запуске нового проекта разобрать и проанализировать векторную таблицу, чтобы убедиться, что это то, что вы ожидаете. Esp, если он не делает то, что вы считаете нужным.

+0

Спасибо большое ** dwelch **! Это лучший ответ на темы Cortex-M3, которые я когда-либо видел! С наилучшими пожеланиями и благодарностью. – Tyrreus

+0

Каждый должен продвигать Йоахима, сначала он ответил на настоящую проблему. –

8

От M3 documentation;

The vector table at location 0 is only required to have four values: 

Stack top address 
Reset routine location 
NMI ISR location 
Hard Fault ISR location. 

Адрес верхнего стека должен быть по адресу 0, кажется, вам не хватает.

+0

Да, это проблема. –

+0

Поскольку вы не используете стек, вы можете просто положить слово .word 0 или что-то в этом роде, беспокоиться о том, чтобы получить значение прямо позже. –

+0

Спасибо ** Joachim ** – Tyrreus

Смежные вопросы