eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaAVR32 - jak ruszyc z tym prockiemRe: AVR32 - jak ruszyc z tym prockiem
  • Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!opal.futuro.pl!news.internetia.pl!ne
    wsfeed.neostrada.pl!nemesis.news.neostrada.pl!atlantis.news.neostrada.pl!news.n
    eostrada.pl!not-for-mail
    From: SM <b...@k...com.pl>
    Newsgroups: pl.misc.elektronika
    Subject: Re: AVR32 - jak ruszyc z tym prockiem
    Date: Fri, 13 Nov 2009 08:35:19 +0100
    Organization: TP - http://www.tp.pl/
    Lines: 127
    Message-ID: <hdj2rp$m41$1@nemesis.news.neostrada.pl>
    References: <hd1e7s$hqa$1@nemesis.news.neostrada.pl>
    NNTP-Posting-Host: aafp111.neoplus.adsl.tpnet.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-2; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: nemesis.news.neostrada.pl 1258098361 22657 83.4.145.111 (13 Nov 2009
    07:46:01 GMT)
    X-Complaints-To: u...@n...neostrada.pl
    NNTP-Posting-Date: Fri, 13 Nov 2009 07:46:01 +0000 (UTC)
    User-Agent: Thunderbird 2.0.0.23 (Windows/20090812)
    In-Reply-To: <hd1e7s$hqa$1@nemesis.news.neostrada.pl>
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:575530
    [ ukryj 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: