59

帖子

0

TA的资源

一粒金砂(初级)

21
 
如果是来一次中断一次,那肯定不能接受多个再清了,不然第二次就进不了中断了
其实是每次都清中断标志的,因为加了延时就可以正常工作了。现在的问题是为什么加了延时就可以工作呢?这个问题显示与时间有关系,而不是与标志位清不清有太大的关系,否则会一直不工作,直到标志被清除。难道延时时间长一点,标志位会自动清除?
此帖出自stm32/stm8论坛
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

22
 
“死机时就是所有的程序都停了”是否可以理解为CPU不运行了?

如果CPU还在运行,停止CPU运行,在调试状态下肯定可以看到寄存器的内容。

如果无法停止CPU运行,则说明程序逻辑出了问题。
此帖出自stm32/stm8论坛
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

23
 


再次请问版主:
1、“而且USART_ClearFlag()不能清除USART_FLAG_ORE。”,请问正确的清除方法是什么?谢谢!
程序里是: USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR其实就是清除标志
                  USART_ReceiveData(USART2);    //读DR

2、目前是加 了延时就可以运行,会不会有什么标志会因为延时后就可以被清除?
谢谢!
此帖出自stm32/stm8论坛
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

24
 
1)正确的清除方法就是先读SD再读DR。
2)延时不会清除任何标志。
此帖出自stm32/stm8论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

25
 
                                 问题解决了吗??其实485通信是半双工的 收发要切换时要加个小延时的
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

26
 
谢谢楼上顶贴,问题没有解决,目前还是在计数置位后加延时2MS来工作的。
void USART2_IRQHandler(void){
        //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题
        if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
        {
                  USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR其实就是清除标志
                  USART_ReceiveData(USART2);    //读DR
         }
       
         if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
    {
                Rs485Rx[Rs485Rxcont++]=USART_ReceiveData(USART2);
                if(Rs485Rxcont==7){      
                Usart2_Get_Flag=TRUE;
                Delay(2);                               
                 }

                // Clear the USART2 Receive interrupt
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);        
        }
}
主程序也非常简单:
        while(1)
          {         
       
        if(Usart2_Get_Flag)
                  {GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(1));
                                printf("%1c%1c%1c%1c%1c%1c%1c",0x03,0x03,0x02,0x02,0x04,0xC1,0x27);
                                GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(0));

                        Rs485Rxcont=0;
                    Usart2_Get_Flag=FALSE;                       
                  }
}
其它设置见楼主位贴,如果不加延时就不能工作,加了就能工作。非常奇怪。       
“半双工的 收发要切换时要加个小延时的”,这点倒是没有问题。
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

27
 
                                 楼主好像没有回答我在23楼的问题呢?
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

28
 


回版主:
在单步调试运行时,不加延时,确实发现ORE标志位并没有被清除,虽然上面有读SR,DR的命令。难道这段代码不起作用?
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

29
 


而且发现,如果不在中断里打断点,单步运行就不能进中断程序,打了断点就可以进入。是否打了断点调试时相当于有了延时的效果呢?
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

30
 
                                 我们的做法是这样的,一帧数据为16个字节,进中断,初始化TIME2 接收到第一个字节数据,在中断中清除中断标志,开启一个定时器TIME2退出中断,开始下一次中断接收下一个字节,初始化定时器TIM2,  用定时器的目的就是判断如果接收两个相邻数据之间的间隔时间超过5ms ,则判断为第二个数据为下一帧数据。
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

31
 


void USART2_IRQHandler(void)
{
  if(RxBufferLength>15)
  RxBufferLength=0;
  RxBuffer[RxBufferLength++]=USART_ReceiveData(USART2);
  USART_ClearITPendingBit(USART2, USART_IT_RXNE);
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
  TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
  TIM2->CNT = 0;
  TIM_Cmd(TIM2, ENABLE);
  
}
此帖出自stm32/stm8论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

32
 
而且发现,如果不在中断里打断点,单步运行就不能进中断程序,打了断点就可以进入。是否打了断点调试时相当于有了延时的效果呢?
对不起,我还是没有明白“死机”是什么意思,“死机”之后CPU是否还能被停止还是已经停止了,“死机”之后程序运行的现场是什么。

--------

你的上述描述也不清楚,没办法知道发生什么。
1)中断里哪里有断点?
2)单步运行就不能进中断程序,打了断点就可以进入。是单步进入的还是连续运行进入的?
3)是否打了断点调试时相当于有了延时的效果呢?单步运行与连续运行的时序根本不一样,不能这样简单对比。
此帖出自stm32/stm8论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

33
 
我们的做法是这样的,一帧数据为16个字节,进中断,初始化TIME2 接收到第一个字节数据,在中断中清除中断标志,开启一个定时器TIME2退出中断,开始下一次中断接收下一个字节,初始化定时器TIM2,  用定时器的目的就 ...
谢谢您提供的方法,有空试一下!
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

34
 
再回版主:
1、还是没有明白“死机”是什么意思,“死机”之后CPU是否还能被停止还是已经停止了,“死机”之后程序运行的现场是什么。
-----------------
死机的意思是程序不动了,但CPU在调试状态下还可以被终止。程序的现场好像都与发送有关?这点不是很确定,下面贴两个图上来看一下。

2、你的上述描述也不清楚,没办法知道发生什么。中断里哪里有断点?
--------------------------
中断里的断点就是在接收数据的地方设一个断点,29楼里的图上红色行那里。

3、单步运行就不能进中断程序,打了断点就可以进入。是单步进入的还是连续运行进入的?
---------------
是打了断点后,连续运行才能进中断,单步进不了中断。
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

35
 


发三张程序“死机”时的状态,好像都与发送数据有关的命令。程序里的发送都是用printf函数的,是不是与它有关呢?发送中断没有开启。还有一个疑问,因为485通讯不是全双工的,如果STM32在发送数据时,正好有接收的数据要进来,会不会引起冲突?看下面这张图,接收的计数值为9,而中断程序里如果大于7就置位,然后到主程序里清零,但在没有清零之前,此数值又加大了,应该是再接收到了数据。再次感谢版主的热心。

----------------------------------------------
以下三张是程序“死机”后的停止位置。



此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

36
 
我真看不下去了,多动手搜搜看先
请看本版精华帖
主题:关于USART接收中断的BUG和注意事项
https://bbs.eeworld.com.cn/frame.php?fr ... om/iclist-49-1.html
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

37
 
我真看不下去了,多动手搜搜看先
请看本版精华帖
主题:关于USART接收中断的BUG和注意事项
https://bbs.eeworld.com.cn/frame.php?frameon=yes&referer=http%3A//bbs.eeworld.com.cn/iclist-49-1.html ...
楼上的,请你看一下前面的内容。关于你说的这个帖子的内容这在里有讨论过,而且根据其内容修改过程序。没有作用。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

38
 
                                 怎么说呢,是否考虑下收发的控制?比如收的时候不发,发的时候不收?
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

39
 
                                 个人觉得串口接收没必要用中断
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表