Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

STM32 - Systick i RTC - wspólnie śmigają, oddzielnie zwisają

rbrus 05 Apr 2014 10:16 2154 7
Computer Controls
  • #1
    rbrus
    Level 14  
    Witam,

    Chciałbym zapytać jaka jest zależność RTC i Systicka. O ile tak owa jest?
    - Kwarc 12Mhz (HSE_VALUE=12000000 , #define SYSCLK_FREQ_HSE HSE_VALUE)
    - Kody źródłowe poniżej
    - Keil
    - RTC zasilam z HSE (LSE nie trybi z przyczyn fizycznych)
    - STM32F103RBT6
    - STMF4_Discovery jako debugger po SWD

    Problem:
    1) A więc problem jest taki iż po wgraniu programu w którym inicjuje Systick oraz RTC, Ledy zapalają się na zmianę co 2s. Prawie dobrze gdyż w przerwaniu od Systicka ustawiłem by LED1 zapalał się co 1s, a w przerwaniu od RTC by LED2 zapalał się co 2s. Druga sprawa jak wyłączę RTC - nie zainicjuje go, LED1 świeci nie przerwanie, jakby Systick nagle stracił swój potencjał odliczania tej że 1s (2s).

    I pytanie jest co mogę robić nie tak?

    Code: c
    Log in, to see the code
  • Computer Controls
  • #2
    Marek K
    Level 13  
    Wiesz co ja dopiero zaczynam z programowaniem stm ale jedna sprawa rzuciła mnie się w oczy.
    twoja funkcja jest prawie funkcją z biblioteki której definicja i rozwinięcie znajduje się w pliku core_cm4.h
    Code: c
    Log in, to see the code

    Ja próbuję bawić się z STM32 przy udziale eclipse i pluginu gnu arm
    http://wikimarek.referata.com/wiki/Programowanie_STM32F4_Linux
    I tam jak się tworzy nowy projekt dla układu stm32f4 to właśnie jest generowany projekt migającej diody w oparciu o timer systick.
    De-facto konfiguracja Timera systick sprowadza się do

    Code: c
    Log in, to see the code


    oczywiście gdzieś wcześniej musi być

    Code: c
    Log in, to see the code


    Wtedy uzyskasz przerwanie co 1 ms. (chyba :P)

    Wiesz chodzi o to, że wydaje mi się że źródło sygnału taktującego rdzeń i timer systick jest takie samo, więc przeważnie wiąże się to z przemnożeniem częstotliwości zegara tak aby uzyskać 168MHz (Stm32F4). Więc nie bardzo kumam twoje usiłowanie wbicia tam 12MHz (No chyba, że zwalniasz na siłę cały rdzeń albo ja po prostu jeszcze tematu do końca nie kumam)
    luknij jeszcze tu może

    http://www.keil.com/pack/doc/cmsis/Core/html/group___sys_tick__gr.html#details

    Tutaj masz projekt migającej diody w oparciu o przerwanie systick jaki to projekt jest domyślnie generowany przez eclipse z pluginem gnu-arm Testowanie i uruchamiane przezemnie na stm32f4 discovery.

    Code: c
    Log in, to see the code
  • Computer Controls
  • #3
    el2010tmp
    Level 25  
    rbrus wrote:
    if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
    {
    RTC_ClearITPendingBit(RTC_IT_SEC);

    Po co warunkujesz kasowanie flagi?
  • #4
    rbrus
    Level 14  
    Marek K wrote:

    Wiesz chodzi o to, że wydaje mi się że źródło sygnału taktującego rdzeń i timer systick jest takie samo, więc przeważnie wiąże się to z przemnożeniem częstotliwości zegara tak aby uzyskać 168MHz (Stm32F4). Więc nie bardzo kumam twoje usiłowanie wbicia tam 12MHz (No chyba, że zwalniasz na siłę cały rdzeń albo ja po prostu jeszcze tematu do końca nie kumam)

    Kwarc mam 12Mhz i tak chciałbym żeby był processor taktowany nie potrzebuje większej predkości z PLL, a że się nie znam, wydaje mi się że jak wszystko będzie działać na równi z źródłem będzie działać najoptymalniej - moze się myle.
    Chociaż mało istotne w sumie, problem siedzi gdzie indziej. Tak mi się wydaje.
  • #5
    Marek K
    Level 13  
    To, że ty chcesz mieć 12 mHz nie znaczy że twoje środowisko tak to zrobi. na rozkręcenie pętli trzeba dość sporo kodu i przynajmniej w domyślnym projekcie jest to jakoś tam ustawione.
    Startup.S system_init() tam może się odbywać ustawienie zegarów na poszczególne peryferia. I skoro chcesz mieć taktowanie rdzenia na 12MHZ przy kwarcu 12MHz to na pewno musiałeś o to zadbać osobiście i celowo.

    Domyślnie (gnu_arm) jest tak, że podajesz kwarc. jak podasz że ma 12 MHz to wartość dzieli na 12 i na wejściu PLL masz 1mhz i z tego rozkręca na 168MHZ. Analogicznie jak podasz 8Mhz to dzieli przez 8 a reszta kodu zostaje niezmieniona:P (Bo na wejściu pll masz 1MHz)

    SysTick_Counter ta zmienna. Jak i gdzie ją zdefiniowałeś ?? czy używasz jej gdzieś poza przerwaniami??.

    powinna być co najmniej volatile a może i static. No i nie może być używana (zapisywana zerowana) nigdzie indziej poza przerwaniem. Bo jeśli w main() będziesz ją resetował to może być dupa i nigdy się nie doliczy zadanej wartości.

    Oczywiście przy pomocy debuggera możesz sobie sprawdzić czy przerwanie od timera się wywołuje (ustawiając pułapkę)

    Sama konfiguracja SysTick nie potrzebuje RTC (SysTick to część rdzenia ARM) A RTC peryferia.
    i jak podałem u mnie działa a konfiguruje przy pomocy takiej funkcji
    Code: c
    Log in, to see the code

    SysTick_Config to funkcja biblioteczna i przynajmniej na początek nie ma sensu jej zmieniać :)
  • #6
    rbrus
    Level 14  
    Volatile i nigdzie nie używana, system_init() wszystko pozmieniane jak trzeba. Uarty pracują poprawnie, RTC teoretycznie też.
  • #7
    Marek K
    Level 13  
    Ps. wyłącz optymalizacje kodu jak możesz
  • #8
    rbrus
    Level 14  
    Optymalizacja wyłączona. Wszystko poustawiane jak trzeba.

    = edit2 =
    Większość problemów została rozwiązana przez pobranie innej wersji Keil'a - keil 5.10 ma problemy z SPL gdyby ktoś również je miał polecam wrócić do wersji 4.x, 5.01 (wydaje mi się że ta dla mnie działała), bądź pobrać wersje 5.10 CM która poprawia też ten problem.