Skocz do zawartości

aldenham

Użytkownicy
  • Zawartość

    13
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

aldenham wygrał w ostatnim dniu 28 sierpnia 2019

aldenham ma najbardziej lubianą zawartość!

Reputacja

6 Neutralna

O aldenham

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. @Leonardtb Dobrze, że mówisz, w kolejnej przypadłości na pewno się przyda. Pewnie bym się tak łatwo nie domyślił. Możliwe, że akurat miałem zaznaczony projekt i dlatego zadziałało.
  2. @fullkozod Odświeżam temat. Spróbuj w tym miejscu (project properties > C/C++ Build > Setings > Tool Settings (TAB) > MCU GCC Linker > Miscellaneous > Linker flags) dodać w Linker flags flagę -u _printf_float. U mnie działa.
  3. @Elvis Już doszedłem z wszystkim do ładu, dzięki za pomoc. Przy wyświetlaniu wartości dowolnego z elementów zmiennych tablicowych src/dst_buffer, %u załatwia sprawę. Wcześniej kompilator wyświetlał ostrzeżenie przy próbie wyświetlenia adresu tablicy (tutaj np. z użyciem formatowania %u): warning: format '%u' expects argument of type 'unsigned int', but argument 2 has type 'uint8_t * {aka unsigned char *}' [-Wformat=] W ogóle ten kurs i wasza pomoc na forum to świetna sprawa. Pewne tematy wydają się oczywiste, ale człowiek uczy się na błędach. Gdybym na pytania otrzymał odpowiedzi typu: "poczytaj w necie", albo "nie znasz się", to pewnie bym się zniechęcił do dalszej nauki. W polskiej części internetu nie ma drugiego takiego miejsca, w którym można tyle się nauczyć i otrzymać odpowiedź na tyle pytań związanych z STM32. Także naprawdę wielki szacunek dla waszej wiedzy i ogromne dzięki za pomoc!
  4. @miszczu18 Dzięki, po dobrze przespanej nocy właśnie się zorientowałem, co zrobiłem, tzn. że wykroczyłem poza zakres tablicy. @Elvis Masz rację, niepotrzebnie pytałem o to w komentarzach do kursu. Kończę ten temat.
  5. @Elvis Ok, to zadam trochę inne pytanie. W zadaniu 8.1 mamy wyświetlić wartości zmiennych src_buffer i dst_buffer po wykonaniu kolejno funkcji copy_cpu() i copy_dma(). Zrobiłem to tym razem trochę inaczej. Nadmienię, że nie zmieniałem nic w kodzie funkcji copy_cpu() i copy_dma(). // wypelniamy bufor przykladowymi danymi for (i = 0; i < BUFFER_SIZE; i++) src_buffer[i] = 100 + i; copy_cpu(); printf("src_buffer z copy_cpu: %d\n", src_buffer[BUFFER_SIZE]); printf("dst_buffer z copy_cpu: %d\n", dst_buffer[BUFFER_SIZE]); copy_dma(); printf("src_buffer z copy_dma: %d\n", src_buffer[BUFFER_SIZE]); printf("dst_buffer z copy_dma: %d\n", dst_buffer[BUFFER_SIZE]); Otrzymuję takie wyniki: src_buffer z copy_cpu: 100 dst_buffer z copy_cpu: 0 src_buffer z copy_dma: 100 dst_buffer z copy_dma: 0 Z tego, co piszesz, to wyświetlałem wcześniej adresy zmiennych src_buffer i dst_buffer. Wtedy kod wyglądał tak: // wypelniamy bufor przykladowymi danymi for (i = 0; i < BUFFER_SIZE; i++) src_buffer[i] = 100 + i; copy_cpu(); printf("src_buffer z copy_cpu: %d\n", src_buffer); printf("dst_buffer z copy_cpu: %d\n", dst_buffer); copy_dma(); printf("src_buffer z copy_dma: %d\n", src_buffer); printf("dst_buffer z copy_dma: %d\n", dst_buffer); Co tak naprawdę wyświetlam w tych przykładach? Wygląda mi to bardziej na wartość elementu zerowego zmiennych tablicowych src_buffer i dst_buffer. Czy naprawdę poprzednio wyświetlałem adresy zmiennych src_buffer i dst_buffer? Skoro wartości src_buffer i dst_buffer różniły się o 32, to wygląda mi to bardziej na różnicę ilości elementów tablicy (bo BUFFER_SIZE == 32).
  6. @Elvis Fakt, trochę zakręciłem. Chodzi mi o to, że funkcje copy_cpu() i copy_dma() dają takie same wyniki. A wyniki są takie, jak umieściłem powyżej, czyli Bufor zrodlowy: 536873560 Bufor docelowy: 536873592 Jak widać wartości obu buforów nie są równe I przy okazji ponawiam pytanie o formatowanie w printf - jak formatować zmienne typu uint8_t i uint16_t?
  7. Poniższe pytanie zostało wydzielone z kursu: https://forbot.pl/forum/topic/10506-kurs-stm32-f1-hal-8-bezposredni-dostep-do-pamieci/ Witam W zadaniu 8.1 wyniki z copy_cpu() i copy_dma() mam jednakowe i są następujące: Bufor zrodlowy: 536873560 Bufor docelowy: 536873592 Jak widać, wartości są różne. W ogóle wyświetlam wartości src_buffer i dst_buffer za pomocą printf. Jakiego formatu używać do wyświetlania liczb typu uint8_t albo uint16_t, bo %d zwraca ostrzeżenia.
  8. @Elvis Nie gniewam się oczywiście, a przyznaję, że często muszę zaglądać do podstaw kursu. I jednocześnie odgrzewam temat po dłuższym czasie. Problem ogarnąłem, ale skorzystałem z makra __HAL_TIM_SET_COMPARE 1) Zastanawiam się jednak, czy da radę sterować jasnością diody wyłącznie sprzętowo, nie z poziomu pętli głównej programu while(1). Np. czy można zaimplementować sterowanie diodą RGB pokazane w kursie całkowicie sprzętowo, pozostawiając moc procesora wolną na inne obliczenia? Jeśli nie przez samo PWM, to może przez DMA? ------------------------------------------------------------------------------ 2) W ogóle kurs jest obszerny, ale brakuje mi trochę wyjaśnienia, co robią poszczególne makra, albo jakie dokładnie zmienne pisać w . Np. właśnie powyższe makro __HAL_TIM_SET_COMPARE jest teoretycznie opisane w instrukcji, a szczegóły są w dokumentacji projektu (HAL_Driver), jednak czytając pewne rzeczy nadal mam wątpliwości, skąd się biorą. Nie będę udawał, że wszystko jest dla mnie oczywiste, bo nie jest. Możecie polecić jakąś dodatkową lekturę, która opisze makra od podszewki? Ten kurs jest naprawdę dobry i bez tego nie wiedziałbym nic, ale fajnie byłoby wiedzieć trochę więcej. Inny przykład, HAL_TIM_PWM_ConfigChannel. W instrukcji rozpisany jest jako HAL_TIM_PWM_ConfigChannel (TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel) a gdy już piszę kod, to wygląda on np. tak HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_1); Czy dobrze rozumiem, że wskaźniki *htim i *sConfig zadeklarowane są w przykładach w kursu jako odpowiednio tim4 i oc? I mogę ewentualnie zamiast tim4 i oc użyć innych dowolnych nazw (oczywiście później muszę odpowiednio do nich odnosić się w kolejnych pozycjach danej struktury)? TIM_CHANNEL_1 jest rzeczywiście podany w instrukcji jako wybór kanału 1, także to jest jasne. Swoją drogą gdybym miał uczyć się programowania stm32 od zera korzystając tylko z dokumentacji, to na pewno i ja, i wielu innych śmiałków by się zniechęciło. Także jeszcze raz brawa i szacunek za ten kurs.
  9. @Elvis Myślę, że do tak prostych podstaw nie muszę się cofać Rozumiem, co oznacza operator przypisania i wiem, czym różni się np. od operatora ==. Poza tym jakoś dotarłem do tego momentu w kursie rozwiązując wszystkie wcześniejsze zadania, czyli coś tam musiałem umieć zaprogramować. Dotarłem trochę dalej w moich przemyśleniach i wykoncypowałem, żeby rzeczywiście przypisać wartość do oc.Pulse w pętli while(1) (nie wiem, dlaczego wcześniej tak nie zrobiłem). Kod wygląda teraz tak i działa częściowo: tim4.Instance = TIM4; tim4.Init.Period = 1000 - 1; tim4.Init.Prescaler = 8 - 1; tim4.Init.ClockDivision = 0; tim4.Init.CounterMode = TIM_COUNTERMODE_UP; tim4.Init.RepetitionCounter = 0; tim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(&tim4); TIM_OC_InitTypeDef oc; oc.OCMode = TIM_OCMODE_PWM1; oc.OCPolarity = TIM_OCPOLARITY_HIGH; oc.OCNPolarity = TIM_OCNPOLARITY_LOW; oc.OCFastMode = TIM_OCFAST_ENABLE; oc.OCIdleState = TIM_OCIDLESTATE_SET; oc.OCNIdleState = TIM_OCNIDLESTATE_RESET; oc.Pulse = pulseval2; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_2); oc.Pulse = pulseval3; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_3); oc.Pulse = pulseval4; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_4); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_4); pulseval1 = 0; while (1) { while(pulseval1 <= 999) { pulseval1++; } oc.Pulse = pulseval1; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_1); } Skupiłem się tutaj póki co tylko na kanale 1 i nie usuwałem kodu dla pozostałych kanałów. Pewnie działałoby to też bez zmiennej pulseval1, ale stwierdziłem, że bezpieczniej jest sterować jej wartością, a później przypisać jej wartość do oc.Pulse i dalej wstawić do kanału 1. Rzeczywiście taki kod uruchamia diodę, ale nie powoduje "łagodnego narastania". Wygląda to tak, jakby oc.Pulse osiągało od razu wypełnienie graniczne z pętli, czyli tutaj wartość 999 (na razie dla testu pętla miała liczyć tylko w górę). while(pulseval1 <= 999) Na pewno mam gdzieś prosty błąd, którego nie widzę, a jest oczywisty dla Ciebie @Elvis, czy kogokolwiek z większym doświadczeniem, niż moje. Będę wdzięczny za podpowiedź, nie rozwiązanie (chciałbym dojść do tego w pewnym stopniu sam).
  10. Ok, to jak rozwiązać zadanie 7.4? Próbowałem przypisać do oc.Pulse wartość zmiennej 32 bitowej (np. pulseval1) i sterować jej wartością w pętli od 0 do 999, ale to nie działa. Umieściłem zmienną pulseval1 wewnątrz while(1), ale wartość oc.Pulse się nie aktualizuje. Czego mi brakuje? Bo przypisanie wartości (ale stałej) do zmiennej pulseval1 poza while(1) zmienia wartość oc.Pulse. Poniżej fragment kodu, który nie działa. TIM_OC_InitTypeDef oc; oc.OCMode = TIM_OCMODE_PWM1; oc.Pulse = pulseval1; oc.OCPolarity = TIM_OCPOLARITY_HIGH; oc.OCNPolarity = TIM_OCNPOLARITY_LOW; oc.OCFastMode = TIM_OCFAST_ENABLE; oc.OCIdleState = TIM_OCIDLESTATE_SET; oc.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_1); oc.Pulse = pulseval2; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_2); oc.Pulse = pulseval3; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_3); oc.Pulse = pulseval4; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_4); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_4); while (1) { pulseval1 = 500; } } Czy da się w ogóle dynamicznie zmienić wartość oc.Pulse z pętli while(1) korzystając ze sprzętowego PWM?
  11. @MR1979 Kolego, dziękuję bardzo za tego posta - miałem dokładnie taką samą sytuację i wyzerowanie adc pomogło.
  12. @Elvis Dzięki za porady. Z tym \0 oczywiście byłem świadomy, tylko niezbyt wyraźnie napisałem, o co mi chodzi. Stwierdziłem, że trochę szkoda zajmować się rozwiązaniem, z którego w przyszłości i tak nie będę korzystał, bo przeniosę pewnie kod na DMA
  13. Witam Niestety również mam problem z zadaniem #5.2. Na pewno mam zbyt małą wiedze nt. programowania w C, a szczególnie nt. STM32, ale dotychczas wszystkie zadania wykonywałem bez problemu. 1) Po pierwsze nurtuje mnie jedna rzecz - w instrukcji HAL w opisie funkcji HAL_UART_Receive podane są takie instrukcje. (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout) Wychodzi na to, że w przykładzie zmienna value musi być typu uint8_t i tak rzeczywiście jest. Zastanawia mnie, jak to jest, że w instrukcji switch oczekiwany jest znak (char), a w funkcji deklarowany jest int (uint8_t). Czy jest to rzutowanie? To w takim razie dlaczego jeśli próbuję odczytać z value łańcuch znaków, kompilator pokazuje type mismatch jeszcze przed próbą kompilacji? Zastosowanie strcmp(value, moja_zmienna_tablicowa_typu_char) również jest dla kompilatora błędna, bo traktuje value jako uint8_t. Kod napisany przez kolegę Wierczewskiego nie powinien się skompilować (nie sprawdzałem), bo zadeklarował value jako char, podczas gdy HAL_UART_Receive oczekiwało w tym miejscu zmiennej typu uint8_t. 2) To jak w końcu napisać tę funkcję tak, żeby zadziałała? Czy ilość danych do odbioru (uint16_t Size w dokumentacji HAL) powinna być ustawiona na 3 (lub 4) zamiast 1, jeśli chcę odebrać łańcuch o długości 4 znaków? Nie oczekuję gotowego rozwiązania, ale liczę na "ciekawą" podpowiedź
×
×
  • Utwórz nowe...