OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: 1201yuge

STM32使用串口1配合DMA接收不定长数据,大大减轻CPU载荷。

  [复制链接]

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
发表于 2018-1-6 19:58:02 | 显示全部楼层
这个很有实用价值,保存下来封装一下留着复用。
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

0

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2017-12-21
在线时间
76 小时
发表于 2018-1-8 01:20:44 | 显示全部楼层
51单片机的串口没有DMA都能运行几十年,你这么说"会严重影响主程序的运行"?
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-3-28
在线时间
29 小时
发表于 2018-3-25 17:00:09 | 显示全部楼层
下载了您的资料,谢谢
回复 支持 反对

使用道具 举报

159

主题

965

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2084
金钱
2084
注册时间
2014-3-7
在线时间
489 小时
发表于 2018-3-27 11:58:15 | 显示全部楼层
其实可以用一个定时器来判断数据是否接收完了,毕竟空闲中断判断的时间太短只有一个字节长度,
回复 支持 1 反对 0

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2013-5-21
在线时间
13 小时
发表于 2018-4-26 10:46:05 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

37

主题

142

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2016-9-13
在线时间
73 小时
发表于 2018-7-6 11:20:51 | 显示全部楼层
不进idle中断。。
回复 支持 反对

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2013-11-21
在线时间
42 小时
发表于 2018-7-8 17:21:48 | 显示全部楼层
下过来立马试一试
回复 支持 反对

使用道具 举报

26

主题

357

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-7-10 08:32:42 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

17

主题

237

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1312
金钱
1312
注册时间
2017-3-1
在线时间
259 小时
发表于 2018-7-10 08:37:22 | 显示全部楼层
用过空闲中断,挺厉害的!
回复 支持 反对

使用道具 举报

0

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2017-7-17
在线时间
166 小时
发表于 2018-7-11 15:14:11 | 显示全部楼层
谢谢好资料,学习学习,谢谢!
回复 支持 反对

使用道具 举报

8

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-5-4
在线时间
26 小时
发表于 2018-7-14 09:14:02 | 显示全部楼层
好东西 谢谢分享 刚好用得到
回复 支持 反对

使用道具 举报

2

主题

472

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5722
金钱
5722
注册时间
2018-6-27
在线时间
502 小时
发表于 2018-7-16 09:30:28 | 显示全部楼层
学习学习,谢谢分享!
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-6-4
在线时间
16 小时
发表于 2018-7-18 22:50:17 | 显示全部楼层
假设这帧数据长度是100个字节,那么在单片机接收到一个字节的时候并不会产生串口中断
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-6-4
在线时间
16 小时
发表于 2018-7-18 22:50:49 | 显示全部楼层
假设这帧数据长度是100个字节,那么在单片机接收到一个字节的时候并不会产生串口中断
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-6-4
在线时间
16 小时
发表于 2018-7-18 22:59:29 | 显示全部楼层
yw123 发表于 2018-7-18 22:50
假设这帧数据长度是100个字节,那么在单片机接收到一个字节的时候并不会产生串口中断

突然理解上面的话了,不好意思
回复 支持 反对

使用道具 举报

8

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
306
金钱
306
注册时间
2017-10-19
在线时间
77 小时
发表于 2018-8-18 13:43:36 | 显示全部楼层
大神我的为啥多两个长度啊
回复 支持 反对

使用道具 举报

8

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
306
金钱
306
注册时间
2017-10-19
在线时间
77 小时
发表于 2018-8-18 13:43:49 | 显示全部楼层
本帖最后由 学海无涯回头岸 于 2018-8-18 13:46 编辑

1.jpg
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-10-10
在线时间
3 小时
发表于 2018-10-15 22:37:04 | 显示全部楼层
楼主好,附件中的代码没有DMA相关程序呀,是不是附件不对?
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-10-16 09:14:55 | 显示全部楼层
mark,做标记,学习DMA时可以借鉴。论坛里面怎么没有加关注的功能呢?
回复 支持 反对

使用道具 举报

1

主题

