请选择 进入手机版 | 继续访问电脑版
查看: 273|回复: 15

[求助] rt1052 串口DMA接收 与emwin的2d重绘图形 冲突?(急)

[复制链接]

该用户从未签到

5

主题

25

帖子

0

金豆

注册会员

Rank: 2

积分
175
最后登录
2021-5-13
发表于 2021-4-13 10:25:39 | 显示全部楼层 |阅读模式
请教一下 mcu:rt1052 s
dk :2.3.1
emwin :v5.50
在没有使用串口DMA时,emwin可以正常绘制曲线和柱图,emwin的相关显存:
SDK_ALIGN(uint8_t s_gui_memory[GUI_NUMBYTES ], FRAME_BUFFER_ALIGN);
AT_NONCACHEABLE_SECTION_ALIGN(uint8_t s_vram_buffer[VRAM_SIZE * GUI_BUFFERS], FRAME_BUFFER_ALIGN);
在使用串口DMA接收数据时,发现一旦有emwin绘画曲线或者柱图,串口dma有空闲中断但是接收到的数据量一直为0.串口的相关参数都放在NONCACHEABLE区域:
AT_NONCACHEABLE_SECTION_INIT(uint8_t measure_lpuart_ringBuffer[MEASURE_LPUART_RING_BUFFER_SIZE]) = {0}; AT_NONCACHEABLE_SECTION_ALIGN(static edma_tcd_t tcdMemoryPoolPtr[1], sizeof(edma_tcd_t));
AT_NONCACHEABLE_SECTION_INIT(uint8_t g_measure_rx_buf[MEASURE_LPUART_RING_BUFFER_SIZE]) = {0}; AT_NONCACHEABLE_SECTION_INIT(uint8_t g_measure_lpuart_send_buf[512]) = {0};


可能是啥原因
回复

使用道具 举报

该用户从未签到

362

主题

5645

帖子

0

金豆

超级版主

Rank: 8Rank: 8

积分
10887
最后登录
2021-5-13
发表于 2021-4-13 18:14:43 | 显示全部楼层
本帖最后由 小恩GG 于 2021-4-13 18:15 编辑

楼主你好,你那边debug看下,UART的寄存器状态标志,是否有出错信息?
另外,你如果先屏蔽emwin,直接做你的DMA UART,是否能准确接收到数据,我要看看你这个问题是单独的模块问题,还是复合性的问题。


回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

25

帖子

0

金豆

注册会员

Rank: 2

积分
175
最后登录
2021-5-13
 楼主| 发表于 2021-4-14 08:10:18 | 显示全部楼层
本帖最后由 wx提线木偶 于 2021-4-14 08:12 编辑
小恩GG 发表于 2021-4-13 18:14
楼主你好,你那边debug看下,UART的寄存器状态标志,是否有出错信息?
另外,你如果先屏蔽emwin,直接做你 ...

emwin文本刷新数值,串口DMA可以正常接收到,一旦绘画柱形图如下图,在窗口的WM_PAINT消息里的绘画2D图形,就会出现上面的情况;单独做串口DMA测试没有问题
1.png
回复 支持 反对

使用道具 举报

该用户从未签到

362

主题

5645

帖子

0

金豆

超级版主

Rank: 8Rank: 8

积分
10887
最后登录
2021-5-13
发表于 2021-4-14 14:14:16 | 显示全部楼层
wx提线木偶 发表于 2021-4-14 08:10
emwin文本刷新数值,串口DMA可以正常接收到,一旦绘画柱形图如下图,在窗口的WM_PAINT消息里的绘画2D图形 ...

应该是两个模块同时控制有冲突了,这种情况下,如果UART的数据更重要,你可以设置UART模块的优先级比你emwin用到的模块的优先级更高些,这样测试看看是否有所改善?
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

25

帖子

0

金豆

注册会员

Rank: 2

积分
175
最后登录
2021-5-13
 楼主| 发表于 2021-4-14 14:46:03 | 显示全部楼层
本帖最后由 wx提线木偶 于 2021-4-14 17:19 编辑
小恩GG 发表于 2021-4-14 14:14
应该是两个模块同时控制有冲突了,这种情况下,如果UART的数据更重要,你可以设置UART模块的优先级比你em ...

1、您是指串口DMA与elcdif 的DMA优先级吗?我这个运行是裸机的。2、请教一下下面在emwin_support.c里配置的两个内存,因为在sdk2.3.1的示例代码里面,s_gui_memory和s_vram_buffer都是AT_NONCACHEABLE_SECTION_ALIGN对齐,最终导致emwin运行缓慢,改成下面那样速度才会快,所以这个AT_NONCACHEABLE_SECTION_ALIGN一般是不是只有在与DMA相关的才会用?
3、我这个串口dma接收是参考sdk里edma_rb_transfer例子的,请教一下图3的红色圈的部分是什么作用,这个32是跟着EXAMPLE_RING_BUFFER_SIZE来的?
2.png
回复 支持 反对

