OpenEdv-开源电子网

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

串口中断的问题,只有这么多金币

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-8-19
在线时间
12 小时
发表于 2017-8-19 19:31:16 | 显示全部楼层 |阅读模式
1金钱
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9|GPIO_PinSource10,GPIO_AF_USART1);//错误

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//正确
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);


这是为什么,看视频中间用或是可以的,这个地方怎么不行?


void USART1_IRQHandler(void)
{


        u8 cha;
        if (USART_GetITStatus(USART1,USART_IT_RXNE))
       
                cha=USART_ReceiveData(USART1);
        delay_ms(500);    //加上延时就出错
             USART_SendData(USART1,cha);
       
       
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);


}
上面的中断函数为什么加上延时就会出错?

想了好几天没想明白,有没有遇到相同问题的小伙伴求助


最佳答案

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

第二个问题楼上已经说了,延时时间太长了估计是,没延时完又进中断了。第一个问题,这个GPIO的复用,看看相关寄存器,一个GPIO有两个寄存器,寄存器里面多个位控制复用形式。对寄存器进行设置操作比较复杂而不是简单的或操作,所以不能用简单的或运算进行。 对比一下GPIO口的模式寄存器你就明白了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-7-8
在线时间
33 小时
发表于 2017-8-19 19:31:17 | 显示全部楼层
第二个问题楼上已经说了,延时时间太长了估计是,没延时完又进中断了。第一个问题,这个GPIO的复用,看看相关寄存器,一个GPIO有两个寄存器,寄存器里面多个位控制复用形式。对寄存器进行设置操作比较复杂而不是简单的或操作,所以不能用简单的或运算进行。 微信截图_20170820091810.png 对比一下GPIO口的模式寄存器你就明白了。
2.png

回复

使用道具 举报

10

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2017-7-28
在线时间
109 小时
发表于 2017-8-19 19:42:31 | 显示全部楼层
进入中断后先关闭串口  USART_Cmd(USART1, DISABLE);    //关闭串口接收
退出中断前开启串口     USART_Cmd(USART1, ENABLE);    //开启串口接收

试一下,如果没问题了再给你解释原因
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2017-7-25
在线时间
39 小时
发表于 2017-8-19 21:45:21 | 显示全部楼层
本帖最后由 17602515236 于 2017-8-19 21:50 编辑

我觉得可能是500ms太长了,可能收到的数据太多了,导致串口接收的中断队列太长...然后队列溢出了之后发生异常。
还有一个说法就是,在中断里不能调用Systick延时,这会导致重入,然后系统就挂掉了。
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-8-19
在线时间
12 小时
 楼主| 发表于 2017-8-21 08:38:26 | 显示全部楼层
michael91 发表于 2017-8-19 19:42
进入中断后先关闭串口  USART_Cmd(USART1, DISABLE);    //关闭串口接收
退出中断前开启串口     USART_Cm ...

试了,还是不行
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-8-19
在线时间
12 小时
 楼主| 发表于 2017-8-21 08:38:57 | 显示全部楼层
17602515236 发表于 2017-8-19 21:45
我觉得可能是500ms太长了,可能收到的数据太多了,导致串口接收的中断队列太长...然后队列溢出了之后发生异 ...

应该是第二个问题导致的
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-8-19
在线时间
12 小时
 楼主| 发表于 2017-8-21 08:42:47 | 显示全部楼层
mrbbn 发表于 2017-8-20 09:21
第二个问题楼上已经说了,延时时间太长了估计是,没延时完又进中断了。第一个问题,这个GPIO的复用,看看相 ...

串口使能进中断后关掉也不行,至于或的问题,看了寄存器还是没搞明白。或了之后也是对对应的寄存器位进行操作,跟一次初始化两个GPIO口原理应该一样的
回复

使用道具 举报

10

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2017-7-28
在线时间
109 小时
发表于 2017-8-21 09:26:29 | 显示全部楼层

刚看了一下,你的发送也是串口1,进中断后关闭串口就发不出去了,试一下用串口2发送应该就行了
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-8-19
在线时间
12 小时
 楼主| 发表于 2017-8-21 10:42:36 | 显示全部楼层
michael91 发表于 2017-8-21 09:26
刚看了一下,你的发送也是串口1,进中断后关闭串口就发不出去了,试一下用串口2发送应该就行了

哈哈,确实,把1关了再用1发送就发不出去了。关键是里面为什么加了延时就不行了,是不是4楼说的那样中断里不能调用Systick延时,这会导致重入,然后系统就挂掉了。
回复

使用道具 举报

10

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2017-7-28
在线时间
109 小时
发表于 2017-8-21 11:40:26 | 显示全部楼层
孤鹜落霞 发表于 2017-8-21 10:42
哈哈,确实,把1关了再用1发送就发不出去了。关键是里面为什么加了延时就不行了,是不是4楼说的那样中断 ...

你接收了一个字节,结果中断里加了那么长时间延时,当你中断结束时,对方都不知道发到第几个字节了,你这时间再去接收还能对吗
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-8-19
在线时间
12 小时
 楼主| 发表于 2017-8-21 13:53:25 | 显示全部楼层
michael91 发表于 2017-8-21 11:40
你接收了一个字节,结果中断里加了那么长时间延时,当你中断结束时,对方都不知道发到第几个字节了,你这 ...

我是先接收了再延时再发送的
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-7-8
在线时间
33 小时
发表于 2017-8-21 14:00:05 | 显示全部楼层
孤鹜落霞 发表于 2017-8-21 08:42
串口使能进中断后关掉也不行,至于或的问题,看了寄存器还是没搞明白。或了之后也是对对应的寄存器位进行 ...

你如果还不明白可以看看两个库函数具体的操作
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 21:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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