<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=46&amp;t=20838&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-06-15T15:16:00+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=20838&amp;mode</id>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-15T15:16:00+01:00</updated>
<published>2018-06-15T15:16:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208940#p208940</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208940#p208940"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208940#p208940"><![CDATA[
Próbowałem różnych rozwiązań i zdecydowanie najwięcej korzyści przyniosła zmiana typu danych na float. Przy FIR udało mi się uzyskać 50. rząd dla szybkości próbkowania 44100 Hz. Co prawda dla IIR to tylko 12. rząd, ale może wystarczy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 15 cze 2018, o 15:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2018-06-12T20:06:42+01:00</updated>
<published>2018-06-12T20:06:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208902#p208902</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208902#p208902"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208902#p208902"><![CDATA[
<div class="quotetitle">radek04 napisał(a):</div><div class="quotecontent"><br />Mam w projekcie folder CMSIS (używam SW4STM32), ale nie ma w nim przykładów. Gdzie je mogę znaleźć?<br />W przerwaniu mogę wywoływać funkcję static inline?<br /></div><br />Najlepiej ściągnij CubeMX i gdy wygenerujesz jakiś projekt do System Workbench to zostaną pobrane paczki dla STM32F4.<br />W katalogu użytkownika znajdziesz taką ścieżkę:<br />STM32Cube\Repository\STM32Cube_FW_F4_V1.18.0\Drivers\CMSIS<br />Nr biblioteki może się różnić.<br /><br />W środku będzie pełna biblioteka DSP_lib. Opis biblioteki, w jęz. angielskim,  już w tym wątku podsyłałem.<br />Static inline możesz wywoływać w przerwaniu, bo czemu by nie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 12 cze 2018, o 20:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2018-06-12T15:50:41+01:00</updated>
<published>2018-06-12T15:50:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208899#p208899</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208899#p208899"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208899#p208899"><![CDATA[
Popatrz jak się tego typu filtrowanie robi na innych prockach np DSPIC, może coś wykorzystasz a może zmienisz procka? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 12 cze 2018, o 15:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-12T12:34:26+01:00</updated>
<published>2018-06-12T12:34:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208894#p208894</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208894#p208894"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208894#p208894"><![CDATA[
Mam w projekcie folder CMSIS (używam SW4STM32), ale nie ma w nim przykładów. Gdzie je mogę znaleźć?<br />W przerwaniu mogę wywoływać funkcję static inline?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 12 cze 2018, o 12:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2018-06-12T12:26:45+01:00</updated>
<published>2018-06-12T12:26:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208893#p208893</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208893#p208893"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208893#p208893"><![CDATA[
<div class="quotetitle">radek04 napisał(a):</div><div class="quotecontent"><br />Świetne rady. Co do rozpisania pętli (o ile dobrze to rozumiem), to raczej się nie uda, bo program ma być &quot;elastyczny&quot; i przystosowany do uzycia dowolnego (acz ograniczonego co do wielkości) rzędu.<br /></div><br />Jeżeli rząd jest ograniczony do np 20, to przygotowanie 11 &quot;rozpisanych&quot; funkcji (załóżmy powyżej 9 rzędu, które to załóżmy już są problematyczne ) to nie będzie problem jeśli masz sporo pamięci FLASH.<br />Jeśli podejrzysz kody CMSIS to zauważysz, że są tam tablice stałych o wielkości nawet do 8192 słów, czy też &quot;floatów&quot;<br />To są właśnie metody na przyśpieszanie kodu poprze eliminacje skoków.<br />Oczywiście najlepiej jak zrobisz sobie testy i pomierzysz czasy, czy faktycznie będziesz miał zysk.<br /><br /><div class="quotetitle">radek04 napisał(a):</div><div class="quotecontent"><br />Biblioteka CMSIS też chyba nie przejdzie z powodu narzucenia, by kod filtru był &quot;widoczny&quot;.<br />Najbardziej mnie zainteresowała funkcja wspomagania sprzętowego. Pozostałe rady też spróbuje zastosować. Niestety do piątku jestem poza domem, ale postaram się w miarę możliwości coś poprawić.<br /></div><br />Nic nie szkodzi, żebyś sobie podejrzał funkcje do filtrów w CMSIS, może sam wpadniesz na dodatkowe optymalizacje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 12 cze 2018, o 12:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-12T12:28:03+01:00</updated>
<published>2018-06-12T12:10:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208892#p208892</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208892#p208892"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208892#p208892"><![CDATA[
Świetne rady. Co do rozpisania pętli (o ile dobrze to rozumiem), to raczej się nie uda, bo program ma być &quot;elastyczny&quot; i przystosowany do uzycia dowolnego (acz ograniczonego co do wielkości) rzędu. <br />Biblioteka CMSIS też chyba nie przejdzie z powodu narzucenia, by kod filtru był &quot;widoczny&quot;.<br />Najbardziej mnie zainteresowała funkcja wspomagania sprzętowego. Pozostałe rady też spróbuje zastosować. Niestety do piątku jestem poza domem, ale postaram się w miarę możliwości coś poprawić.<br /><br />Edit: Wspomaganie sprzętowe mam włączone.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 12 cze 2018, o 12:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2018-06-12T10:42:46+01:00</updated>
<published>2018-06-12T10:42:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208890#p208890</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208890#p208890"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208890#p208890"><![CDATA[
No to teraz sporo się wyjaśniło.<br />Nie mam niestety doświadczenia w budowaniu filtrów cyfrowych, może poza prostymi &quot;średnimi&quot;, ale można trochę podywagować o Twoim rozwiązaniu.<br />Jak już wyliczałem, dla próbkowania 44100 Hz należy zbierać sample co 22 us, czyli masz mniej więcej tyle czasu na zebranie danych i obliczenia.<br />Oczywiście to wszystko przy założeniu, że procesor nic innego nie robi. Spójrzmy na obsługę przerwania:<br />[syntax=c]void TIM5_IRQHandler() {<br />     if (TIM_GetITStatus(TIM5, TIM_IT_Update) == SET) {<br />        TIM_ClearITPendingBit(TIM5, TIM_IT_Update);<br />        //kod przerwania:<br />                ADC_in=ADC_GetConversionValue(ADC1); // odczyt wejscia ADC<br />                probki&#91;0&#93;=(double)ADC_in;<br />                acc=0; // zerowanie akumulatora<br />                                for (i=0; i&lt;rzad+1; i++) {               // operacja mnozenia<br />                                         acc+=h&#91;i&#93;*probki&#91;i&#93;;            // i dodawania w filtrze<br />                                }<br />                                DAC_Out=(uint)acc;<br />                                DAC_SetChannel1Data (DAC_Align_12b_R,DAC_Out ); // wyslanie do DAC<br />                                for (i=rzad; i&gt;0; i--) {<br />                                        probki&#91;i&#93;=probki&#91;i-1&#93;; // przesuniecie probek w pamieci<br />                                }<br />                                GPIO_ToggleBits(GPIOA, GPIO_Pin_8);//testy<br />    }<br />}[/syntax]<br />Można spróbować kilku optymalizacji.<br />1. Usunięcie typu <strong>double</strong>. Procki STM32 nie są zoptymalizowane do tego typu, czy faktycznie potrzebujesz tak dużego zakresu do swoich obliczeń? Może <strong>uint32_t </strong>wystarczy, a może <strong>float32_t</strong>? O tym drugim nieco niżej.<br /><br />2. Używasz pętli, można spróbować rozwinąć pętle, szczególnie te duże wartości 10 i więcej, można by rozpisać do prostych poleceń, tak by procesor nie tracił czasu na skoki. Wielkość kodu wzrośnie, a można zaoszczędzić trochę czasu procesora.<br />Można stworzyć funkcje <strong>static inline</strong> z rozwinięciami, zależne od rzędu filtru.<br /><br />3. Nic nie piszesz o optymalizacjach, które zastosowałeś.<br />Czy próbowałeś używać bibliotek matematycznych dostarczanych z <strong>CMSIS</strong>?<br />Czy włączasz obsługę sprzętową zmiennoprzecinkową, możesz o tym poczytać tutaj:<br /><!-- m --><a class="postlink" href="https://forum.sunduino.pl/viewtopic.php?f=9&amp;t=59" >https://forum.sunduino.pl/viewtopic.php?f=9&amp;t=59</a><!-- m --><br />Jeśli włączysz obsługę <strong>FPU</strong>, to jest szansa, że operacje na <strong>float32_t </strong>przyśpieszą. <br /><br />4. Może w ogóle zainteresuj się <strong>CMSIS</strong>, masz tam obsługę filtrów cyfrowych zoptymalizowaną pod STM32:<br /><!-- m --><a class="postlink" href="https://developer.arm.com/embedded/cmsis" >https://developer.arm.com/embedded/cmsis</a><!-- m --><br />Sekcja:<br />CMSIS-DSP: Fast implementation of digital signal processing<br />Lepiej tego pewnie nie napiszesz  (a kto tutaj napisze <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ), niestety to podejście wymaga studiowania tematu.<br />Ja to już troszkę liznąłem, ale nie na tyle żeby wiele podpowiedzieć.<br /><br />Mogę napisać dodatkowo, że biblioteka jest obszerna, optymalizacje są zależne od wybranej precyzji (8, 16, 32 bitowej).<br />Mamy tam szereg podstawowych, zoptymalizowanych funkcji matematyczny jak sinus, średnia, tranformata Fouriera, filtry cyfrowe itp.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 12 cze 2018, o 10:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-12T06:46:27+01:00</updated>
<published>2018-06-12T06:46:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208884#p208884</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208884#p208884"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208884#p208884"><![CDATA[
Masz rację. Założenie jest takie, by filtr działał na bieżąco  &quot;w czasie rzeczywistym&quot;. Ale jeśli z pewnym niewielkim opóźnieniem także uda się uzyskać sygnał ciągły bez utraty żadnego fragmentu, to też będzie w porządku.<br />Ale chyba tak się nie da, prawda?<br /><br />Program ma pokazywać działanie filtru. Na oscyloskopie do jednego kanału podany jest sygnał wejściowych, a do drugiego wyjściowy - albo identyczny z wejściowym, albo tłumiony(częściowo, lub całkowicie). Zastosowanie bardziej edukacyjne, niż praktyczne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 12 cze 2018, o 06:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2018-06-10T20:59:04+01:00</updated>
<published>2018-06-10T20:59:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208836#p208836</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208836#p208836"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208836#p208836"><![CDATA[
<div class="quotetitle">radek04 napisał(a):</div><div class="quotecontent"><br />Myślicie, że powinienem użyć DMA dla pojedynczego odczytu? A może jakoś zoptymalizować inne operacje? Podobno zamiast przesuwania elementów tablicy, można  wykorzystać wskaźniki, ale nie do końca wiem jak.<br /></div><br />A może napisz po prostu co właściwie ten program ma robić, bo wydaje mi się, że nie do końca wiemy.<br />Pisałeś o filtrze cyfrowym, ale z tego co rozumiem to po każdym pomiarze z ADC już chcesz od razu coś przeliczać i od razu wyrzucać do DACa. Wg mnie tak się tego nie powinno robić. Pisałem już o tym, zbierasz porcję danych, zaczynasz przeliczać, w czasie przeliczania zbierasz kolejną porcję danych.<br />Wygląda na to jakbyś chciał zrobić coś w stylu korektora dźwiękowego o bardzo niskim opóźnieniu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 10 cze 2018, o 20:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-10T06:23:22+01:00</updated>
<published>2018-06-10T06:23:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208779#p208779</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208779#p208779"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208779#p208779"><![CDATA[
Myślicie, że powinienem użyć DMA dla pojedynczego odczytu? A może jakoś zoptymalizować inne operacje? Podobno zamiast przesuwania elementów tablicy, można  wykorzystać wskaźniki, ale nie do końca wiem jak.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 10 cze 2018, o 06:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-09T07:08:26+01:00</updated>
<published>2018-06-09T07:08:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208728#p208728</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208728#p208728"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208728#p208728"><![CDATA[
Wykonuję tylko 1 pomiar, przetwarzanie i wysłanie na DAC w każdym przerwaniu. Wydaje mi się, że sporo czasu może zajmować przesuwanie elementów tablicy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 9 cze 2018, o 07:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2018-06-08T22:04:38+01:00</updated>
<published>2018-06-08T22:04:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208724#p208724</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208724#p208724"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208724#p208724"><![CDATA[
Ile robisz próbek poprzez ADC? Jeśli kilka to faktycznie nie ma sensu użyć DMA, ale jeśli jest ich kilkaset, to należy użyć DMA.<br />Dla 512 próbek i częstotliwości próbkowania 44100 Hz musisz robić cały pomiar przez 512 * 22 us = 11 ms, zapełniając bufor aż po ostatnią próbkę. Ilość próbek jest zdefiniowana w rejestrze kontrolera DMA. Nie ma sensu aby co 22 us wchodzić w przerwanie i coś tam mnożyć. Lepiej mnożyć przez te 11 ms zbierając próbki już do następnych przeliczeń. Dlatego należy użyć DMA.<br />Pomiar co 22 us oczywiście wyzwalany jest przez timer, a włączone DMA pozwala zdjąć procesor z konieczności kopiowania danych z rejestru ADC do pamięci RAM.<br />Warto przeglądnąć to:<br /><!-- m --><a class="postlink" href="https://forbot.pl/blog/kurs-stm32-f4-5-pomiar-napiecia-adc-dma-stmstudio-id13099" >https://forbot.pl/blog/kurs-stm32-f4-5- ... io-id13099</a><!-- m --><br /><br />Co prawda to w HALu, ale wydaje mi się że sporo musisz nadrobić. Szybkie przejście z HAla na STD nie powinno sprawić kłopotu.<br /><br />Może zacząć od tego:<br /><!-- m --><a class="postlink" href="https://embedds.com/multichannel-adc-using-dma-on-stm32/" >https://embedds.com/multichannel-adc-us ... -on-stm32/</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 8 cze 2018, o 22:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-08T21:20:50+01:00</updated>
<published>2018-06-08T21:20:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208722#p208722</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208722#p208722"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208722#p208722"><![CDATA[
Czyli do odczytu ADC powinienem użyć DMA, tak? Ale jeśli czegoś nie pomyliłem, to odczyt zajmuje chyba kilkanaście cykli zegara (nie wiem ile ich zapis), więc niewiele zaoszczędzę, a potrzebuję 2x większej szybkości wszystkich operacji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 8 cze 2018, o 21:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2018-06-08T21:06:06+01:00</updated>
<published>2018-06-08T21:06:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208721#p208721</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208721#p208721"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208721#p208721"><![CDATA[
W transferach danych bez udziału procka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 8 cze 2018, o 21:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-08T21:13:28+01:00</updated>
<published>2018-06-08T20:59:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208719#p208719</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208719#p208719"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208719#p208719"><![CDATA[
Co do kodu to przyznaję się, że był pisany przez dwóch ludzi i składany z mniejszych fragmentów, stąd te powtórzenia. Jeśli chodzi o SPL, to długa historia. Powoli muszę kończyć projekt i nie bardzo mam czas na rewolucyjne zmiany. <br />Obliczenia muszą wykonywać się pomiędzy pomiarami i wystawiać DAC na bieżąco. Nie robiłem nigdy DMA. W czym ono dokładnie pomoże?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 8 cze 2018, o 20:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2018-06-08T18:52:19+01:00</updated>
<published>2018-06-08T18:52:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208711#p208711</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208711#p208711"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208711#p208711"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Na rejestrach bylaby to jedna linijka.<br /></div><br /><br />z std to też jedna linijka ..  a nawet jej połowa ... <br /><br />Tymczasem kod powyższy jest przekombinowany ,  i pozbawiony logiki ... <br />zegar wystarczy 1 raz włączyć dla urządzeń nie trzeba robić funkcji i podprogramów ... co zbędnie komplikuje czytanie kodu go zaciemnia<br />po co kolejne włączanie zegarów w konfiguracji LCD ??<br /><br />skoro używasz SPI do LCD to nie możesz zdefiniować pinów ?? <br /><br />ale dobra ...   bo zaraz mnie spece od rejestrów zlinczują ...   że wytykam błędy ... <br /><br />(jak nie wiesz jak co uruchomić podglądnij sobie w choćby przykładach od STM -- to nie boli  )<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 8 cze 2018, o 18:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2018-06-08T18:20:24+01:00</updated>
<published>2018-06-08T18:20:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208710#p208710</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208710#p208710"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208710#p208710"><![CDATA[
Wg mnie popełniasz tutaj spory błąd w założeniach, tzn nie używasz DMA do zbierania próbek, stąd pewnie problemy z wydajnością.<br />Zaleta użycia DMA byłaby tutaj taka, że w momencie przeliczania, mnożenia itp, możesz już zbierać próbki do następnych działań, bez straty czasu procesora. Przeliczanie nie wymaga ścisłych zależności czasowych, może być przerywane innymi zdarzeniami, natomiast zbieranie próbek to i owszem. W F3 masz jeszcze sporo dostępnych kanałów DMA. Druga sprawa, ale już bardziej indywidualna, osobista, to ten bagaż w postaci bibliotek <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Z mało istotnych błędów, to niepotrzebnie dwa razy włączasz zegar dla ADC1, ale to takie czepianie się tylko <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Dziwnie też dla mnie wygląda konfiguracja zegara dla portów, też jakby dwa razy to włączane, ale z innych funkcji.<br />Nie znam niestety STD Periph, więc nie wiem, może to poprawne jest. Na rejestrach bylaby to jedna linijka.<br />[syntax=c]RCC-&gt;AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN |RCC_AHB1ENR_GPIOCEN |RCC_AHB1ENR_GPIODEN;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 8 cze 2018, o 18:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-08T16:09:10+01:00</updated>
<published>2018-06-08T16:09:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208708#p208708</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208708#p208708"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208708#p208708"><![CDATA[
Zostawiłem w przerwaniu tylko sterowanie pinem i faktycznie udaje się uzyskać większe szybkości (ok 700kHz).<br /><br />Jest to dla mnie wystarczające, więc problemem chyba jest sam kod występujący w przerwaniu:<br />[syntax=c]void TIM5_IRQHandler()<br />{<br /><br />    if (TIM_GetITStatus(TIM5, TIM_IT_Update) == SET)<br />    {<br />        TIM_ClearITPendingBit(TIM5, TIM_IT_Update);<br />        //kod przerwania:<br />  ADC_in=ADC_GetConversionValue(ADC1); // odczyt wejscia ADC<br /> probki&#91;0&#93;=(double)ADC_in;<br />  acc=0; // zerowanie akumulatora<br />  for (i=0; i&lt;rzad+1; i++)// operacja mnozenia<br />  {<br />  acc+=h&#91;i&#93;*probki&#91;i&#93;;// i dodawania w filtrze<br />  }<br />  DAC_Out=(uint)acc;<br />  DAC_SetChannel1Data (DAC_Align_12b_R,DAC_Out ); // wyslanie do DAC<br />  for (i=rzad; i&gt;0; i--)<br />  {<br />  probki&#91;i&#93;=probki&#91;i-1&#93;; // przesuniecie probek w pamieci<br />  }<br />  GPIO_ToggleBits(GPIOA, GPIO_Pin_8);//testy<br />    }<br />}[/syntax]<br /><br />W razie czego wrzucam konfigurację wszystkich używanych modułów:<br />[syntax=c]void konfiguracjaZegarow()<br />{<br /> RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);<br /> RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE);<br /> RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);<br /> RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);<br /> RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOAEN, ENABLE);<br /> RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOCEN, ENABLE);<br /> RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);<br />}<br />void konfiguracjaGPIO()<br />{<br />GPIO_InitTypeDef gpio;<br /><br />//PIN PA8 - do testów tylko<br />gpio.GPIO_Pin = GPIO_Pin_8;//do oscyloskopu<br />gpio.GPIO_Mode = GPIO_Mode_OUT;<br />gpio.GPIO_OType = GPIO_OType_PP;<br />gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;<br />gpio.GPIO_Speed = GPIO_Speed_100MHz;<br />    //Initialize pins<br />    GPIO_Init(GPIOA, &amp;gpio);<br /><br />}<br />void konfiguracjaUART()<br />{<br /> /* Set alternate functions */<br /> GPIO_InitTypeDef gpio;<br /> GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);<br /> GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);<br /><br /> /* Init GPIO pins */<br /> //UART<br /> GPIO_StructInit(&amp;gpio);<br /> gpio.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;<br /> gpio.GPIO_Mode = GPIO_Mode_AF;<br /> gpio.GPIO_OType = GPIO_OType_PP;<br /> gpio.GPIO_PuPd = GPIO_PuPd_UP;<br /> gpio.GPIO_Speed = GPIO_Speed_100MHz;<br /> GPIO_Init(GPIOA, &amp;gpio);<br /><br /> /* Configure UART setup */<br /> USART_InitTypeDef uart;<br /> USART_StructInit(&amp;uart);<br /> uart.USART_BaudRate = 115200;<br /> uart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;<br /> uart.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;<br /> uart.USART_Parity = USART_Parity_No;<br /> uart.USART_StopBits = USART_StopBits_1;<br /> uart.USART_WordLength = USART_WordLength_8b;<br /> USART_Init(USART2, &amp;uart);<br /> USART_Cmd(USART2, ENABLE);<br />}<br />void konfiguracjaADC()<br />{<br /> //Konfiguracja ADC<br /> ADC_InitTypeDef ADC_Init_Structure;<br /> ADC_CommonInitTypeDef ADC_CommonInitStructure;<br /> ADC_DeInit();<br /> ADC_StructInit(&amp;ADC_Init_Structure);<br /> ADC_CommonStructInit(&amp;ADC_CommonInitStructure);<br /> ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;<br /> ADC_CommonInitStructure.ADC_Prescaler = PRESCALER;//zdefiniowane 2,4,6,8<br /> ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;<br /> ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//5-20*/<br /> ADC_CommonInit(&amp;ADC_CommonInitStructure);<br /> ADC_Init_Structure.ADC_DataAlign = ADC_DataAlign_Right;<br /> ADC_Init_Structure.ADC_Resolution = ADC_Resolution_12b;<br /> ADC_Init_Structure.ADC_ContinuousConvMode = ENABLE;<br /> ADC_Init_Structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;<br /> ADC_Init_Structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;<br /> ADC_Init_Structure.ADC_NbrOfConversion = 1;<br /> ADC_Init_Structure.ADC_ScanConvMode = DISABLE;<br /> ADC_Init(ADC1, &amp;ADC_Init_Structure);<br /> ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,CYCLES);//zdefiniowane 3,15,28,56,84,112,144,480<br /> ADC_Cmd(ADC1,ENABLE);<br /><br /> GPIO_InitTypeDef gpio;<br /> //Konfiguracja pinu analogowego<br /> //Kanal 0 podlaczony do PA0<br /> gpio.GPIO_Pin = GPIO_Pin_0;<br /> gpio.GPIO_Mode = GPIO_Mode_AN;<br /> gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;<br /> GPIO_Init(GPIOA, &amp;gpio);<br />}<br />void konfiguracjaLCD()<br />{<br /> GPIO_InitTypeDef gpio;<br /> SPI_InitTypeDef SPIInit;<br /><br /> RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE);<br /> RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);<br /><br /> //Definicja funkcji alternatywnych dla pinów MOSI oraz CLK<br /> GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);<br /> GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1); //podłączenie do PB3(D3)<br /><br /> GPIO_StructInit(&amp;gpio);<br /> gpio.GPIO_Pin = GPIO_Pin_7; //MOSI<br /> gpio.GPIO_Mode = GPIO_Mode_AF;<br /> gpio.GPIO_Speed = GPIO_Speed_50MHz;<br /> GPIO_Init(GPIOA, &amp;gpio);<br /><br /> gpio.GPIO_Pin = GPIO_Pin_3;// SCK<br /> gpio.GPIO_Mode = GPIO_Mode_AF;<br /> gpio.GPIO_Speed = GPIO_Speed_50MHz;<br /> GPIO_Init(GPIOB, &amp;gpio);<br /><br /> gpio.GPIO_Pin = GPIO_Pin_6; // MISO<br /> gpio.GPIO_Mode = GPIO_Mode_IN;<br /> GPIO_Init(GPIOA, &amp;gpio);<br /><br /> gpio.GPIO_Pin = LCD_DC|LCD_CE|LCD_RST;<br /> gpio.GPIO_Mode = GPIO_Mode_OUT;<br /> gpio.GPIO_OType = GPIO_OType_PP;<br /> GPIO_Init(GPIOB, &amp;gpio);<br /> GPIO_SetBits(GPIOB, LCD_CE|LCD_RST);<br /><br /> SPI_StructInit(&amp;SPIInit);<br /> SPIInit.SPI_Direction = SPI_Direction_2Lines_FullDuplex;<br /> SPIInit.SPI_Mode = SPI_Mode_Master;<br /> SPIInit.SPI_CPOL = SPI_CPOL_Low;<br /> SPIInit.SPI_CPHA = SPI_CPHA_1Edge;<br /> SPIInit.SPI_NSS = SPI_NSS_Soft;<br /> SPIInit.SPI_DataSize = SPI_DataSize_8b;<br /> SPIInit.SPI_FirstBit = SPI_FirstBit_MSB;<br /> SPIInit.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;<br /> SPI1-&gt;CR1 &amp;= ~SPI_CR1_SPE;<br /> SPI_Init(SPI1, &amp;SPIInit);<br /> SPI_Cmd(SPI1, ENABLE);<br />}<br /><br />void konfiguracjaPrzerwania()<br />{<br /> TIM_TimeBaseInitTypeDef tim;<br /> NVIC_InitTypeDef nvic;<br /><br /> TIM_TimeBaseStructInit(&amp;tim);<br /> tim.TIM_CounterMode = TIM_CounterMode_Up;<br /> tim.TIM_Prescaler = 2 - 1; //16bit -&gt; max 65535  10000 =&gt; 100*10^6/10*10^3 = 10kHz (100us)<br /> //tim.TIM_Period = 1134 - 1;//16bit -&gt; max 65535 44100Hz<br /> tim.TIM_Period = 2 - 1;<br /> TIM_TimeBaseInit(TIM5, &amp;tim);<br /> TIM_ClearITPendingBit(TIM5, TIM_IT_Update);<br /> TIM_UpdateRequestConfig(TIM5, TIM_UpdateSource_Regular);<br /> TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);<br /> TIM_Cmd(TIM5, ENABLE);<br /><br /> nvic.NVIC_IRQChannel = TIM5_IRQn;<br /> nvic.NVIC_IRQChannelPreemptionPriority = 0;<br /> nvic.NVIC_IRQChannelSubPriority = 0;<br /> nvic.NVIC_IRQChannelCmd = ENABLE;<br /> NVIC_Init(&amp;nvic);<br />}<br /><br />void konfiguracjaDAC()<br />{<br />  // konfiguracja timera<br />  TIM_TimeBaseInitTypeDef TIM6_TimeBase;<br />    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);<br />    TIM_TimeBaseStructInit(&amp;TIM6_TimeBase);<br />    TIM6_TimeBase.TIM_Period        = 0xFFFFFFFF;//(uint16_t)TIM_PERIOD;<br />    TIM6_TimeBase.TIM_Prescaler     = 0;<br />    TIM6_TimeBase.TIM_ClockDivision = 0;<br />    TIM6_TimeBase.TIM_CounterMode   = TIM_CounterMode_Up;<br />    TIM_TimeBaseInit(TIM6, &amp;TIM6_TimeBase);<br />    TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);<br />    TIM_Cmd(TIM6, ENABLE);<br /><br />    // konfiguracja DAC<br />    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);<br />    DAC_InitTypeDef DAC_INIT;<br />    DAC_INIT.DAC_Trigger= DAC_Trigger_None;<br />    DAC_INIT.DAC_WaveGeneration = DAC_WaveGeneration_None;<br />    DAC_INIT.DAC_OutputBuffer   = DAC_OutputBuffer_Enable;<br />    DAC_Init(DAC_Channel_1, &amp;DAC_INIT);<br />    DAC_Cmd(DAC_Channel_1, ENABLE);<br />    DAC_DMACmd(DAC_Channel_1, ENABLE);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 8 cze 2018, o 16:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-06-08T08:41:03+01:00</updated>
<published>2018-06-08T08:41:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208703#p208703</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208703#p208703"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208703#p208703"><![CDATA[
<div class="quotetitle">radek04 napisał(a):</div><div class="quotecontent"><br />A może to szybkość zmian stanu pinu jest ograniczona (wychodzi mi ok. 25kHz)?<br /></div>Takie prędkości to uzyskujesz bez żadnego problemu na AVRze. Więc na pewno na STMie musisz coś źle ustawiać.<br />Jak masz ustawiony sygnały zegarowe?<br />Daj trochę więcej informacji o kodzie (szczególnie inicjalizacji) oraz przerwaniu, to może coś Ci podpowiemy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />A najlepiej obetnij kod tylko do tego przerwania i sterowania pinem. I sprawdź czy nadal nie działa. Jak tak, to wrzuć na forum a na pewno ktoś Ci pomoże.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 8 cze 2018, o 08:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-07T20:12:22+01:00</updated>
<published>2018-06-07T20:12:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208689#p208689</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208689#p208689"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208689#p208689"><![CDATA[
Robię filtry cyfrowe i w przerwaniu wykonuję mnożenia, dodawania i przesuwanie wartości w tablicy. Chciałbym uzyskać  fs=44100Hz dla różnych (niewielkich) rzędów filtrów. Ale okazuje się, że już przy ok. 10. rzędzie FIR mam nieprawidłowe wartości. <br />Sprawdzam działanie przerwania zmieniając stan pinu, który badam oscyloskopem. I okazuje się, że częstotliwość zmian jest ograniczona i od pewnego momentu niezależna od ustawień przerwania. Chodzi mi o to, że gdy już uzyskam maksymalną częstotliwość, to dalsze zmniejszanie tim.TIM_Period nie powoduje zmian tej częstotliwości. <br />Myślałem, że jeśli kolejne przerwanie wystąpi przed wystawieniem wartości na pinie, to nic się nie będzie działo, bo zacznie się kolejne przerwanie, a dopiero na jego końcu mam zmianę stanu bitu. Dlaczego tak się dzieje? Czyżby gdzieś była zapamiętywana komenda do wystawienia stanu wysokiego lub niskiego i po prostu jest wykonywana z opóźnieniem? A może to szybkość zmian stanu pinu jest ograniczona (wychodzi mi ok. 25kHz)?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 7 cze 2018, o 20:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2018-06-07T07:31:28+01:00</updated>
<published>2018-06-07T07:31:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208673#p208673</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208673#p208673"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208673#p208673"><![CDATA[
<div class="quotetitle">dambo napisał(a):</div><div class="quotecontent"><br />odliczanie dzieje się natychmiast - w kodzie przerwania jedynie czyścisz flagę, która informuje, że wystąpił event.<br />Przerwania powinny się zazwyczaj wykonywać bardzo szybko, nie powinno się ich blokować jakimś dużym kawałkiem kodu.<br /></div><br />To bardzo ogólna zasada stosowana tam gdzie nie można ustawiać priorytetów przerwań i wywłaszczeń, np w programowaniu AVR.<br />Ponieważ piszemy w wątku o STM32 to w wypadku tychże procków najczęściej nie ma zastosowania.<br />Nawet wręcz przeciwnie, można spotkać zalecenia mówiące, żeby w ogóle pisać w przerwaniach, z pominięciem pętli w main.<br />Sam zrobiłem już kilka projektów na STM32 i wydaje mi się, że zalecenia te są całkiem sensowne.<br />Szczególnie przydatne jest tutaj pojęcie wywłaszczenia przerwań.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 7 cze 2018, o 07:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-06T21:13:25+01:00</updated>
<published>2018-06-06T21:13:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208670#p208670</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208670#p208670"/>
<title type="html"><![CDATA[Re: STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208670#p208670"><![CDATA[
Czyli raczej nie mam sytuacji, w której nie zdąży się wykonać kod, ale jeszcze dokładnie to sprawdzę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 6 cze 2018, o 21:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek04]]></name></author>
<updated>2018-06-06T09:56:00+01:00</updated>
<published>2018-06-06T09:56:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208632#p208632</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208632#p208632"/>
<title type="html"><![CDATA[STM2F4 sposób działania przerwania od timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20838&amp;p=208632#p208632"><![CDATA[
Mam pytanie o działanie przerwania.<br />Mając kod przerwania postaci:<br />[syntax=c]void TIM5_IRQHandler()<br />{<br /><br />    if (TIM_GetITStatus(TIM5, TIM_IT_Update) == SET)<br />    {<br />        TIM_ClearITPendingBit(TIM5, TIM_IT_Update);<br />        //kod przerwania:<br />           //moje operacje<br />       //koniec kodu przerwania<br />    }<br />}[/syntax]kolejne odliczanie timera zaczyna się od momentu wystąpienia poprzedniego przerwania (od miejsca TIM_ClearITPendingBit(TIM5, TIM_IT_Update)), czy od momentu zakończenia wykonywania kodu przerwania (&quot;koniec kodu przerwania&quot;)? Co się dzieje w przypadku, kiedy &quot;moje operacje&quot; zajmują więcej czasu, niż odstęp pomiędzy kolejnymi przerwaniami? A może linia TIM_ClearITPendingBit(TIM5, TIM_IT_Update) powinna być na końcu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16846">radek04</a> — 6 cze 2018, o 09:56</p><hr />
]]></content>
</entry>
</feed>