36

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-10-14
在线时间
9 小时
发表于 2018-10-16 12:27:47 | 显示全部楼层
学习啦。,大神解决了我思考好久的问题。
回复 支持 反对

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-11-13 22:57:52 来自手机 | 显示全部楼层
明天开始研究这个
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3823
金钱
3823
注册时间
2018-11-14
在线时间
300 小时
发表于 2018-11-14 17:52:12 | 显示全部楼层
这是好东西啊!
回复 支持 反对

使用道具 举报

17

主题

170

帖子

0

精华

高级会员

Rank: 4

积分
562
金钱
562
注册时间
2018-7-8
在线时间
118 小时
发表于 2018-11-15 18:19:48 | 显示全部楼层
//串口中断函数
void USART1_IRQHandler(void)        //串口1中断服务程序
{
#ifdef OS_TICKS_PER_SEC             //如果时钟节拍数定义了,说明要使用ucosII了.
    OSIntEnter();
#endif

        //接收中断(接收到的数据必须是0x0d 0x0a结尾),等价于先读USART1—>SR
    if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  
    {
                //读取数据 注意:这句必须要,否则不能够清除中断标志位。
                //IDLE必须是有软件序列清除,先读USART1—>SR,再读USART1—>DR
        USART_ReceiveData(USART1);        //等价于读USART1—>DR
               
        Usart1_Rec_Cnt = DMA_Rec_Len - DMA_GetCurrDataCounter(DMA1_Channel5);   //算出接本帧数据长度

        //***********帧数据处理函数************//
        printf("\r\nThe lenght:%d\r\n",Usart1_Rec_Cnt);
        printf("The data:\r\n");
        Usart1_Send(DMA_Rece_Buf,Usart1_Rec_Cnt);
        printf("Over! \r\n");
        //*************************************//
        USART_ClearITPendingBit(USART1, USART_IT_IDLE);         //清除中断标志
        MYDMA_Enable(DMA1_Channel5);                   //恢复DMA指针,等待下一次的接收
    }

#ifdef OS_TICKS_PER_SEC     //如果时钟节拍数定义了,说明要使用ucosII了.
    OSIntExit();
#endif
}

你好,请问这里面的USART_ClearITPendingBit(USART1, USART_IT_IDLE);         //清除中断标志可以删掉吗,
库函数中,说明了,
a read operation to USART_SR register
  *     (USART_GetITStatus()) followed by a read operation to USART_DR register
  *     (USART_ReceiveData()).
回复 支持 反对

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-11-19 22:57:04 来自手机 | 显示全部楼层
本帖最后由 wen619 于 2018-11-19 22:58 编辑

有一个问题 :串口芯片 比如8266返回的一帧数据 比如一共是600字节,前12字节引发一次空闲中断,剩下的588字节发完又引发一次空闲中断。如果依靠空闲中断接收数据 就有问题了,一次接收不完啊。这可咋办
回复 支持 3 反对 0

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2018-11-28
在线时间
35 小时
发表于 2019-1-14 13:17:10 | 显示全部楼层
支持!!!!!!!!!
回复 支持 反对

使用道具 举报

0

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-3-21
在线时间
45 小时
发表于 2019-1-14 13:31:29 | 显示全部楼层

好帖!谢谢分享!
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-12-25
在线时间
18 小时
发表于 2019-1-17 22:08:59 | 显示全部楼层
mark。。。。。。空闲中断
回复 支持 反对

使用道具 举报

16

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2019-3-11
在线时间
50 小时
发表于 2019-4-28 15:43:06 | 显示全部楼层
1201yuge 发表于 2015-12-2 15:45
回复【3楼】ianhom:
---------------------------------
试过,循环覆盖了。要是接收的数据实在是很长,可 ...

有个问题:在DMA完成接收中断如何判断接收到的数据长度?用DMA_GetCurrDataCounter(DMA1_Channel5)好像不行,一直为0的,有什么其他方法吗?
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2019-4-27
在线时间
19 小时
发表于 2019-5-11 14:32:32 | 显示全部楼层
学习一下先
回复 支持 反对

使用道具 举报

2

主题

56

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1394
金钱
1394
注册时间
2014-12-31
在线时间
187 小时
发表于 2019-5-11 15:28:19 | 显示全部楼层
钩月黄昏 发表于 2016-2-24 13:34
试验了两个晚上的结果:1,开启了串口接收完成中断则无法进入空闲中断,2,在DMA中设立DMA接收完成中断,并 ...

