Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

STM32F4 e HAL_UART_RxCpltCallback che non viene richiamata

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] STM32F4 e HAL_UART_RxCpltCallback che non viene richiamata

Messaggioda Foto Utentestefanoxjx » 13 mag 2020, 15:05

Ciao a tutti, ho un problema nel configurare la USART2 di un micro STM32F411VET.
Con la modalità polling non ho nessun problema sia in trasmissione che ricezione, ma questa modalità non va bene per quello che devo fare.
Ho quindi provato la modalità interrupt, ma non ricevo nessun dato e la callback RxCpltCallback non viene mai richiamata.
Nel delirio delle varie prove che sto facendo, ho quindi provato la modalità DMA con buffer circolare e in questo caso trasmetto e ricevo dati, ma al solito RxCpltCallback non viene richiamata.
Non capisco dove sto sbagliando.
Ho generato il codice con CubeMX e attivato la voce Usart2 Global Interrupt ma non riesco a venirne fuori.
Di seguito il codice che sto utilizzando in modalità DMA (visto che al momento è quello che mi da un po' più soddisfazioni).

Codice: Seleziona tutto
#include "main.h"

uint8_t Rx_data[256];
uint16_t i;

UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();

  HAL_UART_Transmit(&huart2, (uint8_t*)"Ready...\r\n", 10, 100);
 
  HAL_UART_Receive_DMA (&huart2, Rx_data, 4);

  while (1)
  { }

}

void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
{
  i++;
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  i++;
}


void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_USART2_UART_Init(void)
{
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
}


static void MX_DMA_Init(void)
{

  __HAL_RCC_DMA1_CLK_ENABLE();

  HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
}

static void MX_GPIO_Init(void)
{
  __HAL_RCC_GPIOD_CLK_ENABLE();
}

void Error_Handler(void)
{}

#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif /* USE_FULL_ASSERT */


Qui vengono inizializzati i GPIO e gli interrupt:

Codice: Seleziona tutto
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(huart->Instance==USART2)
  {
    __HAL_RCC_USART2_CLK_ENABLE();
 
    __HAL_RCC_GPIOD_CLK_ENABLE();
    /**USART2 GPIO Configuration   
    PD5     ------> USART2_TX
    PD6     ------> USART2_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

    /* USART2 DMA Init */
    /* USART2_RX Init */
    hdma_usart2_rx.Instance = DMA1_Stream5;
    hdma_usart2_rx.Init.Channel = DMA_CHANNEL_4;
    hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart2_rx.Init.Mode = DMA_CIRCULAR;
    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_usart2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);

    /* USART2 interrupt Init */
    HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART2_IRQn);
  }
}


Mi sapreste dire cosa sto sbagliando o darmi qualche consiglio?
Grazie.

Stefano
Avatar utente
Foto Utentestefanoxjx
0 4
 
Messaggi: 36
Iscritto il: 8 ago 2006, 13:06

0
voti

[2] Re: STM32F4 e HAL_UART_RxCpltCallback che non viene richiama

Messaggioda Foto Utenteirolokirt » 2 apr 2021, 21:21

Non ho mai usato la DMA ma la IT
se funziona allo stesso modo
devi richiamare:
HAL_UART_Receive_DMA (&huart2, Rx_data, 4);
all'interno della callback, per riattivare l'interrupt.

se non la richiami l'interrupt non si riattiva piu, una volta ricevuti 4byte

un annetto in ritardo ma meglio che nulla...
Avatar utente
Foto Utenteirolokirt
15 2
 
Messaggi: 31
Iscritto il: 20 giu 2018, 22:37
Località: Monte zuma


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti