OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5035|回复: 9

STM32使用串口+DMA接收不定长的超大数据,处理方法?

[复制链接]

14

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-6-12
在线时间
83 小时
发表于 2017-7-14 14:56:37 | 显示全部楼层 |阅读模式
5金钱
STM32F103中等容量的芯片,RAM为20K。但是我要接收上位机PC传送来的TFT屏的显示图片数据(约300K字节),然后存储到外部FLAHS中:使用串口USART2+DMA方式接收数据,使用SPI方式存储和读取FLASH中的数据到TFT屏。
由于受芯片RAM的限制,没有那么大的RAM来存储接收的数据,所以针对此情况,有什么方法来处理啊?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2017-7-14 15:01:41 | 显示全部楼层
回复

使用道具 举报

14

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-6-12
在线时间
83 小时
 楼主| 发表于 2017-7-14 15:05:02 | 显示全部楼层
msq001 发表于 2017-7-14 15:01
分段接啊.........

能详细说一下如何处理吗?由于接收的数据有多种类型,每种类型的数据长度不定,我查了资料,打算使用空闲中断IDLE+DMA接收,在这种方式的情况下,如何分段啊?
回复

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2017-7-14 15:11:22 | 显示全部楼层
阳光2260 发表于 2017-7-14 15:05
能详细说一下如何处理吗?由于接收的数据有多种类型,每种类型的数据长度不定,我查了资料,打算使用空闲 ...

要和上位机配合,电脑先发一段数据,等待stm32先把这段数据处理后给电脑一个应答信号,电脑接着发下一段
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-14 15:17:11 | 显示全部楼层
我觉得你可以试试DMA循环模式。开个几K的缓冲区,UART循环着往里写,SPI循环着往外读。但是这样需要两个标志标识UART和SPI各自的读写位置,防止SPI超过UART,需要一定的CPU介入,而且不知道好不好写,没试过。。。。
回复

使用道具 举报

14

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-6-12
在线时间
83 小时
 楼主| 发表于 2017-7-14 15:17:31 | 显示全部楼层
msq001 发表于 2017-7-14 15:11
要和上位机配合,电脑先发一段数据,等待stm32先把这段数据处理后给电脑一个应答信号,电脑接着发下一段

这样的话,时间就更慢了
回复

使用道具 举报

14

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-6-12
在线时间
83 小时
 楼主| 发表于 2017-7-14 15:20:19 | 显示全部楼层
Owen 发表于 2017-7-14 15:17
我觉得你可以试试DMA循环模式。开个几K的缓冲区,UART循环着往里写,SPI循环着往外读。但是这样需要两个标 ...

恩,你这种方法应该可行的。
回复

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2017-7-14 15:20:26 | 显示全部楼层
阳光2260 发表于 2017-7-14 15:17
这样的话,时间就更慢了

..........哪里会慢了?
回复

使用道具 举报

14

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-6-12
在线时间
83 小时
 楼主| 发表于 2017-7-14 15:33:03 | 显示全部楼层
Owen 发表于 2017-7-14 15:17
我觉得你可以试试DMA循环模式。开个几K的缓冲区,UART循环着往里写,SPI循环着往外读。但是这样需要两个标 ...

你好,我仔细想了一下你说的方法,有点困难。
主要是速度的问题,如果控制好速度的话,应该没问题。
DMA不需要CPU,直接后台就可以接收,万一SPI还没来得及处理数据,DMA接收的数据就会覆盖之前的数据的。
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-14 15:57:20 | 显示全部楼层
阳光2260 发表于 2017-7-14 15:33
你好,我仔细想了一下你说的方法,有点困难。
主要是速度的问题,如果控制好速度的话,应该没问题。
DM ...

所以缓冲区不能太小。我觉得可以考虑配合定时器。把SPI的速度开的非常快,然后每次计时一定值之后开启SPI读走缓冲区中的数据。只要定时器的间隔小于UART填满缓冲区所需时间的一半应该就可以做到UART写一半,SPI读另外一半。当然定时间隔不能太短,不然SPI读不完。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-6 00:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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