AnsweredAssumed Answered

STM32 HAL UART DMA Tx doesnt call Interrupt-Functions

Question asked by Max Baeuml on Oct 1, 2017
Latest reply on Oct 1, 2017 by Max Baeuml

Hi @all

 

I would like to write a simple uart transmission using dma.

I see the transmitted data with a logic analyzer. All looks good.

 

But, Interrupt functions USART6_IRQHandler, DMA2_Stream7_IRQHandler, HAL_UART_TxCpltCallback, HAL_UART_TxHalfCpltCallback, doesn´t call.

If i suspend, the program ends every time in an infinite loop in file startup_stm32f446xx.s

 

I use a Nucleo F446RE

Can everybody help me?

 

Many thanks

 

Serial:

Serial

 

Infinite Loop:

Loop

 

Code:

 

#include "stm32f4xx.h"
#include "stm32f4xx_nucleo.h"

 

#define BAUDRATE 115200
#define TXPIN GPIO_PIN_6
#define DATAPORT_TX GPIOC

 

UART_HandleTypeDef        huart1;
DMA_HandleTypeDef         hdma_usart1_tx;

 

int main(void)
{
         if( HAL_Init() != HAL_OK){
               for(;;);
         }

         

         //init GPIO
         __GPIOC_CLK_ENABLE();
         GPIO_InitTypeDef GPIO_InitStruct;
         GPIO_InitStruct.Pin = TXPIN;
         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
         GPIO_InitStruct.Pull = GPIO_NOPULL;
         GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
         GPIO_InitStruct.Alternate = GPIO_AF8_USART6;
         HAL_GPIO_Init(DATAPORT_TX, &GPIO_InitStruct);

         //init UART
         __USART6_CLK_ENABLE();
         huart1.Instance = USART6;
         huart1.Init.BaudRate = BAUDRATE;
         huart1.Init.WordLength = UART_WORDLENGTH_8B;
         huart1.Init.StopBits = UART_STOPBITS_1;
         huart1.Init.Parity = UART_PARITY_NONE;
         huart1.Init.Mode = UART_MODE_TX_RX;
         huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
         huart1.Init.OverSampling = UART_OVERSAMPLING_16;
         if(HAL_UART_Init(&huart1) != HAL_OK){
               for(;;);
         }

 

         HAL_NVIC_SetPriority(USART6_IRQn, 0, 0);
         HAL_NVIC_EnableIRQ(USART6_IRQn);


         //init DMA TX
         __DMA2_CLK_ENABLE();
         hdma_usart1_tx.Instance = DMA2_Stream7;
         hdma_usart1_tx.Init.Channel = DMA_CHANNEL_5;
         hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
         hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
         hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
         hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
         hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
         hdma_usart1_tx.Init.Mode = DMA_NORMAL;
         hdma_usart1_tx.Init.Priority = DMA_PRIORITY_HIGH;
         hdma_usart1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
         if(HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK){
               for(;;);
         }

 

         __HAL_LINKDMA(&huart1, hdmatx, hdma_usart1_tx);

 

         HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0);
         HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);

 

         //sending....
         char buffer[7] = "abcdef";

         if(HAL_UART_Transmit_DMA(&huart1, (u_int8_t*)&buffer,sizeof(buffer)) != HAL_OK){
               for(;;);
         }

 

         for(;;);
}

 

void USART6_IRQHandler(void){
         HAL_UART_IRQHandler(&huart1);
}

 

void DMA2_Stream7_IRQHandler(void){
         HAL_DMA_IRQHandler(&hdma_usart1_tx);
}

 

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
         //test
         int test= 0, test1= 0;
         test = 1;
         test1 = test;
}

 

void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart){
         //test
         int test= 0, test1= 0;
         test = 1;
         test1 = test;
}

Outcomes