野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10633|回复: 13

串口DMA接收问题

[复制链接]
发表于 2019-8-15 09:05:46 | 显示全部楼层 |阅读模式
emXGUI /emWin 在窗口中调用InvalidateRect/ WM_InvalidateWindow 无效化窗口,调用的频率较快时(200ms),串口DMA接收一段时间后就不能触发了,数据长度较长时(150字节)出现的概率越高; 串口中断为空闲中断,DMA的接收BUF最大长度为150。 如果不调用无效化窗口则没有问题,如果把串口的波特率降低到4800后也没有问题(测试了一天接收)。   
FUKE@EZBF])]TF]J9G6$FMV.png
回复

使用道具 举报

 楼主| 发表于 2019-8-15 09:08:51 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-15 13:53:21 | 显示全部楼层
提取码: 5sap
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-15 13:55:13 | 显示全部楼层
@fire  帮忙看一下
回复 支持 反对

使用道具 举报

发表于 2019-8-15 17:53:09 | 显示全部楼层
有没有尝试过在中断服务函数加上临界段
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-15 19:24:42 | 显示全部楼层
君负花开 发表于 2019-8-15 17:53
有没有尝试过在中断服务函数加上临界段

测试了,没有用的
回复 支持 反对

使用道具 举报

发表于 2019-8-28 16:05:10 | 显示全部楼层
使用串口的时候遇到过,串口在接收了4个字节后,无法接收数据的问题;使用的是串口的接收中断,freeRTOS,没有使用DMA;解决方法是:在任务函数里将串口中断里用到的变量加临界区保护,在进入中断时关闭中断使能,退出中断前打开中断使能;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-28 17:46:10 | 显示全部楼层
芯芯相惜 发表于 2019-8-28 16:05
使用串口的时候遇到过,串口在接收了4个字节后,无法接收数据的问题;使用的是串口的接收中断,freeRTOS, ...

我串口接收都正常的呀,中断也正常的呀, 就是DMA请求没有数据
回复 支持 反对

使用道具 举报

发表于 2019-8-29 09:06:43 | 显示全部楼层
本帖最后由 芯芯相惜 于 2019-8-29 09:59 编辑
xieyoub 发表于 2019-8-28 17:46
我串口接收都正常的呀,中断也正常的呀, 就是DMA请求没有数据

那就不是同一个问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-21 19:24:07 | 显示全部楼层
                          头大
回复 支持 反对

使用道具 举报

发表于 2019-10-24 16:42:36 | 显示全部楼层
DMA 的接收内存块和 显存是在同一片 ram 吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-24 16:57:58 | 显示全部楼层
castellan 发表于 2019-10-24 16:42
DMA 的接收内存块和 显存是在同一片 ram 吗

应该是区分开,
这个是emwin头文件中 定义的大数组
AT_NONCACHEABLE_SECTION_ALIGN(uint8_t s_gui_memory[GUI_NUMBYTES * LCD_BYTES_PER_PIXEL], FRAME_BUFFER_ALIGN);
AT_NONCACHEABLE_SECTION_ALIGN(uint8_t s_vram_buffer[VRAM_SIZE * GUI_BUFFERS * LCD_BYTES_PER_PIXEL], FRAME_BUFFER_ALIGN);

这个是分散加载文件:
#define m_sdram_interrupts_start       0x80020000               
#define m_sdram_interrupts_size        0x00000400

;SDRAM中的主体代码
#define m_sdram_text_start             0x80020400               
;分配2M的代码空间
#define m_sdram_text_size              0x002DFC00

#define m_data_start                   0x80300000
#define m_data_size                    0x00100000

#define m_ncache_start                 0x80400000
#define m_ncache_size                  0x01C00000

#define m_data2_start                  0x20000000
#define m_data2_size                   0x00020000

#define m_data3_start                  0x20200000
#define m_data3_size                   0x00040000

/* Sizes */
#if (defined(__stack_size__))
  #define Stack_Size                   __stack_size__
#else
  #define Stack_Size                   0x10000
#endif

#if (defined(__heap_size__))
  #define Heap_Size                    __heap_size__
#else
  #define Heap_Size                    0x0A000
#endif


LR_m_text m_sdram_interrupts_start m_sdram_text_start+m_sdram_text_size-m_sdram_interrupts_size {   ; load region size_region
  
  ; 在FALSH中的中断向量表
  VECTOR_ROM m_sdram_interrupts_start m_sdram_interrupts_size { ; load address = execution address
    * (RESET,+FIRST)
  }
  
  ER_m_text m_sdram_text_start m_sdram_text_size { ; load address = execution address
    * (InRoot$$Sections)
        .ANY (+RO)
  }
  
  RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
    .ANY (+RW +ZI)
    *(m_usb_dma_init_data)
    *(m_usb_dma_noninit_data)
  }
  ARM_LIB_HEAP +0 EMPTY Heap_Size {    ; Heap region growing up
  }
  ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
  }
  RW_m_ncache m_ncache_start m_ncache_size { ; ncache RW data
    * (NonCacheable.init)
    * (NonCacheable)
  }

}
回复 支持 反对

使用道具 举报

发表于 2019-10-25 11:18:13 | 显示全部楼层
在你的内部 sram 或者 dtcm 里面定义一段为 NOCacheable ,然后把你的 DMA 接受内存放在这个段里面,emwin 的就在 SDRAM 里面
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-30 19:57:34 | 显示全部楼层
castellan 发表于 2019-10-25 11:18
在你的内部 sram 或者 dtcm 里面定义一段为 NOCacheable ,然后把你的 DMA 接受内存放在这个段里面,emwin 的 ...

嗯, 好的, 得研究下DTCM如何配置了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 04:53 , Processed in 0.052042 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表