|
STM32H743VIHx USART DMA 闲时中断读取不到数据
没有开启DACHE . 用的CUBEMX生成的代码。
代码如下:
uint8_t RX_SIZE_2=50;
#pragma data_alignment=32
uint8_t uart2RxBuf[50];
void MX_USART6_UART_Init(void)
{
/* USER CODE BEGIN USART6_Init 0 */
/* USER CODE END USART6_Init 0 */
/* USER CODE BEGIN USART6_Init 1 */
/* USER CODE END USART6_Init 1 */
huart6.Instance = USART6;
huart6.Init.BaudRate = 100000;
huart6.Init.WordLength = UART_WORDLENGTH_9B;
huart6.Init.StopBits = UART_STOPBITS_2;
huart6.Init.Parity = UART_PARITY_EVEN;
huart6.Init.Mode = UART_MODE_RX;
huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart6.Init.OverSampling = UART_OVERSAMPLING_16;
huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart6.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
huart6.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
if (HAL_UART_Init(&huart6) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart6, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart6, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart6) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART6_Init 2 */
/* USER CODE END USART6_Init 2 */
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
if(uartHandle->Instance==USART6)
{
/* USER CODE BEGIN USART6_MspInit 0 */
/* USER CODE END USART6_MspInit 0 */
/** Initializes the peripherals clock
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART6;
PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
/* USART6 clock enable */
__HAL_RCC_USART6_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
/**USART6 GPIO Configuration
PC7 ------> USART6_RX
PC6 ------> USART6_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_USART6;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_USART6;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* USART6 DMA Init */
/* USART6_RX Init */
hdma_usart6_rx.Instance = DMA2_Stream7;
hdma_usart6_rx.Init.Request = DMA_REQUEST_USART6_RX;
hdma_usart6_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart6_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart6_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart6_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart6_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart6_rx.Init.Mode = DMA_CIRCULAR;
hdma_usart6_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_usart6_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_usart6_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart6_rx);
/* USART6 interrupt Init */
HAL_NVIC_SetPriority(USART6_IRQn, 8, 0);
HAL_NVIC_EnableIRQ(USART6_IRQn);
/* USER CODE BEGIN USART6_MspInit 1 */
/* USER CODE END USART6_MspInit 1 */
}
}
void UART_RxIdleCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==huart6.Instance) //判断是否是串口1
{
if(RESET != __HAL_UART_GET_FLAG(&huart6, UART_FLAG_IDLE)) //判断是否是空闲中断
{
__HAL_UART_CLEAR_IDLEFLAG(&huart6); //清楚空闲中断标志(否则会一直不断进入中断)
data_length = RX_SIZE_2 -__HAL_DMA_GET_COUNTER(&hdma_usart6_rx); //计算接收到的数据长度
每次接收到的长度都是0
if(data_length)
{
HAL_UART_DMAStop(&huart6);
if(data_length>=10)
{
for (int16_t i = 0; i < data_length; i++) // Process bytes received
{ sbus_share[i]=uart2RxBuf[i];}
}
else{sbus_updated=0;
}
memset(&uart2RxBuf,0,RX_SIZE_2); //清零接收缓冲区
data_length = 0;
HAL_UART_Receive_DMA(&huart6, (uint8_t*)uart2RxBuf, RX_SIZE_2); //重启开始DMA传输 每次255字节数据
__HAL_UART_DISABLE_IT(&huart6,UART_IT_PE);
__HAL_UART_DISABLE_IT(&huart6,UART_IT_ERR);
}
else
{
READ_REG(huart6.Instance->RDR);
__HAL_UART_CLEAR_OREFLAG(&huart6);
}
}
if(RESET != __HAL_UART_GET_FLAG(&huart6, UART_FLAG_TC))
{
MP++;
每次中断都会进来很奇怪我只配了接收 没有配发送
}
}
}
void main()
{
......
__HAL_UART_ENABLE_IT(&huart6,UART_IT_IDLE);
__HAL_UART_CLEAR_IDLEFLAG(&huart6);//清除标志位
if( HAL_UART_Receive_DMA(&huart6,&uart2RxBuf[0],RX_SIZE_2)!= HAL_OK)
{
Error_Handler();
}
__HAL_UART_DISABLE_IT(&huart6, UART_IT_ERR);
__HAL_UART_DISABLE_IT(&huart6, UART_IT_PE);
.........
}
|
|