Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32F4] - Gdzie znajdę opis rejestrów NVIC

mkot123 12 Mar 2013 16:31 2607 13
  • #1 12 Mar 2013 16:31
    mkot123
    Poziom 15  

    Witam,

    Rozpocząłem swoją przygodę z procesorami ARM od płytki STM32F4-Discovery.
    Jak na razie nauka idzie mi chyba całkiem nieźle i na prawie wszystkie wątpliwości/pytania znajduję odpowiedź w Internecie.

    Podobnie jak w przypadku nauki AVR'ów staram się zgłębić zasadę działania i obsługi jak największej ilości peryferiów. Od samego początku staram się nie korzystać z bibliotek ST, bo uważam że nie dają one takiej kontroli i wiedzy nt. uC jak operowanie na poszczególnych rejestrach.

    Natrafiłem jednak niemałą przeszkodę. Chciałem opanować temat przerwań, ale zaskoczył mnie fakt, że w Reference Manual (który jak dotąd mnie nie zawiódł) w ogóle nie mogę znaleźć opisów rejestrów NVIC. W bibliotekach od ST znalazłem definicje struktur z takimi rejestrami jak np. ISER, ICER, STIR itp. Jednakże opcja "Find" w pdf'ie Reference Manual'a takich rejestrów nie odnajduje.

    Czy moglibyście mi wyjaśnić, gdzie popełniam błąd w rozumowaniu lub poszukiwaniach. Myślałem, że w Reference Manual'u znajdę opis wszystkich rejestrów procesora.

    P.S. Pytanie dodatkowe. Po wywołaniu przerwania od TIM7 muszę programowo zerować bit UIF w jego rejestrze CR. Tylko dlaczego muszę to robić od razu na początku procedury obsługi przerwania, a nie mogę np. na końcu lub gdzieś w środku - jeśli tak robię, to procedura nie wykonuje się (proste mruganie diodą).

    0 13
  • Pomocny post
    #2 12 Mar 2013 16:40
    BlueDraco
    Specjalista - Mikrokontrolery

    arm.com:
    Cortex-M4 Technical Reference Manual
    ARMv7-M Architecture Reference Manual

    Co do timera: prawdopodobnie chodzi o opóźnienie kasowania zgłoszenia przerwania. Jeśli skasujesz pod koniec procedury, to po jej zakończeniu znacznik będzie jeszcze ustawiony i spowoduje powtórne zgłoszenie przerwania.

    Do sterowania NVIC proponowałbym jednak użyć pseudofunkcji CMSIS, włączanych przez plik nagłówkowy dla mikrontrolera, o nazwach zaczynających się od NVIC_

    0
  • Pomocny post
    #3 12 Mar 2013 16:47
    Freddie Chopin
    Specjalista - Mikrokontrolery

    mkot123 napisał:
    W bibliotekach od ST znalazłem definicje struktur z takimi rejestrami jak np. ISER, ICER, STIR itp.

    Nagłówki typu core_cm3.h core_cm4.h itd. nie są częścią biblioteki SPL, tylko częścią CMSISa, pochodzącego od ARM. Spokojnie można korzystać, zwłaszcza do takich rzeczy jak NVIC_EnableIRQ() czy do ustawiania priorytetów. W SPLu chyba też są funkcje o podobnej funkcjonalności ale oczywiście zmasakrowane mądrościami od ST...

    4\/3!!

    0
  • #4 12 Mar 2013 16:56
    mkot123
    Poziom 15  

    Hmmm to ciekawe. Czyli NVIC jest elementem wspólnym rodziny ARM7 i jego dokumentacja jest umieszczona poza specyficzną dokumentacją danego procka? Czy dobrze rozumiem?

    W takim razie chciałbym zrozumieć jak mogę "ręcznie" wykonać to co wykonuje funkcja:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    ..i czy w ogóle jest sens się w to bawić?

    Bo z tego co jak dotąd zrozumiałem, aby wywołać dane przerwanie należy ustawić odpowiedni bit w rejestrze kontrolnym peryferia (Np. dla TIM7), a do tego uaktywnić to przerwanie w NVIC, który jest jakby osobnym urządzeniem sprawującym pieczę nad wszystkimi przerwaniami.

    Nie wspominając już o strukturze NVIC_Init. Jeszcze nie doszedłem do czego ona w ogóle służy :cry:

    0
  • Pomocny post
    #5 12 Mar 2013 17:42
    Freddie Chopin
    Specjalista - Mikrokontrolery

    mkot123 napisał:
    Hmmm to ciekawe. Czyli NVIC jest elementem wspólnym rodziny ARM7 i jego dokumentacja jest umieszczona poza specyficzną dokumentacją danego procka? Czy dobrze rozumiem?

    Generalnie dobrze, pozatym że ARM7 a ARMv7 to coś zupełnie innego (; NXP w dokumentacji do swoich Cortexów daje opisy rzeczy specyficznych dla rdzenia, ST nie i tyle.

    mkot123 napisał:
    W takim razie chciałbym zrozumieć jak mogę "ręcznie" wykonać to co wykonuje funkcja:

    Zobacz co robi ta funkcja (;

    mkot123 napisał:
    ..i czy w ogóle jest sens się w to bawić?

    Nie, większość funkcji z CMSIS jest "inline" i cokolwiek swojego zrobisz zadziała dokładnie tak samo szybko i zajmie dokładnie tyle samo instrukcji (no chyba że zrobisz to gorzej <; ). Inną sprawą jest użycie tej funkcji ze zmiennym i nieznanym parametrem, wtedy obliczenia z jej wnętrza (nieskomplikowane) raczej będą musiały się wykonać "na żywo", ale tutaj cudów nie ma.

    mkot123 napisał:
    Nie wspominając już o strukturze NVIC_Init. Jeszcze nie doszedłem do czego ona w ogóle służy

    Jedynie do komplikowania spraw prostych (; - to już jest "dodatek" z SPLa (czyli tej pseudo-biblioteki od ST), w "czystym" CMSIS tego nie ma. Zauważ że NVIC_EnableIRQ() i kilka innych podstawowych jest w nagłówku core_cm3.h, a nie na tam nawet pół słowa o jakimś NVIC_Init i tym podobnych bzdurach. Oczywiście nagłówek od ST (ten podstawowy, np. stm32f4xx.h) będzie Ci i tak potrzebny, bo tam jest numeracja przerwań (czyli ..._IRQn).

    4\/3!!

    0
  • #6 12 Mar 2013 18:21
    mkot123
    Poziom 15  

    Bardzo dziękuję za odpowiedź.
    Teraz sprawa stała się o wiele jaśniejsza.
    Zabieram się za lekturę dotyczącą priorytetów przerwań.

    0
  • #7 13 Mar 2013 11:17
    BlueDraco
    Specjalista - Mikrokontrolery

    Na początek proponuję nie różnicować priorytetów, czyli ich nie ruszać. Uruchom parę programów z "płaskimi" przerwaniami, a potem dopiero grzeb w priorytetach, jeśli naprawdę musisz.

    0
  • #8 13 Mar 2013 11:22
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #9 13 Mar 2013 19:57
    mkot123
    Poziom 15  

    Ok, skorzystam z dobrej rady.

    Zapewne nigdy nie skorzystam z wielu opcji oferowanych przez ten procesor, jednak już kilka razy (na AVR'ach) przekonałem się, że warto mieć świadomość jakie funkcjonalności oferuje dany procek.
    Jeden bit tu, jeden tam i PWM generuje się sprzętowo - nie trzeba robić nic w programie poza obliczeniem aktualnej wartości wypełnienia. Przykład banalny, ale gdyby ktoś nie wiedział. że uC daje możliwość sprzętowej generacji PWM, niepotrzebnie obciążałby CPU.

    0
  • #10 21 Cze 2013 14:05
    r00cky
    Poziom 15  

    Witam,

    czy może ktoś mieł kiedyś taki problem z ustawieniem bitów w 2 PAGE'u NVIC'a:

    131 {
    interruptsInit:
    08000454: push {r7}
    08000456: add r7, sp, #0
    132 NVIC->ISER[INT_PAGE(EXTI15_10_IRQn)] |= INT_BIT(EXTI15_10_IRQn); // External Line[15:10] Interrupts
    08000458: mov.w r3, #57600 ; 0xe100
    0800045c: movt r3, #57344 ; 0xe000
    08000460: mov.w r2, #57600 ; 0xe100
    08000464: movt r2, #57344 ; 0xe000
    08000468: ldr r2, [r2, #4]
    0800046a: orr.w r2, r2, #256 ; 0x100
    0800046e: str r2, [r3, #4]
    133 }

    Po wykonaniu tej linijki PC leci do 0x1ffff767 .... (??)
    Stosy sa nader przerośnięte ;) ale w granicach rozsądku.
    Privil mode ON.

    Jakies sugestie ?

    0
  • #11 21 Cze 2013 14:39
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #12 21 Cze 2013 16:56
    nsvinc
    Poziom 35  

    łaa ;]

    Ofkoz Freddie ma racje, ale zawsze tez mozna tak:

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Nie ORuje sie rejestrów NVICa typu ISER, ICER, ICPR, ...!! Po to są oddzielne rejestry do set i clear, zeby nie wykonywac na nich RMW!!
    ISER - Interrupt Set Enable Register
    ICER - Interrupt Clear Enable Register

    "Writing 0 has no effect"...

    0
  • #13 21 Cze 2013 20:09
    r00cky
    Poziom 15  

    NVIC->ISER[INT_PAGE(EXTI15_10_IRQn)] |= INT_BIT(EXTI15_10_IRQn); to jest to samo co NVIC->ISER[1]=0x100; //wlacz EXTI15_10 z tym że moje jest "orowane".

    Wydaje mi sie że samego = też probowałem i chyba nic z tego.
    Sprawdze jak bede miał okazje.

    0
  • #14 24 Cze 2013 09:10
    r00cky
    Poziom 15  

    Hej,

    Problem chyba jest w innym miejscu. Tak jak pisałem wcześniej probowałem samego =, dzisiaj potwierdziłem - efekt ten sam. Zapodałem "misc" i tez crash lecz w tym razem wywaliło się w taki sam sposob ale na SCB->AIRCR w NVIC_Init.

    Wygląda jak by przestrzeń pamięci rdzenia była jakoś chroniona ?


    UPDATE:
    Aby zoobrazowac co sie dzieje.
    [STM32F4] - Gdzie znajdę opis rejestrów NVIC

    Nieważne gdzie odwołam się do rejestrów cortex'a (może być 1 linijka w main) zawse dostaje takiego faila.

    0
  Szukaj w 5mln produktów