Skocz do zawartości
arasu

Ustawienie DMA do wyciagania pojedynczego wyniku konwersji ADC po każdym jej zakończeniu

Pomocna odpowiedź

Czesc,

Od kilku tygodni probuje napisac na stm32f103 rejestrator glosu z zapisem na karte SD. Chce do tego uzyc ADC z triggerem od TIM3, zeby probkowac z odpowiednia czestotliwoscia, i DMA(potrzebuje sie tego nauczyc pod katem obslugi kamerki CMOS). Brudna robote z generowaniem kodu wykonal za mnie Cube IDE. Poza tym stworzylem dwa bufory na dane, tak zeby nimi zonglowac pomiedzy ADC i DMA uint8_t buf[2][BUFF_SIZE];

uint8_t buf[2][BUFF_SIZE];

Teraz w main odpalam DMA razem z ADC i mowie gdzie maja wszystkie dane ladowac i ile tego ma tam byc ( tam wyzej BUFF_SIZE ma 512 byte)

HAL_ADC_Start_DMA(&hadc1, (uint8_t*)buf, 1024);

Teraz mam 3 callbacki, ktore sprawdzam debugerem i tutaj dzieje sie cos czego nie rozumiem.
 

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc){
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){

Tutaj jeszcze musze powiedziec, poza pierwszym timerem TIM3, ktory uzywam do odpalanie konwersji ADC, uzywam tez osobnego TIM4 do sprawdzania ile mam zrobionych konwersji dla danego okresu czasu. Ustawilem TIM3 na 8khz i TIM4 na 100hz, co przy przepelnieniu TIM4 powinno dac (albo moze chcialbym zeby dalo) 80 konwersji ADC, czyli 80 wartosci w buf[0], ale tak niestety nie jest.
Przy ustawieniu breakpoint na HAL_ADC_ConvCpltCallback i zlapaniu tam programu drugi raz mam juz zapelnione obie tablice buf[0] i buf[1], co mnie dziwi bo myslalem ze DMA bedzie czekac na kazda konwersje ADC i po kazdej z tych konwersji bedzie kopiowac pojedyncza wartosc do wskazanej tablicy.
Czy jest cos zle w tym co pokazalem, czy moze seria F1 nie jest zdolna do tego co bym chcial? Widzialem w poradnikach do serii F4 dla ADC pole DMA Continuous Requests, dla F1 tego niestety nie widze i zastanawia mnie czy to nie jest ten moj brakujacy puzzel.

Zalaczam screeny z konfiguracja cubemx.

Pozdrawiam

image.thumb.png.fd95d7200a309a190e741e9f595f4185.pngimage.thumb.png.e343003c7bb897a15d30629cf1830ef4.png

Edytowano przez arasu

Udostępnij ten post


Link to post
Share on other sites

Bo DMA czeka na każdą konwersję 🙂 Zobacz w kod HALa, ale wydaje mi się ,że Callback od zakończenia po prostu wywołuje się po zakończeniu n próbek tak, jak mu podałeś. Oczywiście jeśli włączyłeś przerwanie ADC to po każdej konwersji wchodzi do HALowej obsługi przerwania i sobie dekrementuje jakieś zmienne licznikowe 🙂 Zobacz kto i kiedy woła Callback, a się dowiesz jak on działa.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dzieki za odpowiedz, okazalo sie ze debuger w STM Cube ide nie zatrzymuje timerow i wartosci rejestru docelowego DMA nie jest aktualna na zlapanym breakpoint. Druga sprawa, okazalo  sie ze przy podlaczeniu DMA z ADC przerwanie HAL_ADC_ConvCpltCallback juz nie bedzie obslugiwac zakonczenia pojedynczej konwersji, a zakonczenie wypelniania calego bufora docelowego.

Ale pojawilo sie u mnie kolejne pytanie z DMA, chcialbym zeby moj docelowy bufor byl 8bitowy, dlatego ADC chce miec z przesunieciem danych do lewej strony [ dddd dddd dddd xxxx], dokumentacja sugeruje ze tak sie nie da, ale moze ja czegos nie doczytalem albo sa jakies sposoby na to? Chcialbym zeby DMA juz przygotowalo mi odrazu gotowy bufor do wyslania przez SPI, bez potrzeby procesowania go przez uC.
  

image.thumb.png.2c762418fe612794460fc27a245217b2.png

 

Edytowano przez arasu

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!

Anonim
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...