OpenEdv-开源电子网

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

原子哥来看一下,感觉串口中断,怎么不能打断delay_ms(),函数?delay是while循环方式。

[复制链接]

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
发表于 2014-10-22 10:39:57 | 显示全部楼层 |阅读模式
5金钱
使用原子哥的中断程序,感觉串口中断接收数据,不能打断delay_ms()函数。。delay使用的while循环延时方式,以前一直使用这个,延时是比较准确的。
          在主函数中没加入delay_ms(2)延时2毫秒时,电话响一声自动挂断。。加入delay_ms(2)后,电话要响很多声才自动挂断,有时根本就不能自动挂断。。如果串口中断能打断delay_ms(),那么只要有电话呼入,就应该能抓取完整的RING信号,就可以马上挂机。
void main()
{
  if(USART_RX_STA&0x8000)
  {   
    len=USART_RX_STA&0x3fff;
  if(USART_RX_BUF[0]=='R' && USART_RX_BUF[1]=='I' && USART_RX_BUF[2]=='N' && USART_RX_BUF[3]=='G')
  {
      printf("ATH\r"); //串口接收到RING电话信号,就马上挂断电话;
  }
  USART_RX_STA=0;
 }

 delay_ms(2);//加入延时2ms,电话就很难自动挂断了。。应该是串口中断,不能打断delay,很难接受到完整的RING电话信号。
}


搞不明白了,为什么加入delay就不行了,如果串口中断不起作用,那么应该接受不到数据,函数都不能实现自动挂电话。。如果中断起作用,那应该可以打断delay循环延时,接受到完整的RING电话信号,然后delay走完之后,马上可以挂机。。。应该是delay影响了数据中断接收。。

最佳答案

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

1、 首先  任何delay都不能影响中断,除非更高优先级的中断 2、 楼主的挂断电话最好直接丢中断里处理,否则正好在delay之前串口接收完毕,则,必须在下一循环,才会执行挂断
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-10-22 10:39:58 | 显示全部楼层
1、 首先  任何delay都不能影响中断,除非更高优先级的中断
2、 楼主的挂断电话最好直接丢中断里处理,否则正好在delay之前串口接收完毕,则,必须在下一循环,才会执行挂断
学无止境
回复

使用道具 举报

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
 楼主| 发表于 2014-10-22 10:49:58 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
现在就是delay_ms(2)加入之后,很难实现自动挂机,有时根本不能自动挂机。。为什么我这里这个delay,会给这个程序带来致命的影响?
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-10-22 10:56:19 | 显示全部楼层
回复【3楼】haohan163:
---------------------------------
那得看你串口里怎么处理的了,而且你加的延迟,程序不能在大循环里立即执行挂断动作,必须延迟结束,重新来一次才会挂断。
学无止境
回复

使用道具 举报

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
 楼主| 发表于 2014-10-22 10:57:01 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
如果在程序运行到delay()的时候,正好串口中断接收到了RING。那么delay()运行完毕之后,应该也可以挂断电话啊。
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-10-22 10:58:34 | 显示全部楼层
回复【5楼】haohan163:
---------------------------------
那得看你中断处理,接收到的数据是不是正确的,实在不明白,debug吧
学无止境
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-8-12
在线时间
0 小时
发表于 2015-9-23 15:55:50 | 显示全部楼层
看看是不是在延时函数初始化之前就调用它了。一些HAREWARE中的.c文件中的函数会调用delay函数,尤其是lcd初始化。要把delay_init(); 放在所有初始化函数之前。并且delay-us,ms()的参数必须为大于等于1的正数
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 07:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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