stm32h743 关于usart中DMA 收数据的记录及疑惑

用原点的开发板学习时发现没有关于DMA收数的例程,于是自己在网上找例程学习,使用的环境时CUBE IDE 1.80。过程记录如下:

1)配置:打开dma中断

2)手工添加代码:

 __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  HAL_UART_Receive_DMA(&huart1,aRxBuffer,13);

3)中断函数修改:

#if  1
    ALIGN_32BYTES(__attribute__((section (".RAM_D2"))) uint8_t aRxBuffer[4]) = {0};
#else
    __attribute__((section(".RAM_D2"))) uint8_t tt= 20;
    __attribute__((section(".RAM_D2"))) uint8_t aRxBuffer[13] = "KEY_DOWN_K1\r\n";
#endif

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
    uint8_t temp,rx_len,tmp_flag;

    if(USART1 == huart1.Instance)
       {
           tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志

           if((tmp_flag != RESET))//idle标志被置
           {
               //recv_end_flag = 1;  // 接受完成标志位置1
               __HAL_UART_CLEAR_IDLEFLAG(&huart1);

               HAL_UART_DMAStop(&huart1); //
               temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 
               rx_len =  10 - temp; //
              SCB_InvalidateDCache_by_Addr ((uint32_t *)aRxBuffer, 4); //enable cache and use this 
              HAL_UART_Receive_DMA(&huart1,aRxBuffer,4);//重新打开DMA接收

              //printf("rcvdata:%ld\r\n",((aRxBuffer[3]<<24)+(aRxBuffer[2]<<16)+(aRxBuffer[1]<<8)+aRxBuffer[0]));
           }

       }
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

上面的代码中,如果将收数的数量改为1, HAL_UART_Receive_DMA(&huart1,aRxBuffer,1),数据接收正常,如果改为大于1的数,数据不能正常接收,参考了很多查到的资料,比如 安富莱的例程,里面的这部分也不是1,问题没有找到答案,不知道为何。

找到了不能接受多个数据的原因,参考这个文章:

(5条消息) 解决串口开启DMA接受却只能接收到第一个字节之后就再也接受不到数据的问题_love421的博客-CSDN博客_串口dma接收不到数据另外,参考原子的教程中,在uart_init 中加入了一句HAL_UART_Receive_IT(&huart3,rcvdata,BUFFERSIZE);这里的BUFFERSIZE原子教程中定义为1,也是导致只能接收第一个字节的原因。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32H743是一款基于ARM Cortex-M7内核的单片机,具有丰富的外设资源和强大的性能。其USART是一种常用的串口通信接口,而DMA(Direct Memory Access)则是一种用于实现高速数据传输的技术。在STM32H743,可以通过配置USARTDMA来实现USARTDMA传输。 在配置STM32H743USART DMA传输时,可以按照以下步骤进行操作[^1][^2]: 1. 配置USART的参数:包括波特率、数据位数、停止位、校验位等。可以使用STM32CubeMX工具进行配置,也可以通过编程方式进行配置。 2. 配置DMA的参数:包括数据传输方向、数据长度、传输模式等。可以使用STM32CubeMX工具进行配置,也可以通过编程方式进行配置。 3. 初始化USARTDMA:根据配置的参数,初始化USARTDMA的相关寄存器。 4. 启动DMA传输:通过设置相关寄存器,启动DMA传输。 5. 处DMA传输完成断:当DMA传输完成时,会发相应的断,可以在断处理函数进行相应的处理。 下面是一个示例代码,演示了如何配置STM32H743USART DMA传输: ```c #include "stm32h7xx.h" #define BUFFER_SIZE 10uint8_t txBuffer[BUFFER_SIZE] = "Hello"; uint8_t rxBuffer[BUFFER_SIZE]; void USART_DMA_Configuration(void) { // 配置USART参数 USART1->BRR = 0x1A0; // 波特率为115200 USART1->CR1 |= USART_CR1_TE | USART_CR1_RE; // 使能发送和接 // 配置DMA参数 DMA1_Stream5->PAR = (uint32_t)&USART1->DR; // 设置外设地址 DMA1_Stream5->M0AR = (uint32_t)rxBuffer; // 设置存储器地址 DMA1_Stream5->NDTR = BUFFER_SIZE; // 设置数据长度 DMA1_Stream5->CR |= DMA_SxCR_CHSEL_4 | DMA_SxCR_CHSEL_0; // 选择DMA通道 DMA1_Stream5->CR |= DMA_SxCR_MINC | DMA_SxCR_CIRC; // 使能存储器增量模式和循环模式 DMA1_Stream5->CR |= DMA_SxCR_TCIE; // 使能传输完成断 // 初始化USARTDMA USART1->CR3 |= USART_CR3_DMAT | USART_CR3_DMAR; // 使能USARTDMA传输 DMA1_Stream5->CR |= DMA_SxCR_EN; // 使能DMA传输 } void DMA1_Stream5_IRQHandler(void) { if (DMA1->HISR & DMA_HISR_TCIF5) { DMA1->HIFCR |= DMA_HIFCR_CTCIF5; // 清除传输完成标志位 // 处理接到的数据 } } int main(void) { USART_DMA_Configuration(); while (1) { // 发送数据 USART1->DR = txBuffer[0]; while (!(USART1->SR & USART_SR_TC)); // 接数据 while (!(USART1->SR & USART_SR_RXNE)); rxBuffer[0] = USART1->DR; } } ``` 以上是一个简单的示例代码,演示了如何配置STM32H743USART DMA传输。在实际应用,还需要根据具体需求进行相应的配置和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值