OpenEdv-开源电子网

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

stm32f103串口1和串口2冲突问题,求指教

[复制链接]

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2019-3-28
在线时间
12 小时
发表于 2019-3-28 10:03:47 | 显示全部楼层 |阅读模式
3金钱
是这样的,现在需要同时用到串口1和串口2接收数据,然后进行计算什么的,最后通过串口1打印到PC端,串口1和串口2接收的数据类型相同,波特率相同,是同样的传感器,换言之,串口1和串口2同时有大量数据输入,现在的问题是,串口1或者串口2单独工作时都能正常工作,但当串口1接收数据正常工作时,只要PA3(USART2的RX)连接传感器数据发送端,程序立刻卡死,此时如果断开PA3的连接,程序不能恢复,PA3断开状态下复位后可恢复。中断优先级配置附后,所以求教是哪里出了问题,需要哪些程序段我会及时附上,然后之前有看到一个帖子说可能是假溢出,但没怎么看懂,求教
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}




最佳答案

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

串口中断的优先级设置一下。然后时中断保护,比如进串口1的中断之后,关闭串口2的中断,等串口1中断执行完成之后在打开串口2的中断。还有就是建议采用串口加DMA的方式,不同的串口,用不同的DMA通道,这样就不会出现冲突的问题了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2018-10-21
在线时间
21 小时
发表于 2019-3-28 10:03:48 | 显示全部楼层
串口中断的优先级设置一下。然后时中断保护,比如进串口1的中断之后,关闭串口2的中断,等串口1中断执行完成之后在打开串口2的中断。还有就是建议采用串口加DMA的方式,不同的串口,用不同的DMA通道,这样就不会出现冲突的问题了
回复

使用道具 举报

11

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2013-11-26
在线时间
113 小时
发表于 2019-3-28 10:46:10 | 显示全部楼层
应该不是中断优先级的问题  如果是中断接收,我记得如果不配置优先级,是根据默认的中断向量表按顺序执行。如果是查询接收的话,看看是不是掉到哪个循环里的。仿真下,看下程序到底死在哪儿了。
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2019-3-28
在线时间
12 小时
 楼主| 发表于 2019-3-28 10:49:15 | 显示全部楼层
Dayfly 发表于 2019-3-28 10:46
应该不是中断优先级的问题  如果是中断接收,我记得如果不配置优先级,是根据默认的中断向量表按顺序执行。 ...

OK~谢谢,我试试看
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2019-3-28
在线时间
12 小时
 楼主| 发表于 2019-3-28 10:54:29 | 显示全部楼层
Dayfly 发表于 2019-3-28 10:46
应该不是中断优先级的问题  如果是中断接收,我记得如果不配置优先级,是根据默认的中断向量表按顺序执行。 ...

传感器的发送数据波特率也是9600,与串口波特率一致
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2019-3-28 16:52:10 | 显示全部楼层
你的传感器数据量是不是很大
回复

使用道具 举报

11

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2013-11-26
在线时间
113 小时
发表于 2019-3-28 17:55:55 | 显示全部楼层
atalanta 发表于 2019-3-28 10:49
OK~谢谢,我试试看

还有一个  看看是不是中断的太频繁了  考虑检查嵌套中断了
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2019-3-28
在线时间
12 小时
 楼主| 发表于 2019-3-29 08:35:50 | 显示全部楼层
login_FAE 发表于 2019-3-28 16:52
你的传感器数据量是不是很大

差不多可以这么认为,就属于源源不断的有数据进入,但我是隔几毫秒取一组用隔几毫秒取一组用
回复

使用道具 举报

10

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
949
金钱
949
注册时间
2016-3-21
在线时间
114 小时
发表于 2019-3-31 10:19:02 | 显示全部楼层
是不是串口1和串口2的输出你都重定向了?最好把源码贴上来看一下
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2019-3-28
在线时间
12 小时
 楼主| 发表于 2019-4-1 14:18:58 | 显示全部楼层
本帖最后由 atalanta 于 2019-4-1 14:26 编辑

问题解决啦,虽然设置了中断优先级,但是仍然存在接收冲突的情况,于是在串口初始化中不再使能串口,写了一段这样的程序(附后)来进行中断保护,没有用到DMA,虽然数据源源不断的输入,但用到的数据量并不大,还有就是在中断服务程序中添加了清除ORE标志位的程序段
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2019-3-28
在线时间
12 小时
 楼主| 发表于 2019-4-1 14:22:15 | 显示全部楼层
atalanta 发表于 2019-4-1 14:18
问题解决啦,虽然设置了中断优先级,但是仍然存在接收冲突的情况,于是在串口初始化中不再使能串口,写了一 ...
标志位的改变在处理数据的子程序和中断服务程序中
void oc_sensor(void){
        if(oc_flag==1){    //收集数据
                if(u_flag==1){    //开u1关u2
                        USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
                        
                        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
                        USART_Cmd(USART1,ENABLE);
                }
                else{     //u_flag=0
                        USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
                        
                        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
                        USART_Cmd(USART2,ENABLE);
                }
        }
        else{   //oc_flag=0
                USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
                USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
        }
}
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2019-3-28
在线时间
12 小时
 楼主| 发表于 2019-4-1 14:23:25 | 显示全部楼层
触电丶 发表于 2019-3-31 10:19
是不是串口1和串口2的输出你都重定向了?最好把源码贴上来看一下

只重定向了1
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 14:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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