eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaAVR32 - jak ruszyc z tym prockiemRe: AVR32 - jak ruszyc z tym prockiem
  • Data: 2009-11-13 07:35:19
    Temat: Re: AVR32 - jak ruszyc z tym prockiem
    Od: SM <b...@k...com.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Znowu trochę posiedziałem nad prockiem.
    Ale masakra.
    Chyba z żadnym prockiem nie miałem tyle
    kombinowania (chociażby ze samą strukturą
    programu że asembler i linker poprawnie
    przygotowali dane do ładowania do procka).
    Skonfigurowałem procka, ruszyłem przerwania
    na timerze.

    Wszystko lekko rąbnięte przez sam fakt, że
    Atmel dał flash od adresu 0x80000000 a to
    w integer jest liczba ujemna! Asembler
    głupieje przy bezpośrednim ustawieniu
    sekcji org na ten adres, bo dla niego to
    liczba ujemna i stwierdza że kompilacja
    odbywa się w ujemną stronę. Trzeba więc
    robić offset w linkerze. Ale tu kolejny
    zgrzyt bo stałe zdefiniowane jako różnica
    adresów wychodzą wtedy Linkerowi błędnie
    (np. offset autoprzerwania względem EVBA).

    Ostatecznie rozwiązałem to tak:

    //
    ====================================================
    =======================
    // Start of data memory.
    //
    ====================================================
    =======================

    .section .bss, "", @nobits
    .org 0

    stack_beg:
    .skip 256
    stack_end:

    //
    ====================================================
    =======================
    // Start of program memory.
    //
    ====================================================
    =======================

    .section .text, "ax", @progbits

    .global _start

    _start:
    .incbin "isp.bin" // original bootloader saved from flash memory

    //
    ====================================================
    =======================
    // Ints vectors.
    //
    ====================================================
    =======================

    StartEVBA:

    program_begin:
    rjmp program_start

    rjmp Int0Handler
    rjmp Int1Handler
    rjmp Int2Handler
    rjmp Int3Handler

    .equ Int0Offset, 4 >> 1
    .equ Int1Offset, 8 >> 1
    .equ Int2Offset, 12 >> 1
    .equ Int3Offset, 16 >> 1

    //
    ====================================================
    =======================
    // Timer 0 interrupt.
    //
    ====================================================
    =======================

    Int0Handler:

    // reset int flag

    mov.w r8, TC0_BASE
    ld.w r9, r8[TC_SR]

    // change PA3 pin

    mov.w r8, LBM_BASE
    mov r9, (1 << 3)
    st.w r8[LBM_OVR0T], r9

    // int exit

    rete

    //
    ====================================================
    =======================
    // Program start.
    //
    ====================================================
    =======================

    program_start:

    // --- stack

    mov.w sp, stack_end

    ****************************************************
    ************************

    i ustawiam:

    // set EVBA pointer

    mov.w r0, StartEVBA
    mtsr SYSREG_EVBA, r0

    // set autovector offset for group 14

    mov.w r0, INTC_BASE
    mov.w r1, Int0Offset
    st.w r0[INTC_IPR0 + 4*14], r1

    i oczywiście wszystko działa, ale ile musiałem czasu stracić
    żeby coś tak prostego zrobić.

    Nie mogli dać flasha od 0x40000000. Przeciez mieliby wtedy 1GB
    na rozbudowę RAM i 1GB (minus rejestry) na FLASH.

    SM

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: