OpenEdv-开源电子网

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

串口发送数据如何不被中断打断的问题

[复制链接]

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
发表于 2022-12-5 16:42:10 | 显示全部楼层 |阅读模式
10金钱
STM32F103使用了两个定时器中断,在主函数中触发条件后进行串口数据发送。经示波器观察,在进行数据发送时,数据一帧数据中间有一段固定电平,判断为未进行发送一段时间。经猜测可能是由于发送到一半的情况下进入了中断,发送被终止挂起才出现的这种情况。请问各位大佬如何让在进行数据发送的情况下避免定时器的打断?

最佳答案

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

1.发送前暂停定时器,发送完后开启。2.提高串口中断发送优先级。3.改串口为DMA发送。方法多的是
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2022-12-5 16:42:11 | 显示全部楼层
1.发送前暂停定时器,发送完后开启。2.提高串口中断发送优先级。3.改串口为DMA发送。方法多的是
回复

使用道具 举报

4

主题

96

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3515
金钱
3515
注册时间
2018-5-25
在线时间
811 小时
发表于 2022-12-5 17:36:01 | 显示全部楼层
DMA发送最简单
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2022-12-5 17:41:30 | 显示全部楼层
wklhwkl 发表于 2022-12-5 16:46
1.发送前暂停定时器,发送完后开启。2.提高串口中断发送优先级。3.改串口为DMA发送。方法多的是

串口接收优先级是比定时器高,如何改变发送的优先级呢
发送数据我都用的是以下程序
        for(t=0;t<6;t++)
        {
                USART_SendData(USART3, SendOff[t]);//&#207;ò′&#174;&#191;ú3·¢&#203;íêy&#190;Y
                while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//μè′y·¢&#203;í&#189;áê&#248;
        }       
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2022-12-5 18:47:47 | 显示全部楼层
苏九思 发表于 2022-12-5 17:41
串口接收优先级是比定时器高,如何改变发送的优先级呢
发送数据我都用的是以下程序
        for(t=0;t

改变优先级可以在NVIC寄存器里 为中断配置抢占优先级和子优先级 抢占优先级高的不会被低的打断
可以参考原子的例程的NVIC_Init函数 他例程里的串口中断是配置了中断优先级的
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2022-12-5 18:48:48 | 显示全部楼层
苏九思 发表于 2022-12-5 17:41
串口接收优先级是比定时器高,如何改变发送的优先级呢
发送数据我都用的是以下程序
        for(t=0;t

你这个情况DMA更适合 定时器和串口都不耽误 改优先级终究有一个要被干扰
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3329
金钱
3329
注册时间
2011-11-10
在线时间
207 小时
发表于 2022-12-5 19:09:02 | 显示全部楼层
关闭总中断吧。IIC通信也也是这样子的,先关闭总中断!数据发完后再开启总中断即可。
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2022-12-6 16:18:37 | 显示全部楼层
babyrabbit 发表于 2022-12-5 18:48
你这个情况DMA更适合 定时器和串口都不耽误 改优先级终究有一个要被干扰

串口配置时已经将串口的中断优先级设置的高于定时器的了,不过在串口的中断服务函数当中只是处理接收的数据。接收数据试过了,并不会被干扰。发送数据的时候并不在中断服务函数当中,所以我不知道怎么去设置这个的优先级。
关于使用DMA来进行发送我不是很了解,查阅资料后暂时的理解是发送固定长度的数据是可以的,如果发送不定长度的就不太行。例如有发送8字节和6字节的需求,DMA传输设置为8字节,当发送6字节的数据时就会出现问题。
不知道我的理解对不对,请指教一下,谢谢您
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2022-12-6 16:21:10 | 显示全部楼层

关于使用DMA来进行发送我不是很了解,查阅资料后暂时的理解是发送固定长度的数据是可以的,如果发送不定长度的就不太行。例如有发送8字节和6字节的需求,DMA传输设置为8字节,当发送6字节的数据时就会出现问题。您看理解的对不对,请指教
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2022-12-6 16:21:45 | 显示全部楼层
c2007s 发表于 2022-12-5 19:09
关闭总中断吧。IIC通信也也是这样子的,先关闭总中断!数据发完后再开启总中断即可。

嗯,我考虑考虑,谢谢您
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2022-12-6 16:29:32 | 显示全部楼层
你可以配置dma发8个,为什么下次就不能配成6个,所以dma是没问题的
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2022-12-6 16:31:36 | 显示全部楼层
苏九思 发表于 2022-12-6 16:21
关于使用DMA来进行发送我不是很了解,查阅资料后暂时的理解是发送固定长度的数据是可以的,如果发送不定 ...

重设DMA传输字节数不就行了
回复

使用道具 举报

4

主题

96

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3515
金钱
3515
注册时间
2018-5-25
在线时间
811 小时
发表于 2022-12-6 17:28:29 | 显示全部楼层
阿侑kevin 发表于 2022-12-6 16:31
重设DMA传输字节数不就行了

正解,DMA可以设置传输字节的,单次最大65535,大部分功能都可以用
回复

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12692
金钱
12692
注册时间
2012-11-26
在线时间
3711 小时
发表于 2022-12-7 08:52:31 | 显示全部楼层
你中断处理的时间太长了吧   !!!
回复

使用道具 举报

22

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
600
金钱
600
注册时间
2019-3-27
在线时间
142 小时
发表于 2022-12-8 16:24:01 | 显示全部楼层
苏九思 发表于 2022-12-6 16:18
串口配置时已经将串口的中断优先级设置的高于定时器的了,不过在串口的中断服务函数当中只是处理接收的数 ...

DMA可以发送任意长度的。
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2022-12-13 14:00:05 | 显示全部楼层
a5820736 发表于 2022-12-6 16:29
你可以配置dma发8个,为什么下次就不能配成6个,所以dma是没问题的

这是每次发送都要重新初始化DMA一次吗?我不是很了解,能不能给个代码例子,谢谢您了
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2022-12-13 14:00:29 | 显示全部楼层
阿侑kevin 发表于 2022-12-6 16:31
重设DMA传输字节数不就行了

这是每次发送都要重新初始化DMA一次吗?我不是很了解,能不能给个代码例子,谢谢您了
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2022-12-13 14:01:02 | 显示全部楼层
zdes33ss 发表于 2022-12-6 17:28
正解,DMA可以设置传输字节的,单次最大65535,大部分功能都可以用

这是每次发送都要重新初始化DMA一次吗?我不是很了解,能不能给个代码例子,谢谢您了
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2022-12-13 16:00:35 | 显示全部楼层
苏九思 发表于 2022-12-13 14:00
这是每次发送都要重新初始化DMA一次吗?我不是很了解,能不能给个代码例子,谢谢您了

DMA1_Channel4->CMAR = (uint32_t)data;
  DMA1_Channel4->CNDTR = size;
  DMA_Cmd(DMA1_Channel4, ENABLE);
参考一下吧
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2022-12-14 08:33:22 | 显示全部楼层
阿侑kevin 发表于 2022-12-13 16:00
DMA1_Channel4->CMAR = (uint32_t)data;
  DMA1_Channel4->CNDTR = size;
  DMA_Cmd(DMA1_Channel4, E ...

这意思是将字节数当做DMA初始化函数的形参,通过若字节不同时则重新进行初始化改变传输字节数的意思吗
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2022-12-14 13:02:52 | 显示全部楼层
苏九思 发表于 2022-12-14 08:33
这意思是将字节数当做DMA初始化函数的形参,通过若字节不同时则重新进行初始化改变传输字节数的意思吗

实践出真知
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 19:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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