OpenEdv-开源电子网

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

stm32f767接收高频率的传感器数据实时存入SD卡应该怎样设计

[复制链接]

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-7-15
在线时间
47 小时
发表于 2020-12-18 09:58:07 | 显示全部楼层 |阅读模式
20金钱
各位大佬,我现在有一个600HZ 的传感器通过USART传入,需要其中某一条为100HZ的信息,大小为16的字节,我在串口中断里面逐个字节判断将这条信息找出来,然后传递给main函数里面,在main里面存到一个大数组里,累计存1000条,然后再存入SD卡中,这样写的结果是存两秒钟就会卡死。想求助一下实现这样的功能应该怎样设计。

最佳答案

查看完整内容[请看2#楼]

配置2个乒乓缓存,串口DMA接收一定量数据到其中一个缓存,同时CPU对另外一个缓存中的数据进行提取搬运,复制到SD卡。完成后等待另外一个缓存满,满了后切换DMA的目标,使数据流流向刚刚处理过的缓存空间,而CPU对刚刚满的缓存进行数据处理。利用DMA传输过程CPU不干预的特性空出CPU资源来处理数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2020-12-18 09:58:08 | 显示全部楼层
本帖最后由 ricefat 于 2020-12-21 11:01 编辑

配置2个乒乓缓存,串口DMA接收一定量数据到其中一个缓存,同时CPU对另外一个缓存中的数据进行提取搬运,复制到SD卡。完成后等待另外一个缓存满,满了后切换DMA的目标,使数据流流向刚刚处理过的缓存空间,而CPU对刚刚满的缓存进行数据处理。利用DMA传输过程CPU不干预的特性空出CPU资源来处理数据。
回复

使用道具 举报

5

主题

355

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4508
金钱
4508
注册时间
2019-4-30
在线时间
891 小时
发表于 2020-12-18 11:42:31 | 显示全部楼层
我可以帮你呀,QQ 1281854907 答案 万达
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2020-12-18 13:50:55 | 显示全部楼层
将数据   以  bin文件的格式存储在SD卡,省空间
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-7-15
在线时间
47 小时
 楼主| 发表于 2020-12-18 14:00:26 | 显示全部楼层
jiangyy 发表于 2020-12-18 13:50
将数据   以  bin文件的格式存储在SD卡,省空间

还是不行,之前用的dat
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1014
金钱
1014
注册时间
2014-4-7
在线时间
98 小时
发表于 2020-12-18 14:05:59 | 显示全部楼层
使用一个FIFO
串口中断中将需要的信息存入FIFO
main函数中将FIFO中的数据写入SD卡即可

想要匹配速度:
1. 将FIFO的空间增大
2. main中判断FIFO的有效数据,当其为一定的数据量后一次性出队并写入SD卡,保证写卡的时间内FIFO有足够的剩余空间存串口中断的数据
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-7-15
在线时间
47 小时
 楼主| 发表于 2020-12-18 18:17:29 | 显示全部楼层
亲亻尔嘴 发表于 2020-12-18 14:05
使用一个FIFO
串口中断中将需要的信息存入FIFO
main函数中将FIFO中的数据写入SD卡即可

谢谢大佬,我试试
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-7-15
在线时间
47 小时
 楼主| 发表于 2020-12-19 16:01:50 | 显示全部楼层
亲亻尔嘴 发表于 2020-12-18 14:05
使用一个FIFO
串口中断中将需要的信息存入FIFO
main函数中将FIFO中的数据写入SD卡即可

请问运行了有半分钟到一分钟左右正常,但后面就会卡死是怎么回事呢
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2020-12-20 10:07:25 | 显示全部楼层
captainhn 发表于 2020-12-19 16:01
请问运行了有半分钟到一分钟左右正常,但后面就会卡死是怎么回事呢

挂上Jlink看看死的时候PC/LR指针在哪,看一下调用栈到底死在哪里

你这种一般是指针没用好导致访问了无效内存产生HardFault中断。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1014
金钱
1014
注册时间
2014-4-7
在线时间
98 小时
发表于 2020-12-21 15:50:14 | 显示全部楼层
captainhn 发表于 2020-12-19 16:01
请问运行了有半分钟到一分钟左右正常,但后面就会卡死是怎么回事呢

这要看具体死在哪
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-7-15
在线时间
47 小时
 楼主| 发表于 2020-12-21 21:12:39 | 显示全部楼层
ricefat 发表于 2020-12-21 11:00
配置2个乒乓缓存,串口DMA接收一定量数据到其中一个缓存,同时CPU对另外一个缓存中的数据进行提取搬运,复 ...

大佬,还有个问题,就是我的项目里还需要给这100HZ的数据添加上来时刻的时刻信息,然后再存入SD卡,如果串口采用DMA缓存,过后再提取的话,我就不知道里面具体每一条信息的时刻了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2020-12-22 22:05:46 | 显示全部楼层
你这个数据量完全不大啊
回复

使用道具 举报

17

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2019-3-26
在线时间
105 小时
发表于 2020-12-23 09:15:47 | 显示全部楼层
存两秒就卡死说明程序有问题,检测你的数组是否溢出了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2020-10-26
在线时间
7 小时
发表于 2021-1-3 11:30:21 | 显示全部楼层
captainhn 发表于 2020-12-19 16:01
请问运行了有半分钟到一分钟左右正常,但后面就会卡死是怎么回事呢

老哥,你这个问题怎么解决的?我现在能把串口上传的单个数据保存到文件中。但是如何将串口上传的数据批量保存到文件中(每满50个数据,则将这50个数据保存到文件中)
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-7-15
在线时间
47 小时
 楼主| 发表于 2021-1-11 09:45:00 | 显示全部楼层
Flying27 发表于 2021-1-3 11:30
老哥,你这个问题怎么解决的?我现在能把串口上传的单个数据保存到文件中。但是如何将串口上传的数据批量 ...

采用上面说的两个缓冲区,实现乒乓操作,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 02:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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