luoyesuifengfei 2023-05-07 18:46 采纳率: 0%
浏览 31

STM32H743串口2 DMA接收不定长数据都是0

STM32H743串口2 使用空闲中断结束数据都是 0是什么原因

//bound:波特率
////DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_Streamx:DMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
void USART2_Init(u32 bound)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_Initure;
    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART2;
  PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

 // __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能    
  __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能 
    __HAL_RCC_GPIOA_CLK_ENABLE();            //使能GPIOB时钟
    __HAL_RCC_USART2_CLK_ENABLE();            //使能USART3时钟
    

    GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PB10,11
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;        //复用推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;            //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
    GPIO_Initure.Alternate=GPIO_AF7_USART2;    //复用为USART3
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);           //初始化PB10,11
    
  HAL_DMA_USART2_TX_Handle.Instance = DMA1_Stream5;
  HAL_DMA_USART2_TX_Handle.Init.Request=DMA_REQUEST_USART2_TX;                      //USART3发送DMA
  HAL_DMA_USART2_TX_Handle.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
  HAL_DMA_USART2_TX_Handle.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
  HAL_DMA_USART2_TX_Handle.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
  HAL_DMA_USART2_TX_Handle.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
  HAL_DMA_USART2_TX_Handle.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
  HAL_DMA_USART2_TX_Handle.Init.Mode=DMA_NORMAL;                            //外设流控模式
  HAL_DMA_USART2_TX_Handle.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
  HAL_DMA_USART2_TX_Handle.Init.FIFOMode=DMA_FIFOMODE_DISABLE;          
  HAL_DMA_USART2_TX_Handle.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
  HAL_DMA_USART2_TX_Handle.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
  HAL_DMA_USART2_TX_Handle.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
  HAL_DMA_DeInit(&HAL_DMA_USART2_TX_Handle); 
  if(HAL_DMA_Init(&HAL_DMA_USART2_TX_Handle)!=HAL_OK)
  {
    Error_Handler();
  }    
  __HAL_LINKDMA(&USART2_Handler,hdmatx,HAL_DMA_USART2_TX_Handle);    //将DMA与USART3 发送联系起来接收 DMA


  HAL_DMA_USART2_RX_Handle.Instance = DMA1_Stream3;
  HAL_DMA_USART2_RX_Handle.Init.Request=DMA_REQUEST_USART2_RX;                       //USART3接收DMA
  HAL_DMA_USART2_RX_Handle.Init.Direction=DMA_PERIPH_TO_MEMORY;             //外设到内存
  HAL_DMA_USART2_RX_Handle.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
  HAL_DMA_USART2_RX_Handle.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
  HAL_DMA_USART2_RX_Handle.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
  HAL_DMA_USART2_RX_Handle.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
  HAL_DMA_USART2_RX_Handle.Init.Mode=DMA_NORMAL;                            //外设流控模式
  HAL_DMA_USART2_RX_Handle.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
  HAL_DMA_USART2_RX_Handle.Init.FIFOMode=DMA_FIFOMODE_ENABLE;          
  HAL_DMA_USART2_RX_Handle.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
  HAL_DMA_USART2_RX_Handle.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
  HAL_DMA_USART2_RX_Handle.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
  if( HAL_DMA_Init(&HAL_DMA_USART2_RX_Handle)!=HAL_OK)
  {
    Error_Handler();
  }    
  __HAL_LINKDMA(&USART2_Handler,hdmarx,HAL_DMA_USART2_RX_Handle);    //将DMA与USART3 接收联系起来接收 DMA

  HAL_NVIC_SetPriority(DMA1_Stream5_IRQn,8,0);    //设置中断优先级,抢占优先级11,子优先级0
    HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);          //开启ITM3中断  / 
 
  HAL_NVIC_SetPriority(DMA1_Stream3_IRQn,9,0);    //设置中断优先级,抢占优先级12,子优先
  HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);          //开启ITM3中断   

 



   //USART 初始化设置
    USART2_Handler.Instance=USART2;                    //USART3
    USART2_Handler.Init.BaudRate=bound;                //波特率
    USART2_Handler.Init.WordLength=UART_WORDLENGTH_8B;    //字长为8位数据格式
    USART2_Handler.Init.StopBits=UART_STOPBITS_1;        //一个停止位
    USART2_Handler.Init.Parity=UART_PARITY_NONE;        //无奇偶校验位
    USART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;    //无硬件流控
    USART2_Handler.Init.Mode=UART_MODE_TX_RX;            //收发模式
  USART2_Handler.Init.OverSampling = UART_OVERSAMPLING_16;
  USART2_Handler.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  USART2_Handler.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  USART2_Handler.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    if(HAL_UART_Init(&USART2_Handler)!=HAL_OK)  //初始化串口3
  {  
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&USART2_Handler, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&USART2_Handler, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&USART2_Handler) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_NVIC_SetPriority(USART2_IRQn,7,0);    //设置中断优先级,抢占优先级1,子优先级3
    HAL_NVIC_EnableIRQ(USART2_IRQn);          //开启ITM3中断   
    

 __HAL_UART_CLEAR_IDLEFLAG(&USART2_Handler); //串口初始化完成后空闲中断标志位是1 需要清除
 delay_ms(1);
//设置DMA接收缓冲区及长度,接收长度应大于最大报文长度
 HAL_UART_Receive_DMA(&USART2_Handler,USART2_RX_BUF,USART2_REC_LEN);  //注意初始化顺序 要先设定区域 再使能中断
 //开启空闲中断
 __HAL_UART_ENABLE_IT(&USART2_Handler,UART_IT_IDLE);
 delay_ms(1);


}



void USART2_IRQHandler(void)
{
  if(__HAL_UART_GET_FLAG(&USART2_Handler,UART_FLAG_IDLE)!=RESET)
    {
        __HAL_UART_CLEAR_IDLEFLAG(&USART2_Handler);
        HAL_UART_DMAStop(&USART2_Handler);
        len2= USART2_REC_LEN-__HAL_DMA_GET_COUNTER(&HAL_DMA_USART2_RX_Handle);
      if(len2) //处理数据是要看是不是有数据 初始化的时候 空的会进来一次
        {
            USART2_DMA_Send_data(USART2_RX_BUF,len2); //返回收到的值
        }
        
        HAL_UART_Receive_DMA(&USART2_Handler,USART2_RX_BUF,USART2_REC_LEN);
    }
  HAL_UART_IRQHandler(&USART2_Handler);
}    
void DMA1_Stream3_IRQHandler(void)
{
  HAL_DMA_IRQHandler(&HAL_DMA_USART2_RX_Handle);  
}
void DMA1_Stream5_IRQHandler(void)
{
  HAL_DMA_IRQHandler(&HAL_DMA_USART2_TX_Handle);  
}


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-07 20:06
    关注
    评论

报告相同问题?

问题事件

  • 创建了问题 5月7日

悬赏问题

  • ¥30 为什么会失败呢,该如何调整
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析