主题中讨论的其他器件: MSP430F2252
工具/软件:Code Composer Studio
我在 UART 模式下的 MSP430I2021 eUSCI_A 上遇到了一个奇怪的问题。
在我的应用中、我在 UART 模式下使用 eUSCI_A 并具有 RX 和 TX 中断。
我的 UART RX 中断处理程序将接收到的字符存储在静态缓冲区中、或记录可能的接收错误条件;在这两种情况下、条件标志都始终被清除。 在主循环中、调用以下函数来处理 UART 接收:
/*! **\fn short Uart0_GetBuffer( unsigned char *buff,unsigned short *len )**\brief 获取接收到的数据包和接收条件 **\param buff the buffer for the received packet **\param len the received packet size **\return UART0_NODATA - no receive ** UART0_ERROR -接收错误(组帧、奇偶校验、溢出) ** UART0_SIDATA -接收到的数据包 ** UART0_RXDATA -正在接收数据包 **/ 短 UART0_GetBuffer( unsigned char *buff,unsigned short *len ){ short tmp = UART0_NODATA; UCA0IE &=~UCRXIE;//禁用 RX 中断 //处理当前接收条件: //-如果接收到数据包,则将其存储在缓冲区中并返回 UART0_SIDATA。 //-否则、如果接收错误、返回 UART0_ERROR。 //-如果正在接收数据包,则返回 UART0_RXDATA。 [...] UCA0IE |= UCRXIE;//启用 RX 中断 返回 tmp; }
我的问题:
- 我的应用程序启动并运行几秒钟(从10秒到30秒随机)、UART 正常工作(接收和发送)、但随后发生复位。
我的应用不使用看门狗、也不进行代码优化。 电路板上的电源电压 VCC 稳定、不会发生外部复位。 我使用带有20K 外部电阻器的 DCO 时钟运行、MCLK = DCO/2 = 8.192MHz、SMCLK = DCO/4 = 4.096MHz。 UART 通信在 RX 和 TX 方向处理大小一直到30字节的数据包。
搜索一天后、我发现原因是 RX 中断 禁用使能序列。 此外、让 RX 中断在不处理串行通信的情况下运行、我在主循环中遇到以下函数的相同问题:
/*! **\fn short Uart0_GetBuffer( unsigned char *buff,unsigned short *len )**\brief 获取接收到的数据包和接收条件 **\param buff the buffer for the received packet **\param len the received packet size **\return UART0_NODATA - no receive ** UART0_ERROR -接收错误(组帧、奇偶校验、溢出) ** UART0_SIDATA -接收到的数据包 ** UART0_RXDATA -正在接收数据包 **/ 短 UART0_GetBuffer( unsigned char *buff,unsigned short *len ){ short tmp = UART0_NODATA; UCA0IE &=~UCRXIE;//禁用 RX 中断 UCA0IE |= UCRXIE;//启用 RX 中断 返回 tmp; }
因此、对 UCA0IE 寄存器中的 UCRXIE 位进行非常频繁的写访问可能会产生一个复位条件。 为什么?
器件勘误表中未报告任何相关信息。
同时,我解决了 Uart0_GetBuffer()函数中所有中断的禁用(_DINT())和重新启用(_EINT())问题,而不是单个 UART RX 中断。 但我不喜欢它!
我不理解这种行为:同一函数在基于 MSP430F2252并使用 IAR 编译器构建的我的旧应用上正常运行(但在这种情况下、外设 USCI 与 eUSCI 略有不同)。
有什么想法吗?
谢谢大家。