Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
Odbierz rabat na filament!

Kurs STM32 - #8 - DMA, czyli bezpośredni dostęp do pamięci

Autor Wiadomość
Komentator 




Posty: 865
Otrzymał 17 piw(a)
Wysłany: 03-11-2015, 13:31   Kurs STM32 - #8 - DMA, czyli bezpośredni dostęp do pamięci

KursSTM32_8
W części 6 kursu STM32 poznaliśmy możliwości przetwornika ADC. Uruchamiane przykłady były jednak niedoskonałe. Teraz poznamy nową, efektywną metodę. Zamiast aktywnie czekać na odczyt, wykorzystamy moduł DMA, który będzie robił to w tle.
UWAGA, to tylko wstęp!
Dalsza część artykułu dostępna jest na darmowym blogu Forbota.

Kliknij, aby przeczytać całość!


Poniżej znajdują się komentarze naszych użytkowników powiązane z tym artykułem.


Przeczytałeś artykuł? Dodaj komentarz!
Postaw piwo autorowi tego posta
 
 
poczciwy 



Posty: 9
Wysłany: 04-11-2015, 09:38   

No i zaczyna się robić ciekawie :)

Postaw piwo autorowi tego posta
 
 
pilawelo 



Posty: 1
Skąd: Radzionków
Wysłany: 10-11-2015, 15:42   

Mam pytanie, już jakiś czas szukam dokumentacji do tej biblioteki.
Niestety znalazłem tylko dokumentację do wersji 1.1 http://www.st.com/web/en/resource/technical/document/user_manual/DM00023896.pdf . W tym kursie korzystamy z wersji 3.6, bo taka ściąga się automatycznie przy tworzeniu projektu. Czy ST stworzyło dokumentację do wersji trzeciej?

Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1300
Pomógł: 92 razy
Otrzymał 244 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 12-11-2015, 09:13   

Jeśli pobierzesz bibliotekę niezależnie od OpenSTM32, w archiwum znajdziesz programy przykładowe oraz dokumentację wygenerowaną na podstawie kodu (DoxyGen). Poza tym zostaje czytanie dostępnych książek, wujek google oraz oczywiście kurs na Forbocie.
http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF257890#

Ostatnio zmieniony przez Elvis 12-11-2015, 09:15, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
gizmo5418 



Posty: 2
Wysłany: 14-11-2015, 14:36   

Witam

Sprawdziłem działanie kodu szybkości kopiowania CPU vs DMA u siebie i nie mogę zrozumieć pewnej rzeczy. Gdy program jest skompilowany w DEBUG czasy pokrywają się z tymi z fotki z artykułu. Natomiast gdy skompiluję jako RELEASE, wówczas sytuacja jest całkiem inna.

Czy jest mi ktoś w stanie to wyjaśnić ?

Na załączonej fotce - 2 pierwsze wpisy - kompilacja DEBUG, kolejne 2 - kompilacja RELEASE



Pozdrawiam

Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1300
Pomógł: 92 razy
Otrzymał 244 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 14-11-2015, 14:52   

Zadeklaruj bufor jako volatile i zobacz, czy wyniki nadal będą takie dziwne.

Postaw piwo autorowi tego posta
 
 
gizmo5418 



Posty: 2
Wysłany: 14-11-2015, 16:03   

Witam,

Zgodnie z sugestią bufory są teraz jako volatile. CPU = 62ms, DMA = 34ms

Pozdrawiam

Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1300
Pomógł: 92 razy
Otrzymał 244 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 14-11-2015, 16:36   

Problem z optymalizatorem jest taki, że może uznać pewne fragmenty programu za niepotrzebne... Prawdopodobnie uznał, że kopiujesz dane, ale ich nie używasz, więc można ten fragment programu usunąć... W przypadku typowych programów pracujących na komputerze stacjonarnym takie optymalizacje mogą oszczędzać sporo czasu procesora. Jednak w przypadku mikrokontrolerów są często źródłem problemów. Właśnie dlatego zmienne modyfikowane w przerwaniach powinny być oznaczane jako volatile. Inaczej optymalizator może uznać, że skoro wartości nie są zmieniane, to można zupełnie usunąć dostęp do nich.

