10520|12

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教香主一个usart2,uart4的问题 [复制链接]

我usart1工作一切正常,现在我又打开了usart2,485芯片拉低,发送数据到uart2,进入中断,但是一进入中断,我查了sr寄存器状态,idle=1, rxne=0,这是为何? 以至于我读不到数据后就出中断了

uart4的话,我是已经在rx量到信号了,但是进不了uart4中断。

usart2,uart4的时钟我都使能了

比较急,请香主赐教
此帖出自stm32/stm8论坛

最新回复

                                 我不是在发送string 的时候会先disable interrupt吗? 我现在加了一句,disable receive function ,也就是把CR1中的RE先disable,这样就不会在发送string的时候造成RX接收到引起的过载错误了。 然后发送完数据,硬件置位后,我在enable interrupt后,再enable RE的功能,就解决了这个问题。   详情 回复 发表于 2009-3-9 14:32
点赞 关注
 

回复
举报

94

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

什么芯片?

                                 用示波器看过吗?
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

关于USART的调试

关于STM32的USART的调试:
1,参考ST提供的USART的例子,USART1和USART2连接,有使用中断的例子,有使用SR标志的例子和使用DMA的例子,先根据需求参考这3个例子,看看你的代码有何问题

2,进入中断后,先定义一个变量,保存SR寄存器,然后在watch窗口看变量的值。这样比直接在窗口看SR的值更准确。



此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 

我的中断是这么处理的

我用的是STM32F101RC

1. 有一个怪现象,我如果发送的时候,断点设在line1这句,那么单步下去,不会进入到lin2; 如果我断点直接设在line3, 那么会读到我发送进来的值。
这是为什么呢? 我只使能了接收中断。

2. 另外,如果我发送一串string后,函数单步,应该很快就跑到下一步,但是我串口助手虽然已经看到我发送的数据,但是这个单步的函数很慢,我停下来,就会停在USART_GetITStatus()这个函数里面,也就是说一直在进中断,ORE我看到是1, 但是出中断的时候是清零了,只留下TXE. 过一段时间,这个函数单步就会走过,走过后,也就正常了,不会进中断,我可以继续下面的工作。

之前我usart2一直收不到数据,后来我改了一下nvic的group, 本来是group0,现在我改成group1, 因为group0 我是给tim2用的。 这个改了之后,就有了上面描述的1现象。

我串口设置等都是从USART的例子上搬过来的。

中断函数:
void PRO_USART2_IRQHandler(void)
{
    //BYTE *buf2 = " USART2 test successed! ";
    INT8U OneByte;
    WORD intStatus;
    INT16U  srStatus;

    srStatus = USART2->SR;

    if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  // line1
    {
        //// Read one byte from the receive data register

        OneByte = USART_ReceiveData(USART2);                // line2
         if(OneByte == 0x01)                                // line3
            {
              OneByte = 0;
            }
        countusart2++;  // for usart2 read test , if not use ,please clear
    }

    if (USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
    {

    }

}

此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 

另外,我的硬件是这样的---

usart2跟usart1有一点不一样,就是usart2这个口我复用了1-wire的两根线。RX,TX是连在一起的所以,当我usart2发送数据的时候,我是先disable usart2中断,发送完后再enable usart2中断,否则当我发送数据的时候会导致进入usart2中断。

我在考虑一个问题,我4楼描述的现象2,会不会是因为1-wire复用功能导致的呢? 但是我发送数据前是disable中断了,应该不会有影响啊,ORE我看过,是过载错误,难道是因为发送一串string的时候,由于RX跟TX是一样的,导致过载错误? 但是我发送的数据也就20个字节而已

此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 

请注意单步调试时,调试软件也会对各个寄存器进行读操作

只要你打开了调试软件中的观察窗口,在单步停止的时候,调试软件会读出所有观察窗口的寄存器并刷新显示。

很多寄存器的状态是通过读或写操作清除的,例如RXNE是通过读DR寄存器清除,你在line1处单步停止,就隐含了读DR寄存器的操作,自然就清楚了RXNE,当然单步就走不到line2了。

你后面的问题也与此相关,你可以自己分析一下。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 

line1调用的是USART_GetITStatus()函数

USART_GetITStatus函数里面没有DR寄存器的操作嘛,
这是库函数的代码
//--------------------------------------------------------------------------------------------------
// USART_GetITStatus
//--------------------------------------------------------------------------------------------------
//! rief            Checks whether the specified USART interrupt has occurred or not.
//!
//! param[in]      - USARTx: Select the USART or the UART peripheral. 
//!                   This parameter can be one of the following values:
//!                    - USART1, USART2, USART3, UART4 or UART5.
//! 
//! param[in]      - USART_IT: specifies the USART interrupt source to check.
//!                   This parameter can be one of the following values:
//!                       - USART_IT_CTS:  CTS change interrupt (not available for 
//!                                        UART4 and UART5)
//!                       - USART_IT_LBD:  LIN Break detection interrupt
//!                       - USART_IT_TXE:  Tansmit Data Register empty interrupt
//!                       - USART_IT_TC:   Transmission complete interrupt
//!                       - USART_IT_RXNE: Receive Data register not empty 
//!                                        interrupt
//!                       - USART_IT_IDLE: Idle line detection interrupt
//!                       - USART_IT_ORE:  OverRun Error interrupt
//!                       - USART_IT_NE:   Noise Error interrupt
//!                       - USART_IT_FE:   Framing Error interrupt
//!                       - USART_IT_PE:   Parity Error interrupt
//!
//!  eturn            None
//--------------------------------------------------------------------------------------------------
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, INT16U USART_IT)
{
  INT32U bitpos = 0x00, itmask = 0x00, usartreg = 0x00;
  ITStatus bitstatus = RESET;

  // Check the parameters 
  ASSERT(IS_USART_ALL_PERIPH(USARTx));
  ASSERT(IS_USART_GET_IT(USART_IT));
  ASSERT(IS_USART_PERIPH_IT(USARTx, USART_IT)); // The CTS interrupt is not available for UART4 and UART5   
  
  // Get the USART register index 
  usartreg = (((INT8U)USART_IT) >> 0x05);

  // Get the interrupt position 
  itmask = USART_IT & IT_Mask;

  itmask = (INT32U)0x01 << itmask;
  
  if (usartreg == 0x01) // The IT  is in CR1 register 
  {
    itmask &= USARTx->CR1;
  }
  else if (usartreg == 0x02) // The IT  is in CR2 register 
  {
    itmask &= USARTx->CR2;
  }
  else // The IT  is in CR3 register 
  {
    itmask &= USARTx->CR3;
  }
  
  bitpos = USART_IT >> 0x08;

  bitpos = (INT32U)0x01 << bitpos;
  bitpos &= USARTx->SR;

  if ((itmask != (INT16U)RESET)&&(bitpos != (INT16U)RESET))
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  
  return bitstatus;  
}
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 

