Skocz do zawartości
Komentator

Kurs STM32 F4 - #8 - Zaawansowane funkcje liczników

Pomocna odpowiedź

Witam,

W jednym miejscu coś mi się nie zgadza, kiedy jest fragment artykułu, gdzie jest generowanie sygnału PWM z wykorzystaniem DMA użyta jest funkcja:

HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_3, &Duty, 1);

Gdzie zmienna Duty jest typu uint16_t, natomiast funkcja HAL_TIM_PWM_START_DMA wymaga wskaźnika na uint32_t :

HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);

Zatem czy jeśli chcemy żeby zmienna Duty pozostała uint16_t, nie powinno się zrobić następującego rzutowania :

HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_3,(uint16_t*) &Duty, 1);

?

Udostępnij ten post


Link to post
Share on other sites

@PiotrPierPeter witam na forum 🙂

@Elvis, doradzisz w tej kwestii? Wołam Cie, bo wiem, że niedawno analizowałeś dokładniej ten kurs 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Jestem w tej chwili w pracy i nie mam dostępu do CubeMX - mogę więcej napisać wieczorem, teraz napiszę tak "z głowy", bez kodu i testowania.

W programie widzimy że Duty ma typ uint16_t, natomiast HAL_TIM_PWM_Start oczekuje wskaźnika do uint32_t. W rzeczywistości jest to błąd, albo chociaż niedoskonałość biblioteki HAL - w końcu za pomocą DMA można przesyłać różne typy danych, nie tylko uint32_t. Poprawnie zaprojektowane biblioteki (przykładowo zgodne z POSIX) używają w takim przypadku typu void*. Ale ktoś, kto projektował Cube HAL chciał być bardziej poprawny i użył uint32_t...

Typ wskaźników w rzeczywistości nie ma większego znaczenia - stąd w C częste użycie void* chociażby w funkcjach systemowych - read, write itd.

Nie testowałem, ale poprawnie program powinien wyglądać raczej tak:

HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_3, (uin32_t*) &Duty, 1);

W tej wersji po prostu informujemy kompilator że wiemy co robimy i specjalnie zmieniamy typ wskaźnika - co kompilator powinien uszanować i wyłączyć ostrzeżenie.

Natomiast jak napisałem na początku - obie wersje działają tak samo, a ze zmienną Duty nic złego się nie dzieje.

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

@PiotrPierPeter super, że problem rozwiązany. Powodzenia w dalszych eksperymentach!

PS Pamiętaj, że pomocne posty można odpowiednio oceniać (ikona serca w prawym dolnym rogu wiadomości). Dzięki temu można podziękować bezpośrednio autorowi i (co czasami ważniejsze) wyróżnić daną odpowiedź, aby inni widzieli od razu, że jest ona rozwiązaniem opisywanego problemu. Zachęcam do korzystania z tej opcji 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...