Uart DMA does not receive after a while
Hello, I am doing UART communication with DMA in my project. When the communication first starts, there is no problem, but after about 10 minutes, the receive process ends. Can you check my codes?
volatile uint8_t txdata[8];
char rxdata[8]={'*','*','*','*','*','*','*','*'};
volatile uint8_t txComplete = 1;
uint8_t rxBuf[8];
uint8_t rxindex = 0;
uint8_t Buf_1ch[1];
uint8_t len=0;
UART_HandleTypeDef huart5;
DMA_HandleTypeDef hdma_uart4_tx;
DMA_HandleTypeDef hdma_uart4_rx;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart == &huart4) {
rxdata[rxindex] = Buf_1ch[0];
rxindex++;
if (rxindex >= 8 ){
rxindex = 0;
}
HAL_UART_Receive_DMA(&huart4, Buf_1ch, 1);
}
}
int main(void)
{
//...
//...
HAL_UART_Receive_DMA(&huart4, (uint8_t *)Buf_1ch, 1);
__HAL_DMA_DISABLE_IT(&hdma_uart4_rx, DMA_IT_HT);
...
....
}
static void MX_UART4_Init(void)
{
/* USER CODE BEGIN UART4_Init 0 */
/* USER CODE END UART4_Init 0 */
/* USER CODE BEGIN UART4_Init 1 */
/* USER CODE END UART4_Init 1 */
huart4.Instance = UART4;
huart4.Init.BaudRate = 115200;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart4) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart4, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart4, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN UART4_Init 2 */
/* USER CODE END UART4_Init 2 */
}
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMAMUX1_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
/* DMA1_Channel2_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
/* DMA1_Channel3_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
/* DMAMUX_OVR_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMAMUX_OVR_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMAMUX_OVR_IRQn);
}