Postaw piwo autorowi tego posta
 
 
Jcz_123 



Posty: 1
Wysłany: 14-10-2016, 08:52   

Witam
Próbuję poradzić sobie z zadaniem 8.3. Czy macie gotowy program?

Postaw piwo autorowi tego posta
 
 
argens 



Posty: 4
Skąd: Herford
Wysłany: 13-12-2016, 08:24   

Zad 8.1

Kod programu: Zaznacz cały
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "stm32f10x.h"

#define        BUFFER_SIZE            32

uint8_t        src_buffer[BUFFER_SIZE];
uint8_t        dst_buffer[BUFFER_SIZE];

/*---------------------------------------------------------------*/

void copy_cpu()
{
    int i;
    for (i = 0; i < BUFFER_SIZE;i++)
        dst_buffer[i] = src_buffer[i];
}

void copy_dma()
{
    DMA_Cmd(DMA1_Channel1, ENABLE);
    while (DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);
}

/*---------------------------------------------------------------*/

void send_char(char c)
{
    while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
    USART_SendData(USART2, c);
}

int __io_putchar(int c)
{
 if (c=='\n')
 send_char('\r');
 send_char(c);
 return c;
}

int main(void)
{
    USART_InitTypeDef uart;
    GPIO_InitTypeDef gpio;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    GPIO_StructInit(&gpio);
    gpio.GPIO_Pin = GPIO_Pin_2;
    gpio.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &gpio);

    gpio.GPIO_Pin = GPIO_Pin_3;
    gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &gpio);


    USART_StructInit(&uart);
    uart.USART_BaudRate = 115200;
    USART_Init(USART2, &uart);

    USART_Cmd(USART2, ENABLE);

    int i;
    DMA_InitTypeDef dma;

    DMA_StructInit(&dma);
    dma.DMA_PeripheralBaseAddr = (uint32_t)src_buffer;
    dma.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
    dma.DMA_MemoryBaseAddr = (uint32_t)dst_buffer;
    dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
    dma.DMA_BufferSize = BUFFER_SIZE;
    dma.DMA_M2M = DMA_M2M_Enable;
    DMA_Init(DMA1_Channel1, &dma);

    // wypelniamy bufor przykladowymi danymi
    for (i = 0; i < BUFFER_SIZE; i++)
        src_buffer[i] = 100 + i;

    //copy_cpu();
    copy_dma();


         printf("Hello World!\n");

         if(strncmp ((const char*)src_buffer, (const char*)dst_buffer, BUFFER_SIZE) == 0)
         {
             printf("ALL OK\n");
         }
         else
         {
             printf("try again\n");
         }

    while(1)
    {

    }
}

Ostatnio zmieniony przez argens 13-12-2016, 08:24, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
TTakitani 



Posty: 4
Wysłany: 16-06-2017, 23:08   

W tego typu programach trzeba wprowadzac i konfigurowac wiele roznych modułów (GPIO, UART, DMA, NVIC itp).
Czy kolejność ich konfiguracji gra jakąś rolę?

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 21-06-2017, 19:37   

TTakitani, raczej nie (? - może ktoś bardziej doświadczony powie, że tak) :) Osobiście nie miałem nigdy takich problemów, ale robiłem zawsze to po kolei "na logikę". Czyli zanim konfigurowałem GPIO upewniałem się, że peryferia są uruchomione i odpowiednio taktowane itd.


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Kurs STM32 - #4 - St... Kurs STM32 - #1 - Za... Kurs STM32 - #2 - Po... Kurs Arduino - #8 - ...
lub przeszukaj forum po wybranych tagach: artykuly, elektronika, majsterkowanie, robotyka, wiadomosci


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki