Skip to main content
Explorer
December 19, 2024
Solved

STM32U575 GPDMA1 Configuration Problem

  • December 19, 2024
  • 2 replies
  • 870 views

Hello,

I have a board with a STM32U575RGTX CPU, and i use SPI1 with a 2.8" TFT ILI9341 Display.
I got problems with the GPDMA1 configuration, and need help.

main.c:

 

 

int main(void)
{

 /* USER CODE BEGIN 1 */

 /* USER CODE END 1 */

 /* MCU Configuration--------------------------------------------------------*/

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */
 SystemClock_Config();

 /* USER CODE BEGIN SysInit */

 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_GPDMA1_Init();
 MX_CRC_Init();
 MX_TIM2_Init();
 MX_SPI1_Init();
 MX_ICACHE_Init();
 /* USER CODE BEGIN 2 */

 _lcd = ili9341_new(&hspi1, LCD_RESET_GPIO_Port, LCD_RESET_Pin, LCD_NSS_GPIO_Port, LCD_NSS_Pin, LCD_DC_GPIO_Port, LCD_DC_Pin, isoLandscape, LCD_CS_GPIO_Port,LCD_CS_Pin, LCD_IRQ_GPIO_Port, LCD_IRQ_Pin, itsNONE, itnNormalized);
 ili9341_fill_screen(_lcd, ILI9341_RED); // FILL SCREEN RED
 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */
 }
 /* USER CODE END 3 */
}

 

 

ILI9341:

 

 

void ili9341_fill_screen(ili9341_t *lcd, ili9341_color_t color)
{
 ili9341_fill_rect(lcd, color,
 0, 0, lcd->screen_size.width, lcd->screen_size.height);
}

void ili9341_fill_rect(ili9341_t *lcd, ili9341_color_t color,
 int16_t x, int16_t y, uint16_t w, uint16_t h)
{
 // verify we have something within screen dimensions to be drawn
 if (ibNOT(ili9341_clip_rect(lcd, &x, &y, &w, &h)))
 { return; }

 uint32_t num_pixels = w * h;
 uint32_t rect_wc = num_pixels;

 uint32_t block_wc = rect_wc;
 if (block_wc > __SPI_TX_BLOCK_MAX__)
 { block_wc = __SPI_TX_BLOCK_MAX__; }

 // fill entire block with ordered color data
 uint16_t color_le = __LEu16(&color);
 for (uint16_t i = 0; i < block_wc; ++i)
 { spi_tx_block[i] = color_le; }

 // select target region
 ili9341_spi_tft_set_address_rect(lcd, x, y, (x + w - 1), (y + h - 1));
 ili9341_spi_tft_select(lcd);

 HAL_GPIO_WritePin(lcd->data_command_port, lcd->data_command_pin, __GPIO_PIN_SET__);

 // repeatedly send MIN(remaining-words, block-words) words of color data until
 // all rect words have been sent.
 uint32_t curr_wc;
 while (rect_wc > 0) {
 curr_wc = rect_wc;
 if (curr_wc > block_wc)
 { curr_wc = block_wc; }
 ili9341_transmit_color(lcd, curr_wc * 2/*16-bit words*/, spi_tx_block, ibYes);
 rect_wc -= curr_wc;
 }

 ili9341_spi_tft_release(lcd);
}

void ili9341_transmit_color(ili9341_t *lcd, uint16_t size, uint16_t color[]/* already byte-swapped (LE) */, ili9341_bool_t wait)
{
 if ((NULL == lcd) || (0 == size) || (NULL == color))
 { return; }
 HAL_SPI_Transmit_DMA(lcd->spi_hal, (uint8_t *)color, size);
 if (ibOK(wait))
 { ili9341_transmit_wait(lcd); }
}

 

 

When i use HAL_SPI_Transmit_DMA, then the colors on the TFT are not correct (Red=Magenta,Green=Green,Blue=Black), if i change the code to HAL_SPI_Transmit without DMA, then the colors are correct... what can be wrong in my DMA Config?

Here is my config:

spi1.pngspi2.pngspi3.png

SPI is configured with 8-Bit and MSB.

    This topic has been closed for replies.
    Best answer by Imen.D

    Hello @Sany 

    Please follow the steps in this article to start your project and configure the GPDMA: 

    How to configure the GPDMA - STMicroelectronics Community

    2 replies

    Imen.DAnswer
    Technical Moderator
    December 19, 2024

    Hello @Sany 

    Please follow the steps in this article to start your project and configure the GPDMA: 

    How to configure the GPDMA - STMicroelectronics Community

    SanyAuthor
    Explorer
    December 19, 2024

    Hello @Imen.D ,

    Thanks for this Article, that helps me.

    my configuration for the GPDMA is correct, but i forgot to activate "Source Address Increment After Transfer" and changed the Data Width to Byte, and it works.