精华内容
下载资源
问答
  • 项目中要用到串口,要求用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搞定。

    展开全文
  • PC侧,向单片机发送数据,发现单片机接收数据时,只能接收串口数据的最后一个字节,并且接收到的数据长度是正确的。数据长度正确,数据错误。 处理: 网上搜索到一个结果:...

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

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

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

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

    运行结果:

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

    展开全文
  • 项目是用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时钟打开了。

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

    原文链接:https://blog.csdn.net/lutigers/article/details/103910090

    HAL库串口DMA的大坑—DMA只能读取最后一个字节

    项目中要用到串口的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时钟打开了。

    展开全文
  • 发现串口接受不到数据只能接受到第一个字节。 UART4_InitVariables(); HAL_Delay(200); HAL_UART_Receive_DMA(&huart4, UART_DMA_RXBuf, UART_RX_BUF_SIZE); 原因分析: 在单片机执行完串口初始化之后...
  • 一个低级错误,采用STM32 HAL库,由于DMA时钟...导致串口接受的时候,只能接收到最后一个字节,而发送正常,一直以为配置的MEM INC这里出问题,知道问题是在DMA配置这里,后来才发现DMA时钟是后面才配置,记录一下 ...
  • //串口DMA接收中断调用的回调函数和串口接收中断是同一个 uint8_t rxch[5]; uint8_t trch[]="transmit dma:\r\n"; int main(void) { HAL_UART_Transmit_DMA(&huart1,trch,15); HAL_UART_Receive_DMA(&huart1...
  • 最近在项目中给串口接收添加DMA,遇到的问题: ...每个DMA控制器都分管着不同的外设DMA请求,通过查表发现串口1的接收只能映射到DMA1的通道5.因此DMA的通道选择错误。现粘贴串口一的中断处理程...
  • 串口一次只能传1byte数据,在实际应用中,我们会发送和接收一串数据,如果没发送和接收一个数据就会进去中断会严重影响程序的正常执行,占用过多的cpu资源。如果串口模块能够自动判别一串数据的结束,并且把接收数据...
  • 使用的时候发现:接收一个字节立即用DMA的方式发送出去,会出现数据的丢失,如用串口调试助手发送1234,返回的只有13 目前只能用缓存buf+协议结束(如0x0d,0x0a)的方式解决。 stm32cubeMX的配置界面如下: 1.使用...
  • 由于 <code>const rt_uint8_t *buf</code> 指向的是一个只读缓冲区,则无法传入上层接收缓冲区的地址。 - 2、DMA 方式的串口设备读取流程? 我以往的串口设备读取数据的流程是,先调用 <code>rt_...
  • 而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下:方法1:实现思路:采用STM32F103的串口1,并配置成空闲中断...
  • 而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下:方法1:实现思路:采用STM32F103的串口1,并配置成空闲中断...
  • STM32串口调试

    千次阅读 2018-11-14 17:22:44
    上一篇博客发现串口DMA中断在接受一次数据时,会进入两次中断,经过一天的调试还是没有找到原因,后来又发现一个问题:当使用ADC1DMA时,串口DMA只能进入两次中断,之后上位机再发送数据,也不会进入串口DMA接收中断...
  • USART6_DMA_NVIC.zip

    2020-02-02 14:25:48
    串口空闲IDEL中断+DMA(可接受任意长度的...现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,利用串口IDLE空闲中断的方式接收一帧数据。
  • 一般方式操作串口时,读写数据都是只操作DR(数据寄存器),虽然它是由两个寄存器组成的,一个给发送用(TDR),一个接收用(RDR),但是用户只能操作DR寄存。而DMA模式下,串口发送和接收分属两个DMA通道,需要...
  • 昨天分享了整个程序的架构,今天重点分析一下串口接收数据这块的机制,...中断模式为非堵塞模式,也是平时用的比较多的,但每次只能接收一个字节;还有一个比较好的方法那就是用串口的空闲中断+DMA实现串口数据的接收
  • 最近在一个项目中要用到串口实现不定长数据接收,查资料一般有两种方式,一个串口DMA+IDLE中断,另一个是加定时器,可惜我用的华大半导体HCF030芯片,不支持串口IDLE中断,那么只能考虑加定时器这种方式了。...
  • 一个串口DMA收发数据一个是串口中断方式收发数据。先看这个。 看完HyperTerminal_IT demo后,挺失望的,这个demo只能收发定长数据。 在实际场景中,发送是可以定长的。 但是接收,不可能是定长的(要是对方没...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

串口dma只能接收一个数据