打印
[STM32F0]

哪位大神用过9位的DMA接收中断啊?发我个例程看看,感谢~~~

[复制链接]
1188|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hp_nancy|  楼主 | 2017-7-31 17:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 19200;
  huart2.Init.WordLength = UART_WORDLENGTH_9B;   
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_NVIC_SetPriority(USART2_IRQn, 1, 3);
  HAL_NVIC_EnableIRQ(USART2_IRQn);
  
HAL_NVIC_SetPriority(DMA1_Channel4_5_IRQn, 1, 2);
  HAL_NVIC_EnableIRQ(DMA1_Channel4_5_IRQn);
}


void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
if(uartHandle->Instance==USART2)
  {
  /* USER CODE BEGIN USART2_MspInit 0 */

  /* USER CODE END USART2_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART2_CLK_ENABLE();
  
    /**USART2 GPIO Configuration   
    PA2     ------> USART2_TX
    PA3     ------> USART2_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


  /* USER CODE BEGIN USART2_MspInit 1 */
    hdma_usart2_rx.Instance = DMA1_Channel5;
    hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart2_rx.Init.PeriphDataAlignment =DMA_PDATAALIGN_BYTE;
    hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart2_rx.Init.Mode = DMA_NORMAL;
    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;

    if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
   
  /* USER CODE END USART2_MspInit 1 */
  }
}

设置成8位接收没问题,设置成9位的时候接收数据就乱了。
沙发
feelhyq| | 2017-7-31 17:59 | 只看该作者
DMA配置成16bit

使用特权

评论回复
板凳
hp_nancy|  楼主 | 2017-8-1 07:46 | 只看该作者

配置成16bit 也不行

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  /* Check that a Rx process is not already ongoing */
  if(huart->RxState == HAL_UART_STATE_READY)
  {
    if((pData == NULL ) || (Size == 0U))
    {
      return HAL_ERROR;
    }

    /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
       should be aligned on a u16 frontier, as data copy from RDR will be
       handled by DMA from a u16 frontier. */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      if((((uint32_t)pData)&1U) != 0U)
      {
        return  HAL_ERROR;
      }
    }

    /* Process Locked */
    __HAL_LOCK(huart);

    huart->pRxBuffPtr = pData;
    huart->RxXferSize = Size;

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->RxState = HAL_UART_STATE_BUSY_RX;

    /* Set the UART DMA transfer complete callback */
    huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt;

    /* Set the UART DMA Half transfer complete callback */
    huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt;

    /* Set the DMA error callback */
    huart->hdmarx->XferErrorCallback = UART_DMAError;

    /* Set the DMA abort callback */
    huart->hdmarx->XferAbortCallback = NULL;
    /* Enable the DMA channel */
    HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->RDR, (uint32_t)huart->pRxBuffPtr, Size);

    /* Process Unlocked */
    __HAL_UNLOCK(huart);

    /* Enable the UART Parity Error Interrupt */
    SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);

    /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
    SET_BIT(huart->Instance->CR3, USART_CR3_EIE);

    /* Enable the DMA transfer for the receiver request by setting the DMAR bit
       in the UART CR3 register */
    SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}



断点停在  HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->RDR, (uint32_t)huart->pRxBuffPtr, Size);这里,调试的时候接收都没问题 ,断点去掉运行的话,接收的数据就乱了

使用特权

评论回复
地板
feelhyq| | 2017-8-1 09:01 | 只看该作者
本帖最后由 feelhyq 于 2017-8-1 09:07 编辑

...

使用特权

评论回复
5
feelhyq| | 2017-8-1 09:10 | 只看该作者
hp_nancy 发表于 2017-8-1 07:46
配置成16bit 也不行

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pDa ...

楼主是不是第一次用HAL库函数?中断里面要有HAL库的中断服务函数,DMA中断也是一样,这些函数里面回将HAL库里面的一些状态给清掉,为了第二次使用。另外,建议调查下你说的  ”断点停在  HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->RDR, (uint32_t)huart->pRxBuffPtr, Size);这里,调试的时候接收都没问题 ,断点去掉运行的话,接收的数据就乱了“原因

使用特权

评论回复
6
hp_nancy|  楼主 | 2017-8-1 10:08 | 只看该作者
feelhyq 发表于 2017-8-1 09:10
楼主是不是第一次用HAL库函数?中断里面要有HAL库的中断服务函数,DMA中断也是一样,这些函数里面回将HAL ...

是第一次用   关键我的程序  数据位是8位的时候没有问题


设置成9位的时候数据就不对了

使用特权

评论回复
7
feelhyq| | 2017-8-1 10:14 | 只看该作者
hp_nancy 发表于 2017-8-1 10:08
是第一次用   关键我的程序  数据位是8位的时候没有问题

很明显DMA起作用了嘛,数据都收到了,你看看串口助手的设置,数据位是8位,你不是要传输9位吗?ASCI码表 应该没有9位码吧(我不是很确定,应该没有),你需要要想另外一种方法将9位数据显示出来,而不使用串口助手

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