Proste pytania o programowanie STM32 w języku C.

Tu możesz pisać o swoich problemach z pisaniem programów w języku C/C++ dla STM.
Awatar użytkownika
0110101101101101
Posty: 15
Rejestracja: sobota 12 maja 2018, 14:55

Proste pytania o programowanie STM32 w języku C.

Postautor: 0110101101101101 » czwartek 07 cze 2018, 07:47

Witajcie, jako, że dopiero zaczynam poznawać rodzinę STM to w związku z tym nasuwa mi się na język mnóstwo pytań i nieścisłości.
Pozwoliłem sobie założyć temat dotyczący takich prostych pytań nowicjusza o różne peryferia. Nie chcę pytać na czacie, żeby te pytania z odpowiedziami zostały dla potomnych, a zakładanie osobnego tematu dla każdego tematu mogłoby Was szybko wyprowadzić z równowagi. :lol:

Więc, żeby nie zakładać pustego tematu, to już mam jedno pytanie.

[PYTANIE 1]

Jak to jest z obsługą przerwań zewnętrznych? Dla testów i nauki chciałem na przerwaniu EXTI generowanym przez przycisk zmieniać stan diody.
Gdy ręcznie w przerwaniu nie kasowałem bitu "Pending Bit", to przerwanie wykonało się tylko jeden, jedyny raz, a kolejne naciśnięcia przycisku nic nie zmieniały.
Gdy w obsłudze przerwania dodałem linijkę EXTI -> PR = EXTI_PR_PR13;, to za każdym naciśnięciem przycisku prawidłowo zmienia się stan diody.

Czy automatycznie po wejściu do obsługi tego przerwania ten bit nie powinien się automatycznie kasować? Bo jak dobrze rozumiem, to jest to flaga zajętości, która blokuje przerwania z danej linii, tak?

Awatar użytkownika
inż.wielki
User
User
Posty: 219
Rejestracja: niedziela 20 gru 2015, 23:11

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: inż.wielki » czwartek 07 cze 2018, 07:51

W zależności od procka taka flaga może ale nie musi być kasowana. Zazwyczaj trzeba o to zadbać samemu. Nie pamiętam dokładnie, bo STM'ów nie ruszałem dłuższą chwilę, ale tam jest jeden uchwyt dla danego typu przerwań. Tzn dla wszystkich pinów o indeksie 0, 1, 2 itd... Więc w przerwaniu możesz też sprawdzać, który pin to wywołał. Dlatego nie jest kasowane. Ale mogę się mylić, poczekajmy na wypowiedź mądrzejszych :D

Awatar użytkownika
0110101101101101
Posty: 15
Rejestracja: sobota 12 maja 2018, 14:55

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: 0110101101101101 » czwartek 07 cze 2018, 08:17

Tyle czasu tego szukałem w Reference Manual'u i dopiero teraz znalazłem.... :mrgreen:

W opisie działania EXTI jest zapis:
When the selected edge occurs on the external interrupt line, an interrupt request is
generated. The pending bit corresponding to the interrupt line is also set. This request is
reset by writing a ‘1’ in the pending register


No. Czasami się czegoś nie zauważy i kilka godzin się szuka po dokumentacji... :lol:

inż.wielki pisze:Nie pamiętam dokładnie, bo STM'ów nie ruszałem dłuższą chwilę, ale tam jest jeden uchwyt dla danego typu przerwań. Tzn dla wszystkich pinów o indeksie 0, 1, 2 itd... Więc w przerwaniu możesz też sprawdzać, który pin to wywołał. Dlatego nie jest kasowane.


Dokładnie jest tak jak piszesz - np. piny 10..15 są obsługiwane przez jeden wektor przerwania. Dzięki za rozjaśnienie umysłu!

Awatar użytkownika
xor
User
User
Posty: 124
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: xor » czwartek 07 cze 2018, 08:27

Niemal wszystkie przerwania w STM32F103 (zdaje się, że takim prockiem się bawisz?) trzeba kasować Jedyne które w tej chwili pamiętam, gdzie nie jest to potrzebne to przerwanie USARTa, tam kasowanie następuje automatycznie wraz z przeczytaniem/zapisem rejestru danych.

Dokładnie jest tak jak piszesz - np. piny 10..15 są obsługiwane przez jeden wektor przerwania.

Linie 5-9 też są zgrupowane, ale już 0-4 mają osobne wektory przerwań.

Awatar użytkownika
0110101101101101
Posty: 15
Rejestracja: sobota 12 maja 2018, 14:55

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: 0110101101101101 » piątek 22 cze 2018, 10:44

