STM32H7 DMA konfiguracja

Język C dla mikrokontrolerów ARM
ODPOWIEDZ
kulfi27
Użytkownik
Posty: 13
Rejestracja: 28 mar 2018, 14:01

STM32H7 DMA konfiguracja

Post autor: kulfi27 » 06 sty 2019, 14:03

Witam, czy komuś z szanownych kolegów udało się poprawnie uruchomić UART z wykorzystaniem DMA w H7 bo za nic nie chce mi to zadziałać.
Sam UART4 działa mogę wysyłać dane, lecz za pośrednictwem DMA już nie. Projekt stworzony w Atolic po części z wykorzystaniem HAL. Wiem że samo DMA jest bardziej tak mi się wydaje skomplikowane niżeli w niższych rodzinach od ST jest więcej bajerów.
Poniżej konfiguracja UART i DMA
  1.      GPIO_InitTypeDef GPIO_InitStruct = {0};
  2.  
  3.         /* Peripheral clock enable */
  4.  
  5.         __HAL_RCC_D2SRAM1_CLK_ENABLE();
  6.  
  7.         __HAL_RCC_UART4_CLK_ENABLE();
  8.  
  9.        __HAL_RCC_GPIOA_CLK_ENABLE();
  10.  
  11.        __HAL_RCC_DMA1_CLK_ENABLE();
  12.  
  13.         /**UART4 GPIO Configuration
  14.         PA0     ------> UART4_TX
  15.         PA1     ------> UART4_RX
  16.         */
  17.           GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  18.           GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  19.           GPIO_InitStruct.Pull = GPIO_NOPULL;
  20.           GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  21.           GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
  22.           HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  23.  
  24.         /* UART4_TX Init */
  25.           UART4->BRR  =  100000000/115200;
  26.           UART4->CR3  =  USART_CR3_DMAT;
  27.           UART4->CR1  =  USART_CR1_TE|USART_CR1_UE;
  28.  
  29.           UART4->ISR  = 0;
  30.  
  31.  
  32.           DMA1_Stream1->CR &=  ~((uint32_t)DMA_SxCR_EN);
  33.           DMA1_Stream1->PAR   =  0;
  34.           DMA1_Stream1->M0AR  =  0;
  35.           DMA1_Stream1->NDTR  =  0;
  36.           DMA1_Stream1->FCR   =  0;
  37.           DMA1_Stream1->CR    =  0;
  38.  
  39.           DMA1_Stream1->PAR   = (uint32_t)(&UART4->TDR);
  40.           DMA1_Stream1->M0AR  = (uint32_t)(&UART_TxBuf);
  41.           DMA1_Stream1->NDTR  = 16;
  42.               DMA1_Stream1->CR    = DMA_SxCR_MINC|DMA_SxCR_DIR_0|DMA_SxCR_CIRC;
  43.  
  44.               DMAMUX1_Channel0->CCR=64U;
  45.  
  46.           DMA1_Stream1->CR    = DMA_SxCR_EN;
  47.      


Bufor UART_TxBuf zdefiniowany w pamięci SRAM_D1.

Awatar użytkownika
xbary
Użytkownik
Posty: 96
Rejestracja: 08 paź 2017, 19:59

Re: STM32H7 DMA konfiguracja

Post autor: xbary » 06 sty 2019, 15:42

Może moja podpowiedź nie będzie satysfakcjonująca, ale jest to częsty błąd jaki zaobserwowałem. Otóż moim zdaniem nie powinieneś mieszać stylu programowania mikrokontrolera, jeśli korzystasz z HAL to korzystaj z niego wszędzie gdzie masz zamiar ustawiać coś w rejestrach mikrokontrolera.
Biblioteki tego typu przeważnie mają swoje dodatkowe zmienne statusowe na podstawie których wyliczane są różne czasy częstotliwości(i inne baudy) i jeśli coś na surowo zmienisz w rejestrach uC i zaraz zaczniesz używać biblioteki to niestety nie można się spodziewać prawidłowego działania programu/aplikacji.

Oczywiście pomijam ten fakt że zdarzają się błędy w bibliotekach, ale myślę że to normalne, jak sam opracujesz procedury które surowo programują rejestry uC też się zdarzą błędy :)

kulfi27
Użytkownik
Posty: 13
Rejestracja: 28 mar 2018, 14:01

Re: STM32H7 DMA konfiguracja

Post autor: kulfi27 » 06 sty 2019, 17:04

Możliwe że masz racje choć nie zdarzyło mi się to np w F4 a trochę tam mieszałem. Wygenerowany kod z CubeMX również nie działa, wywaliłem biblioteki wszystka na rejestrach też nic zapewne coś pomijam. Doszukałem że problemem jest iż QMX jak i Atolic ustawia w skrypcie linkiera iż dane lądują w pamięci DTCMRAM z którą DMA1 nie jest połączone, dlatego utworzyłem makro dla ładowania danych w pamięci SRAM_D1
  1. #define SRAM_D1 __attribute__((section(".sram_d1")))
  2.  
  3. SRAM_D1 char UART_TxBuf[16]={"STM32H7 UART"};
Ale to też nie pomogło. Jeszcze gdzieś w przykładach znalazłem żeby włączyć Cache ale też nie pomogło, Muszę szukać dalej :(

ODPOWIEDZ