OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
123
返回列表 发新帖
楼主: 1201yuge

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

  [复制链接]

  离线 

20

主题

120

帖子

2

精华

高级会员

Rank: 4

积分
827
金钱
827
注册时间
2015-12-24
在线时间
181 小时
发表于 2018-1-6 19:58:02 | 显示全部楼层
这个很有实用价值,保存下来封装一下留着复用。
回复 支持 反对

使用道具 举报

  离线 

0

主题

3

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

2

主题

27

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

80

主题

775

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

  离线 

1

主题

5

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

2

主题

23

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

21

主题

261

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

5

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

0

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

4

主题

11

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

0

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

2

主题

18

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

2

主题

18

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

2

主题

18

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

4

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

4

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

1.jpg
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

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

使用道具 举报

  离线 

26

主题

319

帖子

1

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

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

使用道具 举报

  离线 

21

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
339
金钱
339
注册时间
2017-11-29
在线时间
120 小时
发表于 5 天前 来自手机 | 显示全部楼层
明天开始研究这个
回复 支持 反对

使用道具 举报

  离线 

0

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-11-14
在线时间
2 小时
发表于 4 天前 | 显示全部楼层
这是好东西啊!
回复 支持 反对

使用道具 举报

  离线 

11

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2018-7-8
在线时间
17 小时
发表于 3 天前 | 显示全部楼层
//串口中断函数
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()).
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

正点原子双11大促销上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-11-18 13:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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