No to znowu mam jakiś problem z ogarnięciem Timera.

Tym razem timer numer 2 ma odliczać 2 sekundy i po tym czasie jednorazowo uruchomić pomiar za pomocą ADC. Drugą część związaną z ADC ogarnąłem bez żadnego problemu i działa, ale timer wysyła sygnał TRGO na ADC od razu po jego uruchomieniu ( " TIM2->CR1 = TIM_CR1_CEN") i tym sposobem pomiar na ADC następuje od razu a nie po 2s.

Zacząłem modyfikować program, bo myślałem, że zamieszałem coś z tym ADC, ale jednak problem jest w konfiguracji timera.
Przedstawiam kod dla stm32f103rb:

Kod: Zaznacz cały

int main(void)
{
 RCC->APB1ENR = RCC_APB1ENR_TIM2EN;
 
 TIM2->PSC = 8000-1;
 TIM2->ARR = 2000-1;
 TIM2->DIER = TIM_DIER_UIE;
 
 NVIC_ClearPendingIRQ(TIM2_IRQn);
 NVIC_EnableIRQ(TIM2_IRQn);
 
  TIM2->CR1 = TIM_CR1_CEN | TIM_CR1_OPM;
 
 
 while(1);
 }
 void TIM2_IRQHandler(void)
 {
 TO PRZERWANIE URUCHAMIA SIĘ OD RAZU PO WŁĄCZENIU TIMERA.
 }



Gdzie popełniam błąd? Co powinienem zmienić, żeby pierwsze (i w sumie jedyne, bo to one pulse mode) przerwanie uruchomiło się po tych 2 sekundach?

Awatar użytkownika
0110101101101101
Posty: 15
Rejestracja: sobota 12 maja 2018, 14:55

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: 0110101101101101 » piątek 22 cze 2018, 11:47

Chyba doszedłem gdzie jest błąd, ale kompletnie nie wiem dlaczego.
Jak zmieniłem TIM2->ARR z 1999 na 19999, to kolejne przerwania występują co 2 sekundy.

Skoro taktowanie mikroprocesora to 8MHZ, to dla timera taktowanie bazowe to też 8MHz, tak? Preskaler ustawiony na 8000, wartość przeładowania na 2000, więc teoretycznie:
częstotliwość przerwania = 8MHZ / 8000 * 2000 = 0,5HZ, więc okres to 1/f = 1/0,5HZ = 2s.

Istnieje jeszcze jakiś bit, który ma wpływ na preskaler timera? bo mój wygląda jakby był podzielony przez 10..

Awatar użytkownika
squeez
User
User
Posty: 200
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: squeez » piątek 22 cze 2018, 13:56

A może masz PLL ustawione przy taktowaniu procesora?

Awatar użytkownika
0110101101101101
Posty: 15
Rejestracja: sobota 12 maja 2018, 14:55

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: 0110101101101101 » piątek 22 cze 2018, 14:52

Właśnie to było problemem.
Rejestr RCC_CFGR i bity SW ustawione na 10 - więc PLL, a powinno być 00.

Tylko nie wiem, dlaczego to się zmieniło, skoro nigdy tego rejestru nie używałem.
Dzięki!

Awatar użytkownika
mokrowski
User
User
Posty: 145
Rejestracja: czwartek 08 paź 2015, 20:50
Lokalizacja: Tam gdzie Centymetro

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: mokrowski » piątek 22 cze 2018, 21:06

Zamiast while(1) standard MISRA dla embedded zaleca for(;;)
,,Myślenie nie jest łatwe, ale można się do niego przyzwyczaić" - Alan Alexander Milne: Kubuś Puchatek

Awatar użytkownika
inż.wielki
User
User
Posty: 219
Rejestracja: niedziela 20 gru 2015, 23:11

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: inż.wielki » sobota 23 cze 2018, 13:02

mokrowski pisze:Zamiast while(1) standard MISRA dla embedded zaleca for(;;)

Ma to jakaś przewagę nad while(1)

Awatar użytkownika
0110101101101101
Posty: 15
Rejestracja: sobota 12 maja 2018, 14:55

Re: Proste pytania o programowanie STM32 w języku C.

Postautor: 0110101101101101 » sobota 23 cze 2018, 14:37

Okej, zwrócę na to uwagę i zacznę używać for(;;), ale macie jakieś wytłumaczenie dlaczego tak jest?

Samo środowisko attolic po stworzeniu nowego projektu tworząc szkielet kodu w funkcji main używa while(1);


Wróć do „Programowanie STM w C/C++”

Kto jest online

Użytkownicy przeglądający to forum: Google [Bot] i 0 gości