传输完整的回调,未在UART DMA中被调用



我想做的相当简单。通过 DMA 传输并等待它被传输。然后接收并等待,直到收到。

当我注释掉接收部分(包括回调(时,它将进入传输完成回调功能。但是当我取消注释接收部分时,它不会进入 tx cplt回调,而是直接进入接收 cplt 回调。当我检查接收缓冲区时,我没有得到我期望的(显然(。可能出了什么问题?

我正在使用Atollic True Studio V 9.0,CubeMx v5.1.0,STM32F407VG-DISC1板并为UART2启用了DMA。

我尝试通过UART DMA发送字符缓冲区并接收它。似乎它根本没有传输,因为它不会进入 txCplt 回调。它直接进入Rxcplt回调。

uint8_t tx_arr[10], rx_arr[10];
__IO ITStatus UartReady = RESET;
int main(void)
{
  int i = 0;
  for(i = 0; i<10; i++)
      rx_arr[i] = 0;
  for(i = 0; i<10; i++)
tx_arr[i] = i*2;
 HAL_Init();
 SystemClock_Config();
 MX_GPIO_Init();
 MX_DMA_Init();
 MX_USART6_UART_Init();
 MX_USART2_UART_Init();
  while (1)
  {
  if( HAL_UART_Transmit_DMA(&huart2, (uint8_t*)tx_arr, 10)!= HAL_OK )
  {
      Error_Handler();
  }
      while(UartReady != SET)
      {
  }
  UartReady  = RESET;
      if( HAL_UART_Receive_DMA(&huart2, (uint8_t*)rx_arr, 10)!= HAL_OK )
 {
    Error_Handler();
 }
     while(UartReady != SET)
 {
 }
 UartReady  = RESET;

}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    UartReady = SET;
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    UartReady = SET;
}

我预计rx_arr将被 0,2,4,6 填充,...18 但它被垃圾填满了

在我看来,原因是您正在使用来自两个 ISR 的相同标志变量,两次都在主循环中忙于等待。

如果您取消注释这两个处理程序操作,您迟早会得到一个竞争条件,即两个处理程序在主循环等待它之前快速逐个放置它们的"SET"值。然后,主循环通过将变量设置回"RESET"来"消耗"此标志。几行后,另一个等待循环出现并且未提供(因为两个 ISR 都运行较早并且只留下一个"SET"值,一个覆盖另一个(。然后,您的主循环被卡住。

为了验证我的假设,您可以在进入主循环之前激活一个单侧看门狗,并在每个主循环周期触发它。如果主循环像我假设的那样卡住,您将检测到重置原因随后指向看门狗。

相关内容

  • 没有找到相关文章

最新更新