Skip to main content
DPate.5
Visitor II
November 8, 2021
Question

STM32H725VGT6 UART DMA Receive not working

  • November 8, 2021
  • 3 replies
  • 909 views

Hello,

As mentioned in DMA is not working on STM32H7 devices

I applied solution before DMA receive

SCB_InvalidateDCache_by_Addr((uint32_t*)(((uint32_t)rx_buffer) & ~(uint32_t)0x1F), RX_LENGTH+32);

but it just get stuck in this instruction and not executing anything after this instruction

below is my code for reference

uint32_t Recbuf[10] __attribute__ ((aligned (32)));

int main(void)

{

 /* USER CODE BEGIN 1 */

 /* USER CODE END 1 */

 /* Enable I-Cache---------------------------------------------------------*/

 SCB_EnableICache();

 /* Enable D-Cache---------------------------------------------------------*/

 SCB_EnableDCache();

 /* 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_DMA_Init();

 MX_DFSDM1_Init();

 MX_USART3_UART_Init();

 MX_UART5_Init();

 MX_CRC_Init();

 MX_UART4_Init();

 MX_UART7_Init();

 MX_X_CUBE_AI_Init();

 /* USER CODE BEGIN 2 */

 void v_Set_to_Receive_From_UARTP(void){

SCB_InvalidateDCache_by_Addr((uint32_t*)(((uint32_t)Recbuf) & ~(uint32_t)0x1F), sizeof(Recbuf));

HAL_UART_Receive_DMA(&huart3, (uint8_t *)&Recbuf,10);

}

 while (1)

 {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

 }

 /* USER CODE END 3 */

}

This topic has been closed for replies.

3 replies

TDK
Super User
November 8, 2021

You didn't call SCB_InvalidateDCache_by_Addr or HAL_UART_Receive_DMA. You just defined a function which calls it from within the main() function, which is weird. But you don't call that function anywhere. Take out the v_Set_to_Receive_From_UARTP line and the closing bracket.

"If you feel a post has answered your question, please click ""Accept as Solution""."
Tesla DeLorean
Guru
November 8, 2021

Does it Hard Fault?

Seems some inconsistencies in byte/word sizing of things. Make the data areas large enough that things before/after are not involved.

One should probably very carefully unpack the addresses being used and the span/scope of the invalidate.

DMA has expectations about the memory ranges used. Make sure you're using a region that the DMA can use, and that it's now throwing errors or status warnings.

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
T J
Senior III
November 10, 2021

you have to move the function declaration out of the main init sequence...

you should call it from init..

uint32_t Recbuf[10] __attribute__ ((aligned (32)));
 
void v_Set_to_Receive_From_UARTP(void)
{
 SCB_InvalidateDCache_by_Addr((uint32_t*)(((uint32_t)Recbuf) & ~(uint32_t)0x1F), sizeof(Recbuf));
 HAL_UART_Receive_DMA(&huart3, (uint8_t *)&Recbuf,10);
}
 
int main(void)
{
 
 /* USER CODE BEGIN 1 */
 
 
 
 /* USER CODE END 1 */
 
 
 
 /* Enable I-Cache---------------------------------------------------------*/
 
 SCB_EnableICache();
 
 
 
 /* Enable D-Cache---------------------------------------------------------*/
 
 SCB_EnableDCache();
 
 
 
 /* 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_DMA_Init();
 
 MX_DFSDM1_Init();
 
 MX_USART3_UART_Init();
 
 MX_UART5_Init();
 
 MX_CRC_Init();
 
 MX_UART4_Init();
 
 MX_UART7_Init();
 
 MX_X_CUBE_AI_Init();
 
 /* USER CODE BEGIN 2 */
 
 
 
 
v_Set_to_Receive_From_UARTP();
 
 
 while (1)
 
 {
 
 /* USER CODE END WHILE */
 
 
 
 /* USER CODE BEGIN 3 */
 
 }
 
 /* USER CODE END 3 */
 
}