初级会员

- 积分
- 161
- 金钱
- 161
- 注册时间
- 2015-1-16
- 在线时间
- 11 小时
|
1金钱
使用H743的串口4的DMA,在while里面一直查询DMA的状态,并且若DMA的数据改变,就将改变的数据读取出来,但是遇到情况是一直查询的话会导致DMA接不到数据,有解决方案吗?
配置如下
/* 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 = bound;
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;
HAL_UART_Init(&huart4); //HAL_UART_Init()会使能UART1
//__HAL_UART_ENABLE_IT(&UART2_Handler, UART_IT_RXNE); //使能接收中断
// 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;
// HAL_UART_Init(&huart4);
// {
// 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 */
/* UART4 DMA Init */
/* UART4_RX Init */
hdma_uart4_rx.Instance = DMA1_Stream0;
hdma_uart4_rx.Init.Request = DMA_REQUEST_UART4_RX;
hdma_uart4_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_uart4_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_uart4_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_uart4_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;//外设数据长度:8位
hdma_uart4_rx.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
hdma_uart4_rx.Init.Mode = DMA_CIRCULAR;
hdma_uart4_rx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_uart4_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_uart4_rx) != HAL_OK)
{
// Error_Handler();
}
__HAL_LINKDMA(&huart4,hdmarx,hdma_uart4_rx);
#if(USART4_RX_DMA == 1)
if (HAL_UART_Receive_DMA(&huart4, (uint8_t *)uart4_dma_rx_buffer, UART4_DMA_LEN) != HAL_OK)
{
// _Error_Handler(NULL, NULL);
}
读取如下
process_num =DMA1_Stream0->NDTR;
//
if(flagjiexi!=UART4_DMA_LEN-process_num)
{
ubx_c[0] = uart4_dma_rx_buffer[flagjiexi];
// HAL_UART_Transmit(&huart4,ubx_c,1,1000); //发送接收到的数据
// while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);
flagjiexi++;
if(flagjiexi>=UART4_DMA_LEN)
{
flagjiexi=0;
}
}
在while里面访问uart4_dma_rx_buffer会导致uart4_dma_rx_buffer数据接收不正常,有知道咋回事吗
|
|