Strona 1 z 1

[STM32F4] DMA z pamieci do peryferia

: niedziela 19 mar 2017, 21:35
autor: RafPe
Witam wszystkich,

Przerabiam kolejne rozdzialy poradnika o STM32 i probuje swoich sil z DMA. Skonfigurowalem sobie prosty program , ktory powienen wyslac mi z pamieci do USART moje dane. Niestety wysyla mi tylko pierwszy znak x34 razy :/ Wiec na 100% gdzies mam blad w konfiguracji. Gdyby ktos moglby mi podpowiedziec byloby super

Kod: Zaznacz cały

int main(void)
{

   rcc_init();
   mco_init();

   /* globale Variable */
   char buffer[] = "Hello world, this is a DMA test!\n";
   size_t buffer_size = sizeof(buffer);


   DMA1_Stream6->PAR  = (uint32_t)&USART2->DR;       // Peripherial address
   DMA1_Stream6->M0AR = (uint32_t)&buffer;          // Memory address
   DMA1_Stream6->NDTR = buffer_size;                     // Number of data items to transfer

   DMA1_Stream6->CR = DMA_SxCR_CHSEL_2 |           // Stream 6 - channel 4
                  DMA_SxCR_DIR_0   ;       // Memory to peripherial


        DMA1_Stream6->CR |= DMA_SxCR_EN;



   GPIOA->MODER |= GPIO_MODER_MODER2_1 |   // AF: PA2 => USART2_TX
               GPIO_MODER_MODER3_1;    // AF: PA3 => USART2_RX
   GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2|
                 GPIO_OSPEEDER_OSPEEDR3;

   GPIOA->AFR[0] |= ( 0b0111 << 8  ) | ( 0b0111 << 12); // PA2/PA3 => AF7


   USART2->BRR = 42000000/230400;
   USART2->CR1 = USART_CR1_UE |               // Enable
//              USART_CR1_RXNEIE |   // RX Interrupt
              USART_CR1_TE |            // Transmitter enable
              USART_CR1_RE;      // Receiver enable

   //NVIC_EnableIRQ(USART2_IRQn);      // USART IRQ Enabled

   USART2->CR3 |= USART_CR3_DMAT;




   while(1)
   {

   }
}


Re: [STM32F4] DMA z pamieci do peryferia

: niedziela 19 mar 2017, 21:37
autor: Antystatyczny
W konfiguracji musisz włączyć opcję autoinkrementację adresu źródłowego. Tak na szybko nie widze tego u Ciebie w kodzie.

Re: [STM32F4] DMA z pamieci do peryferia

: niedziela 19 mar 2017, 22:02
autor: RafPe
@Antystatyczny: dokladnie miales racje - "patrzalem" w RM i jakos "mnie to umknelo" - wydawalo mi sie ze "magicznie" z domyslu to jest to wlaczone.

Zmodyfikowalem kod i zmniejszylem bufor o ostatni znak bo mnie smieciosa wysylal i teraz pieknie smiga ;)

Kod: Zaznacz cały

   DMA1_Stream6->NDTR = buffer_size-1;             // Number of data items to transfer

   DMA1_Stream6->CR = DMA_SxCR_CHSEL_2 |
                  DMA_SxCR_MINC    |
                  DMA_SxCR_DIR_0   ;         // Memory to peripherial


Dzieki!

Re: [STM32F4] DMA z pamieci do peryferia

: niedziela 19 mar 2017, 23:11
autor: mokrowski
Spokojnie.. nie jestem purystą językowym. Sam "zapodywuję" różne interesujące wyrażenia ale ujmuję je w znaki "". Proszę popraw "patrzałem" i "mnie to umknęło" i zapisuj to w cudzysłowie :-) Razi...

Re: [STM32F4] DMA z pamieci do peryferia

: poniedziałek 20 mar 2017, 08:46
autor: RafPe
Rzeczywiscie - jak przeczytac z lepszym zrozumieniem to razi :O Z ciekawosci poszukalem w internecie i znalazlem

Patrzałem to forma wciąż poprawna, choć przestarzała


Hehehe - az czlowiek czuje sie z innej epoki :)