Skip to main content
NSing.5
Associate III
March 8, 2023
Question

HAL_UART_Transmit_DMA

  • March 8, 2023
  • 5 replies
  • 1513 views

i'veA question related to transmission using DMA. i'm facing a strange situation.

  1. it works perfectly when i use "HAL_UART_Transmit_DMA(&huart1, TxBuf, 5);" in the main program.
  2. However in my project i've crated a separate file for my application program, which i include in the main program, and when i call "HAL_UART_Transmit_DMA(&huart1, TxBuf, 5);" from my application program, only first two bytes are transferred as per my data rest all bytes are corrupted.

This topic has been closed for replies.

5 replies

Aymen ABBES
ST Employee
March 8, 2023

Hello @NSing.5​ ,

Thanks for sharing this issue. 

To further analyze your problem could you please provide:

  • The MCU you are using
  • The CubeMx and you IDE versions
  • The project you are working on or your *.ioc file if it is possible

Kind regards,

Aymen

NSing.5
NSing.5Author
Associate III
March 9, 2023

The project file is attached with for your reference. i'm working on STM32F730

gbm
Super User
March 8, 2023

Show the declaration of TxBuf (where exactly is it declared?) and check its usage (timing). You cannot write a new value to TxBuf until the transfer is finished.

My STM32 stuff on github - compact USB device stack and more: https://github.com/gbm-ii/gbmUSBdevice
NSing.5
NSing.5Author
Associate III
March 9, 2023

TxBuf is declared as local variable in the function that calls HAL_UART_Transmit_DMA(&huart1, TxBuf, 5); as follows:

void mstr_digno(uint8_t Device_address,uint16_t sub_code)
{
 uint8_t TxBuf[25];
 uint16_t crc_value=0;
 TxBuf[0] = Device_address;
 TxBuf[1] = 0x08; //operation code
 convert_I_To_Byte(sub_code);
 TxBuf[2] = IntegerToByte.high_byte;
 TxBuf[3] = IntegerToByte.low_byte;
 convert_I_To_Byte(Device_address);
 TxBuf[4] = IntegerToByte.high_byte;
 TxBuf[5] = IntegerToByte.low_byte;
 crc_value = CRC_Cal_Value(TxBuf,5);
 crc_value = crc_value&0xFFFF;
 convert_I_To_Byte(crc_value);
 TxBuf[6]=IntegerToByte.low_byte;
 TxBuf[7]=IntegerToByte.high_byte;
 //HAL_UART_Transmit_DMA(&huart1, TxBuf, 10);
 HAL_UART_Transmit(&huart1, TxBuf, 10,10);
}

i'm writing new data to it after 2 seconds.

waclawek.jan
Super User
March 8, 2023