4楼的情况2 --- 急迫

4楼的情况1,也许是香主6楼说的情况。

但是4楼的情况2 ,可能香主对我说的产生了点歧义。
我说的函数单步,是这样的:
PRO_UART_SendString(PRO_UART_MODULE_2, 26, buf2); //line5
while(1);                                         //line6

也就是说我line5整个函数单步,应该是很快就直接走到line6,并且串口助手会收到一组string。 但是事实上不是这样,会等很长一段时间,并且没到line6,因此我停下debug, 发现停在USART_GetITStatus 函数,这个函数是中断才调用的,也就是说我进入了中断。并且我发现ORE bit 为1,当我出中断函数的时候,ORE bit = 0; 但是随后会反复进入中断,不知道为什么。 

另外,虽然硬件上我tx,rx由于要使用1-wire功能的原因,是短接在一起的,但是我line5发送的过程中,再发送前,我是disable usart2中断的; 当我发送完后,
 // wait until finish sending data
    while (USART_GetFlagStatus(log_USART, USART_FLAG_TC) == RESET);
这句执行完,确保数据发送已经完成了,才去打开usart2中断。 并且打开前,我先进行SR的标志位清0,以消除rx线上由于发送string时引起的中断标志位。

按理说我的逻辑没错阿,但是为什么会有这种怪现象呢?

请香主帮忙,谢谢了。

此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 

PRO_UART_SendString()这个函数是什么样的?

也就是说我line5整个函数单步,应该是很快就直接走到line6,并且串口助手会收到一组string。 但是事实上不是这样,会等很长一段时间,并且没到line6,因此我停下debug, 发现停在USART_GetITStatus 函数,这个函数是中断才调用的,也就是说我进入了中断。

你怎么知道USART_GetITStatus()这个函数是中断才调用的?
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 

因为我只在中断函数里面用了这个

我中断函数沿用的是stm32的例子程序(um0427)版本的,例程里面就:
if (USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
    {
        temp = USART_ReceiveData(UART4);
    }

    if (USART_GetITStatus(UART4, USART_IT_TXE) != RESET)
    {
    }
此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

11
 

如果是ORE过载产生中断,该如何彻底去除?

我在进中断一开始就读了SR寄存器,保存在一个变量里。 读出来是0x88,也就是说过载了,这个是有可能的。因为TX,RX现在是连接在一起的,当TX发送完一组string后,RX起始也是跟TX一样动作的。 但是,问题是我发送完STRING后,是先读了SR的寄存器,如果非0,则SR=0 ,进行了标志位清除工作,然后再enable usart2 interrupt的。 应该不会再产生过载中断了阿

如果,即使真的又过载了,从而进入了中断,那我出中断的时候已经这个bit=0了阿,难道没有清干净?
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(中级)

12
 

SR=0x88,表示有ORE过载错误和TXE发送数据寄存器空,2个条件

TXE发送数据寄存器空是正常的,因为你暂时不需要发送。

请看STM32参考手册中,关于清除ORE过载错误条件:由软件序列将其清零(先读USART_SR,然后读USART_CR)。


还是我在9楼提出的问题:PRO_UART_SendString()这个函数是什么样的?如果在这个函数中不掉用USART_GetITStatus(),你是如何保证发送的字符串中后面的字符不会覆盖前面的字符?即等待一个字符的发送结束再在DR中写入另一个字符?
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 

香主,我已经有办法了。

                                 我不是在发送string 的时候会先disable interrupt吗? 我现在加了一句,disable receive function ,也就是把CR1中的RE先disable,这样就不会在发送string的时候造成RX接收到引起的过载错误了。 然后发送完数据,硬件置位后,我在enable interrupt后,再enable RE的功能,就解决了这个问题。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表