Witam,
Jestem początkujący jeśli chodzi o programowanie ARM wiec proszę o wyrozumiałość.
Mam problem z procesorem LPC 1768, konkretnie jest to płytka Mini DK-2. Od pewnego czasu walczę z problemami w przerwaniach i nie mogę sobie poradzić. Przewertowałem setki tematów na forach polskich i zagranicznych, być może źle szukałem, wiec każda wskazówka i link będą mile widziane. Podejrzewam ze gdzieś w pliku startup coś może być źle zadeklarowane, niestety na assemblerze i plikach startupow w ogóle sie nie znam, próbowałem czytać różne tutoriale oraz informacje na stronie keila, NXP a także podmieniać startupa z gotowych projektów, ale nie pomogło.
Do rzeczy- do programowania używam Keila oraz programator J-Link. W przykładowym kodzie w przerwaniu z Timera0 instrukcje niekoniecznie wykonywane są poprawnie i co zauważyłem zależne jest to od miejsca w którym czyszczę flagę przerwania. Jeśli zrobię to na początku wszystko jest OK, jeśli na końcu nie wykonuje się pierwszy warunek if. Jeśli sprawdzam debuggerem krok po kroku wszystko działa OK. Optymalizacje kodu mam wyłączona. Miałem też inne problemy z wykonywaniem kodu w przerwaniu timera0 (efektem tego były jakieś dziwne wartości zmiennych- wszystkie oczywiście zadeklarowane jako volatile). Zależnie od ustawień prescalera i wartosci MR0 timera niektóre wartości nie były prawidłowo wpisywane- ale najpierw zajmijmy się najprostszym przykładem przedstawionym w kodzie.
W razie potrzeby mogę załączyć/wysłać cały spakowany projekt.
Plik startup.s:
System_LPC17xx.c:
Program main:
Interrupts.c
Interrupts.h:
GPIO_CFG.c:
GPIO_CFG.h:
timer_param.c:
Timer_param.h
Kod był tysiące razy zmieniany, mam nadzieje, że nigdzie nie zapomniałem czegoś odznaczyć/poprawić.
Pozdrawiam
piterrr_
Jestem początkujący jeśli chodzi o programowanie ARM wiec proszę o wyrozumiałość.
Mam problem z procesorem LPC 1768, konkretnie jest to płytka Mini DK-2. Od pewnego czasu walczę z problemami w przerwaniach i nie mogę sobie poradzić. Przewertowałem setki tematów na forach polskich i zagranicznych, być może źle szukałem, wiec każda wskazówka i link będą mile widziane. Podejrzewam ze gdzieś w pliku startup coś może być źle zadeklarowane, niestety na assemblerze i plikach startupow w ogóle sie nie znam, próbowałem czytać różne tutoriale oraz informacje na stronie keila, NXP a także podmieniać startupa z gotowych projektów, ale nie pomogło.
Do rzeczy- do programowania używam Keila oraz programator J-Link. W przykładowym kodzie w przerwaniu z Timera0 instrukcje niekoniecznie wykonywane są poprawnie i co zauważyłem zależne jest to od miejsca w którym czyszczę flagę przerwania. Jeśli zrobię to na początku wszystko jest OK, jeśli na końcu nie wykonuje się pierwszy warunek if. Jeśli sprawdzam debuggerem krok po kroku wszystko działa OK. Optymalizacje kodu mam wyłączona. Miałem też inne problemy z wykonywaniem kodu w przerwaniu timera0 (efektem tego były jakieś dziwne wartości zmiennych- wszystkie oczywiście zadeklarowane jako volatile). Zależnie od ustawień prescalera i wartosci MR0 timera niektóre wartości nie były prawidłowo wpisywane- ale najpierw zajmijmy się najprostszym przykładem przedstawionym w kodzie.
W razie potrzeby mogę załączyć/wysłać cały spakowany projekt.
Plik startup.s:
Code: C
System_LPC17xx.c:
Code: C
Program main:
Code: C
Interrupts.c
Code: C
Interrupts.h:
Code: C
GPIO_CFG.c:
Code: C
GPIO_CFG.h:
Code: C
timer_param.c:
Code: c
Timer_param.h
Code: C
Kod był tysiące razy zmieniany, mam nadzieje, że nigdzie nie zapomniałem czegoś odznaczyć/poprawić.
Pozdrawiam
piterrr_