精华内容
下载资源
问答
  • 在HAL库的基础上用DMA接收不定长数据,需要配合FreeRTOS使用,仔细看的话,可以分分钟移植到裸机,但是H7不跑OS,那绝对是智障或者大侠
  • 前两天在转战STM32H7,项目中要用到串口,要求用DMA接收,但是遇到了一个问题,就是我的接收数组,但我不去访问它,它接收起来都是正确的,但是一旦我要对这个接受数组做处理了,它就出现问题了,DMA寄存器都正常,...

    前两天在转战STM32H7,项目中要用到串口,要求用DMA接收,但是遇到了一个问题,就是我的接收数组,但我不去访问它,它接收起来都是正确的,但是一旦我要对这个接受数组做处理了,它就出现问题了,DMA寄存器都正常,外设地址储存器地址数据量等都正常,但是接收数组再也没数据了。
    后面在网上找到一篇文章,遇到了相同的情况HAL库的STM32F767的DMA通过IDLE中断接收数据但不能访问
    看到这个一个答案,在这里插入图片描述
    但是也懵了,之前都没搞过这些Cache什么的啊,博客也没给一个示范代码啥的,网上关于STM32这方面的只是也还少,怎么办呢。
    前思后想,接触的只有MPU了,于是找了关于MPU的知识,很巧,正点原子有例程,STM32CubeMX也能直接生成,那就好办了,立即用CubeMX配置了这么一段代码

    void MPU_Config(void)
    {
      MPU_Region_InitTypeDef MPU_InitStruct;
    
      /* Disables the MPU */
      HAL_MPU_Disable();
        /**Initializes and configures the Region and the memory to be protected 
        */
      MPU_InitStruct.Enable = MPU_REGION_ENABLE;
      MPU_InitStruct.Number = MPU_REGION_NUMBER1;
      MPU_InitStruct.BaseAddress = 0x24000000;
      MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
      MPU_InitStruct.SubRegionDisable = 0x0;
      MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
      MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
      MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
      MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
      MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
      MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
    
      HAL_MPU_ConfigRegion(&MPU_InitStruct);
    
      /* Enables the MPU */
      HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    
    }
    

    再调试时,OK搞定。

    展开全文
  • 使用野火的模板 利用RT1052的eDMA 和串口空闲中断实现 接收不定长数据,并在主函数打印出来。。。 实测有效
  • STM32串口一dma+idle接受不定长数据,代码简单,好用
  • STM32串口空闲中断DMA接收不定长数据消息队列。 串口1空闲中断+DMA,接收不定长数据
  • STM32_HAL+串口+DMA发送和接收,可做项目研发,串口DMA发送和接收,减轻CPU负担。
  • STM32 HAL库+串口DMA+空闲中断(IDLE)实现不定长数据接收,可以用来参考学习使用,简单易懂。
  • 代码是我从我们的工程文件中截取的部分 包括了stm32F407所有的6个串口DMA 空闲中断的配置函数以及中断函数。 使用者需要自行添加对应的处理函数 代码主要是用于多个串口数据的处理,相比较于接受非空中断的形式...
  • PC侧,向单片机发送数据,发现单片机接收数据时,只能接收到串口数据的最后一个字节,并且接收到的数据长度是正确的。数据长度正确,数据错误。 处理: 网上搜索到一个结果:...

    环境:
    win10 stm32cubemx keil5 使用HAL库
    在这里插入图片描述

    现象:
    PC侧,向单片机发送数据,发现单片机接收数据时,只能接收到串口数据的最后一个字节,并且接收到的数据长度是正确的。数据长度正确,数据错误。

    处理:
    网上搜索到一个结果:https://blog.csdn.net/qq_21543821/article/details/106141697
    HAL自身的坑坑。初始化端口的时候,把usrt放到最最后,即可。

    代码修改:
    在这里插入图片描述

    运行结果:

    在这里插入图片描述
    完毕。

    展开全文
  • 使用STM32F407单片机的DMA功能,利用串口接收不定长数据的程序,验证可以使用。
  • 接收采用串口的空闲中断来判断接收完成,程序下进去启动后第接收正常,往后就不行了,数据维持不变,不往缓存区写数据了,看了网上许多例程都差不多。 //启动DMA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_...

    接收采用串口的空闲中断来判断接收完成,程序下进去启动后第一次接收正常,往后就不行了,数据维持不变,不往缓存区写数据了,看了网上许多例程都差不多。

      //启动DMA时钟  
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);  
        //DMA通道配置  
            while(DMA_GetCmdStatus(DMA2_Stream2) != DISABLE){}        //等待DMA可配置
        DMA_DeInit(DMA2_Stream2);  
        DMA_InitStructure.DMA_Channel = DMA_Channel_4;  
        //外设地址  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);  
        //内存地址  
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)re_buff;  
        //dma传输方向  
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;  
        //设置DMA在传输时缓冲区的长度  
        DMA_InitStructure.DMA_BufferSize =64;  
        //设置DMA的外设递增模式,一个外设  
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
        //设置DMA的内存递增模式  
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
        //外设数据字长  
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  
        //内存数据字长  
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  
        //设置DMA的传输模式  
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
        //设置DMA的优先级别  
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;  

        //指定如果FIFO模式或直接模式将用于指定的流 : 不使能FIFO模式   
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;      
        //指定了FIFO阈值水平  
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;         
        //指定的Burst转移配置内存传输   
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;         
        //指定的Burst转移配置外围转移 */   
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;   

        //配置DMA1的通道           
        DMA_Init(DMA2_Stream2, &DMA_InitStructure);   
        //使能通道  
        DMA_Cmd(DMA2_Stream2,ENABLE);

     

    void Receive_Data_IRQHandler(void)
    {
            if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  
        {  
            USART1->SR;  
            USART1->DR; //清USART_IT_IDLE标志  
            //关闭DMA  
            DMA_Cmd(DMA2_Stream2,DISABLE);  
            //清除标志位  
            DMA_ClearFlag(DMA2_Stream2,DMA_FLAG_TCIF4);  

            re_len = BUFF_SIZE - DMA_GetCurrDataCounter(DMA2_Stream2);  

            //获得接收帧帧长  
          //  memcpy(buf,re_buff,re_len);  

            //设置传输数据长度  
            DMA_SetCurrDataCounter(DMA2_Stream2,BUFF_SIZE);  
            //打开DMA  
            DMA_Cmd(DMA2_Stream2,ENABLE);  
        }        
    }

    后来把DMA_Mode 改成 DMA_Mode_Circular(循环接收) 则接收正常,正常模式只能接收一次,但在串口接收中断里明明已经重新设定了DMA传输数量并重新使能了。

    网上的例程都用的DMA_Mode_Normal,不知道为什么我的用这个模式不行,希望知道的朋友能在下方评论留言!

    展开全文
  • 项目是用STM32CubeMX V5.4.0自动生成,MDK 5.27编译,运行HAL_UART_Receive_DMA 只能接收最后一个数据。 自动生成的程序代码后,初始化顺序要调整一下。 /* Initialize all configured peripherals */ ...

    项目中要用到串口的DMA功能,但几天调试都不成功!

    项目是用STM32CubeMX V5.4.0自动生成,MDK 5.27编译,运行 HAL_UART_Receive_DMA 只能接收最后一个数据。

     

    自动生成的程序代码后,初始化顺序要调整一下。

      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_I2C1_Init();
      //MX_USART2_UART_Init();//这条关闭
      MX_DMA_Init();

      /* Initialize interrupts */
      MX_NVIC_Init();
      /* USER CODE BEGIN 2 */
        
      MX_USART2_UART_Init();    //CubeMX自动生成的初始化顺序有问题,现将前面关闭了,最后串口初始化。
        //(原DMA故障现象是DMA中断后只接收到最后一字符)

    故障造成原因:STM32 HAL库的DMA时钟配置跟串口,dma通道配置在两个文件里,结果先进行了串口配置,DMA通道配置,然后才是把DMA时钟打开了。

    展开全文
  • STM32F417 串口使用DMA接收不定长数据例程
  • STM32F103串口DMA接收

    2019-10-08 16:03:12
    在STM32F103单片机上实现,串口2通过DMA接收数据数据,并将接收的数据通过串口1发送出去。
  • 发现串口接受不到数据只能接受到第一个字节。 UART4_InitVariables(); HAL_Delay(200); HAL_UART_Receive_DMA(&huart4, UART_DMA_RXBuf, UART_RX_BUF_SIZE); 原因分析: 在单片机执行完串口初始化之后...
  • STM32之串口DMA接收不定长数据

    万次阅读 多人点赞 2018-09-17 15:49:25
    STM32之串口DMA接收不定长数据 本文为杰杰原创,如需转载请说明出处 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? ...
  • 本文件是使用STM32F103C8T6的串口1的空闲中断+DMA实现接收不定长数据源代码测试文件记录,仅供参考。
  • stm32L053 低功耗设计开发MCU,使用STM32 官方的驱动库HAL,采用串口中断接收方式,接收不定长数据,发送则采用DMA发送,项目中稳定使用的USART驱动方式。
  • STM32 usart dma 数据只能接收一个字节

    千次阅读 热门讨论 2019-05-27 21:44:32
    一个低级错误,采用STM32 HAL库,由于DMA时钟...导致串口接受的时候,只能接收到最后一个字节,而发送正常,一直以为配置的MEM INC这里出问题,知道问题是在DMA配置这里,后来才发现DMA时钟是后面才配置,记录一下 ...
  • 本例程实现STM32F103ZET6的串口DMA发送与串口DMA接收,配合串口空闲中断可以接收不定长数据。讲解内容可以参照本人的文章:https://blog.csdn.net/qq_30267617/article/details/118877845。
  • 野火 RTT 改的 三个串口 dma 接收 接收后处理数据,但是串口一直不能正常发送数据 Uart2 Uart3 都有问题,请赐教,确实没有分了 ** 调用 ** RS485_SEND_EN(ON); rt_thread_delay(200); Usart_Send...
  • STM32F103 串口DMA+空闲中断接收

    热门讨论 2017-11-14 11:54:44
    STM32F103VET6 串口DMA+空闲中断接收接收到的数据DMA串口实时发送回去。该版本存在一个bug,推荐下载另一个修复后的版本,或者参照我的博文自己进行修复。 修复版本下载链接:...
  • STM32使用DMA串口空闲中断接收数据,比较实用的串口通信操作!
  • STM32F103通过串口DMA空闲中断的方式进行数据接收,该代码已经经过项目验证。
  • 串口2我找了一个UBLOX卫星模块,每秒输出不定长的定位信息数据; 首先肯定要先打开串口空闲中断,cubemx里面没有这个空闲中断的开启图形界面,需要自己敲代码打开。 然后开启DMA接收; 最后串口接收到空闲中断标志后...
  • 最近使用一个2.4G无线模块,做主机从机之间通信,取代原先485有线通信,由于使用的是串口透传模块,简单改了一下标志位,就开始调试程序了。 1、串口助手连无线模块,能发送接收 (正常) 2、主电脑分别当主从机...
  • stm32串口使用DMA模式接收发送数据 在cubeMX中调整DMA相关设置 在DMA Setting里点击Add添加USART1_TX,Mode有两种模式, 种是普通模式,使用次发送语句就发次; 另种是循环模式,使用次发送会一直发送。 ...
  • STM32 DMA串口接收不定长数据

    千次阅读 2020-03-15 12:23:03
    STM32 DMA串口接收不定长数据
  • STM32F103CBT6 DMA (串口DMA发送接收

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,731
精华内容 5,092
关键字:

串口dma只能接收一个数据