使用道具 举报

该用户从未签到

362

主题

5645

帖子

0

金豆

超级版主

Rank: 8Rank: 8

积分
10887
最后登录
2021-5-13
发表于 2021-4-16 15:58:57 | 显示全部楼层
wx提线木偶 发表于 2021-4-14 14:46
1、您是指串口DMA与elcdif 的DMA优先级吗?我这个运行是裸机的。2、请教一下下面在emwin_support.c里配置的 ...

1. 主要看你是否使用了UART和elcdif的中断,如果使用中断方式会涉及到优先级的问题。
2. AT_NONECACHEABLE,从我们的cache 应用笔记中看,使用DMA的时候需要注意cache的问题,所以放到nocache也是可以的,另外还有以太网,SDHC需要注意nonecache的问题。
https://www.nxp.com/docs/en/application-note/AN12042.pdf
4.3.1. Use cacheable buffers
Normally buffers on the OCRAM, SDRAM are Cacheable and Write-Back. It can be in the stack, static section or allocated from heap. To use such buffer as DMA source, user must perform a DCACHE clean operation is done before DMA started, this makes sure all of the data are committed to the memory from cache. If buffer is used as DMA receive destination, a DCACHE invalidate operation must be done after DMA completed and before CPU or other masters read. The buffer address should be L1 cache line size aligned (32 bytes in i.MXRT).

3. 没有看到你的图3,可能上传失败了。
我估计和你一次传输的数据有关,具体你可以看下RM DMA的情况
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

25

帖子

0

金豆

注册会员

Rank: 2

积分
175
最后登录
2021-5-13
 楼主| 发表于 2021-4-28 14:00:56 | 显示全部楼层
本帖最后由 wx提线木偶 于 2021-4-28 14:08 编辑
小恩GG 发表于 2021-4-16 15:58
1. 主要看你是否使用了UART和elcdif的中断,如果使用中断方式会涉及到优先级的问题。
2. AT_NONECACHEABL ...

中断优先级没关系,还有发现在multipage频繁切换页面也会导致这个dma问题,  还是不知道怎么处理好,小恩GG救命,难道是edma的TCD问题?
回复 支持 反对

使用道具 举报

该用户从未签到

362

主题

5645

帖子

0

金豆

超级版主

Rank: 8Rank: 8

积分
10887
最后登录
2021-5-13
发表于 2021-4-28 16:07:32 | 显示全部楼层
wx提线木偶 发表于 2021-4-28 14:00
中断优先级没关系,还有发现在multipage频繁切换页面也会导致这个dma问题,  还是不知道怎么处理好,小恩 ...

你有没有尝试把stack和heap搞大点,看看会不会有改善?
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

25

帖子

0

金豆

注册会员

Rank: 2

积分
175
最后登录
2021-5-13
 楼主| 发表于 2021-4-28 17:22:00 | 显示全部楼层
本帖最后由 wx提线木偶 于 2021-4-29 14:37 编辑
小恩GG 发表于 2021-4-28 16:07
你有没有尝试把stack和heap搞大点,看看会不会有改善?

加大了一样,您那边能不能就是测试一下emwin刷2d图形(周期300ms)+串口dma+rb接收(周期100ms),看能不能复现,这个问题就是时间不一样,但是最终会出现,比如一直可以接收到50个字节,过一段时间就突然变成少于50字节,接着都是0字节,感觉就是被打断然后串口dma挂掉了。或者有没有其他串口dma接收不定长数据的例子
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

25

帖子

0

金豆

注册会员

Rank: 2

积分
175
最后登录
2021-5-13
 楼主| 发表于 2021-4-30 10:06:27 | 显示全部楼层
本帖最后由 wx提线木偶 于 2021-4-30 14:17 编辑
小恩GG 发表于 2021-4-28 16:07
你有没有尝试把stack和heap搞大点,看看会不会有改善?

调试发现串口出现这个错误,数据丢失。看来是串口接收缓存溢出,但是柱图刷新大概耗时6~7ms,300ms刷一次,怎么会影响到呢?OR溢出错误,应该是dma读取不及时,导致串口接收溢出,如果是这样的话,lcdif的DMA会影响串口DMA? lcdif也没有配置dma
1.png
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /2 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2021-5-14 00:25 , Processed in 0.125968 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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