1,开启了串口接收完成中断则无法进入空闲中断
这个说法是错误的。开启串口接收完成中断跟空闲中断无关。
你进入中断后,读取中断标志位,就可以分开进行相关事件的处理。
回复 支持 反对

使用道具 举报

2

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2014-8-31
在线时间
33 小时
发表于 2019-7-2 09:36:07 | 显示全部楼层
it_do_just 发表于 2016-1-21 08:49
空闲中断估计很少人用过,科普一下吧(网上资料显示):
总线空闲中断是在检测到在接收数据后,数据总线上一 ...

谢谢大神
回复 支持 反对

使用道具 举报

2

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2014-8-31
在线时间
33 小时
发表于 2019-7-2 09:36:36 | 显示全部楼层
谢谢楼主,都2019年了,我才来学习这个
回复 支持 反对

使用道具 举报

9

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
620
金钱
620
注册时间
2018-2-4
在线时间
62 小时
发表于 2019-7-2 10:47:04 | 显示全部楼层
这个资料不错,下载了学习。
回复 支持 反对

使用道具 举报

9

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
620
金钱
620
注册时间
2018-2-4
在线时间
62 小时
发表于 2019-7-2 10:47:42 | 显示全部楼层
怎么下载不了了?
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-7-27
在线时间
52 小时
发表于 2019-7-4 22:25:28 | 显示全部楼层
下载不了啊 大神
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
发表于 2019-7-5 13:00:02 | 显示全部楼层
用CubeMX直接串口,DMA搞定,之前焊接完板子直接就这个干测板子硬件
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-7-10
在线时间
10 小时
发表于 2019-7-12 14:28:28 | 显示全部楼层
问个问题,我在用DMA接受电脑串口发来的数据的时候 在while里面有个HAL_UART_Receive_DMA,,然后接受到的数据地址会一直向后移,比如我规定发送5个字节1122334455(hex),第一次 数组是1122334455,发第二次 就是11223344551122334455,每次发的都会向后累加,而不会每次更新数组前五位 有大神解决过这个问题吗??
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-3
在线时间
4 小时
发表于 2019-7-12 15:15:03 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-7-12
在线时间
4 小时
发表于 2019-7-12 15:27:14 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

23

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2018-10-21
在线时间
44 小时
发表于 2019-7-12 15:44:38 | 显示全部楼层
不能下载显示附件不能读取
回复 支持 反对

使用道具 举报

23

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2018-10-21
在线时间
44 小时
发表于 2019-7-14 08:11:01 | 显示全部楼层
附件下载不了
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-10-15
在线时间
10 小时
发表于 2019-7-21 16:25:32 | 显示全部楼层
stm32串口的收发真实用,在复习一下
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-10-17
在线时间
7 小时
发表于 2019-7-30 17:48:05 | 显示全部楼层
不错不错
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-8-5
在线时间
2 小时
发表于 2019-8-5 16:14:03 | 显示全部楼层
下载不了附件怎么办呢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-7-10
在线时间
1 小时
发表于 2019-8-6 16:20:39 | 显示全部楼层
你好 关于DMA+IDLE的附件已经下载不了了 请问还有下载渠道吗?感谢!
回复 支持 反对

使用道具 举报

4

主题

59

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2018-12-27
在线时间
82 小时
发表于 2019-8-6 16:55:04 | 显示全部楼层
cool,非常好的帖子
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2019-8-25
在线时间
2 小时
发表于 2019-8-25 23:23:51 | 显示全部楼层
现在不能下载这个资料了吗
回复 支持 反对

使用道具 举报

4

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2019-7-28
在线时间
57 小时
发表于 2019-8-28 22:45:20 | 显示全部楼层
才学,不敢用DMA。脑子转不过来。
回复 支持 反对

使用道具 举报

22

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2228
金钱
2228
注册时间
2017-7-6
在线时间
272 小时
发表于 2019-8-29 15:18:34 | 显示全部楼层
附件怎么下不了
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-9-4
在线时间
1 小时
发表于 2019-9-7 22:03:18 | 显示全部楼层
楼主,您好。代码不能下载啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-10 10:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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