硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1253|回复: 2
收起左侧

STM32H723VGT6串口DMA接收使用空闲中断问题

[复制链接]

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2024-9-12 14:45:17 | 显示全部楼层 |阅读模式
两个单片机使用串口进行数据交互,一个stm32f105(使用串口4,uart4),一个stm32h723vgt6(使用串口7,uart7)
f105发送数据,h7这个单片机每次在接收数据的一半触发中断,导致接收的数据被截断了。
但是单独使用usb转串口测试h7的收发都是没问题的。
下面是代码,有哪个大佬帮我瞅一眼感激不尽!!


__ALIGNED(32) uint8_t g_U7RxBuffer[U7_RX_SIZE];
__ALIGNED(32) uint8_t g_U7TxBuffer[U7_TX_SIZE];

uint8_t __IO g_U7RxCplt = 0; /* 未被DMA使用 */
uint8_t __IO g_U7RxSize = 0; /* 未被DMA使用 */

void AppUART7_Init(void)
{
  // 1.打开空闲接收中断
  HAL_UARTEx_ReceiveToIdle_DMA(&huart7, g_U7RxBuffer, U7_RX_SIZE*2);
}

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    /* HAL_UART_RECEPTION_TOIDLE 说明是DMA接收完成,或者半传输完成 */
    if(huart->Instance == UART7)
    {
        SCB_InvalidateDCache_by_Addr((uint32_t *)g_U7RxBuffer, U7_RX_SIZE*2);
        if (Size <= U7_RX_SIZE)
        {
          LOG_INFO(2,"\r\n data_recv: %s Size = %d\r\n", g_U7RxBuffer,Size);
          g_U7RxCplt = 1;
          g_U7RxSize = Size;   
          HAL_UARTEx_ReceiveToIdle_DMA(huart, g_U7RxBuffer, U7_RX_SIZE*2); // 接收完毕后重启         
        }
        else  // 接收数据长度大于BUFF_SIZE,错误处理
        {
          HAL_UARTEx_ReceiveToIdle_DMA(huart, g_U7RxBuffer, U7_RX_SIZE*2); // 接收完毕后重启
          memset(g_U7RxBuffer, 0, U7_RX_SIZE);                       
        }
    }
}
下面是中断服务函数

void UART7_IRQHandler(void)
{
  /* USER CODE BEGIN UART7_IRQn 0 */
  /* USER CODE END UART7_IRQn 0 */
  HAL_UART_IRQHandler(&huart7);
  /* USER CODE BEGIN UART7_IRQn 1 */

  HAL_UARTEx_ReceiveToIdle_DMA(&huart7, g_U7RxBuffer, U7_RX_SIZE*2);

/* USER CODE END UART7_IRQn 1 */
}



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-9-12 15:41:17 | 显示全部楼层
使用函数HAL_UARTEx_ReceiveToIdle_DMA做超时接收整理:
1、半DMA传输完成中断UART_DMARxHalfCplt     调用  HAL_UARTEx_RxEventCallback,标识继续为HAL_UART_RECEPTION_TOIDLE
2、DMA传输完成中断UART_DMAReceiveCplt       调用   HAL_UARTEx_RxEventCallback,标识继续为HAL_UART_RECEPTION_TOIDLE
3、如果传输期间触发了空闲,DMA又没有传输完成,调用串口中断HAL_UART_IRQHandler,空闲标识处理的HAL_UARTEx_RxEventCallback,并设置HAL_UART_RECEPTION_STANDARD
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2024-9-12 16:07:58 | 显示全部楼层
    if(huart->Instance == UART7)
    {
      SCB_InvalidateDCache_by_Addr((uint32_t *)g_U7RxBuffer, U7_RX_SIZE*2);
      if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
      {
//          HAL_UARTEx_ReceiveToIdle_DMA(huart, g_U7RxBuffer, U7_RX_SIZE*2);
      }
      /* HAL_UART_RECEPTION_STANDARD 缓冲区未满空闲中断回调函数处理 */
      if (huart->ReceptionType == HAL_UART_RECEPTION_STANDARD)
      {
          g_U7RxCplt = 1;
          g_U7RxSize = Size;
          LOG_INFO(2,"\r\n data_recv: %s Size = %d\r\n", g_U7RxBuffer,Size);
//          HAL_UARTEx_ReceiveToIdle_DMA(huart, g_U7RxBuffer, U7_RX_SIZE);
      }
    }
使用HAL_UART_RECEPTION_STANDARD标志位还是只接收一半啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 18:12 , Processed in 0.039121 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表