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.

[STM32-f4][C][keil] [FreeRTOS]- biblioteki zegara rcc z rozszerzeniem hal

domelfm 02 Sie 2014 14:36 2214 8
  • #1 02 Sie 2014 14:36
    domelfm
    Poziom 16  

    Konkretnie mam taki problem .
    W poprzednich wersjach "stm32f4xx_rcc.h" działało takie makro do włączania zegara gippo

    Code:
    RCC_AHB1PeriphClockCmd(TM_HD44780_RS_RCC | TM_HD44780_E_RCC | TM_HD44780_D4_RCC | TM_HD44780_D5_RCC | TM_HD44780_D6_RCC | TM_HD44780_D7_RCC, ENABLE);

    Code:
    #define TM_HD44780_D7_RCC            RCC_AHB1Periph_GPIOC


    Przy nowej bibliotece rcc
    Tylko takie makra występują :
    Code:
    __GPIOC_CLK_ENABLE()  
    
    __GPIOC_CLK_DISABLE()

    Tylko jak przy pomocy takiego makra włączyć zegar dla kilku portów

    Przy okazji tworze projekt w freertos i jak tam dodac delay w us jak systemowy delay jest w ms ?

    0 8
  • #2 02 Sie 2014 15:59
    mi14chal
    Poziom 28  

    A co jest trudnego w napisaniu na przykład:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    ?

    0
  • #3 02 Sie 2014 16:58
    domelfm
    Poziom 16  

    Jak to się mawia jak nie kijem to ...

    Chodzi o to iż wymyślili użyteczne makro zwiększające czytelność kodu .
    Kiedyś modyfikując ten kod może być to już nie takie jasne jak teraz.

    I druga sprawa dlaczego zrezygnowali z tego makra ?

    Przy okazji mam tik systemowy co 1ms taktowanie 178mhz.

    Jak wymyślić sposób na opóźnienie np 47us ale taki by w tych 47us procesor mógł coś robić tak jak w wypadku funkcji

    Code:
    osDelay();
    a nie bezmyślne blokowanie procesora "nop" przez 47us.

    Dodam że nie chciałbym zmniejszać tiku systemu do np 10us bo to chyba jest bez sensu.

    0
  • #4 02 Sie 2014 19:21
    mi14chal
    Poziom 28  

    domelfm napisał:
    Kiedyś modyfikując ten kod może być to już nie takie jasne jak teraz.

    To pisz komentarze.

    domelfm napisał:
    I druga sprawa dlaczego zrezygnowali z tego makra ?

    To pytanie do twórców biblioteki.

    domelfm napisał:
    Jak wymyślić sposób na opóźnienie np 47us

    Użyć timera który odliczy 47us.

    0
  • #5 03 Sie 2014 09:54
    domelfm
    Poziom 16  

    Używanie timera to jest chyba najlepszy pomysł.
    Niestety moja wiedza pozwala go tylko skonfigurować.
    Dalsza obsługa w freeRTOS jest narzazie czarami.
    Czy ktoś jest w stanie podesłać przykładowy kod z obsługa przerwania w RTOS realizujący opóźnienie czasowe ?

    0
  • #6 03 Sie 2014 10:25
    atom1477
    Poziom 43  

    Ale przecież kod obsługi to już Twoja działka (my nawet nie wiemy co on ma robić).
    A to co trzeba na razie zrobić żeby to działało, to tylko konfiguracja. A to piszesz że umiesz zrobić.

    0
  • #7 03 Sie 2014 11:51
    domelfm
    Poziom 16  

    Przepraszam za mało fachowe wytłumaczenie.
    Chciałbym stworzyć sobie funkcję która pozwoli tak jak

    Code:
    osDelay();

    odmierzać kawałki czasowe ale w us a nie ms jak systemowy delay.
    Dokładność odmierzania nie jest tu kluczowa kluczowe jest nie zajmowanie czasu procesora w czasie oczekiwania. Tak jak to robi
    Code:
    osDelay();

    Dokładność opóźnienia powinna mieścić się w ok 5us...

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak wygląda osDelay

    Wydaje mi się iż tworząc sobie taka funkcje

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Gdzie uSec zmniejszać w każdym przerwaniu od timera .
    Mozę to działać tak jak zamierzam ?

    0
  • Pomocny post
    #8 17 Sie 2014 15:35
    nsvinc
    Poziom 35  

    Jakiego typu jest absolutnie absurdalny i perwersyjnie wypaczony pomysł, aby mając OSa robić takie delay'e w wątkach???

    Również o podobną perwersję zakrawa wykonywanie przerwania timera co mikrosekundę tylko po to, zeby zmniejszać tam jakąś zmienną.
    Wez timer, skonfiguruj go jako one-shot, skonfiguruj mu takt na 1us, do ARR wpisz chciany czas w us, odpal timer, czekaj na flage update.

    OS nie odliczy ci mikrosekund jesli jego tick jest dluzszy. Musiałbyś ustawić tick OSa na 1us, a to jest piramidalna głupota. Jesli potrzebujesz wykonywać procesy krytyczne czasowo, zapomnij o OSie który ubija globalne przerwania na czas pracy schedulera. Albo ręcznie modyfikujesz obsługę SysTicka...

    Jeśli potrzebujesz precyzyjny sekwencer do sterowania jakims pinem uzyj DMA+timer. Rozwiązanie jest trudne do ogarnięcia, ale skuteczne i bardzo precyzyjne. Jesli jestes zainteresowany tym patentem to mogę to opisać.

    1
  • #9 17 Cze 2015 00:09
    domelfm
    Poziom 16  

    sorry za tak późne odpisanie ale temat nadal aktualny :). Jeżeli chodzi o temat pracy mgr to zmieniłem procesor na atmege 2560 i sobie poradziłem . Ale jestem nadal głodny wiedzy w wykorzystaniu stm32 :)

    0