This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430I2021:如果在 UART 模式下禁用然后在 eUSCI_A 外设上启用 UCRXIE、则会发生复位

Guru**** 657930 points
Other Parts Discussed in Thread: MSP430I2021, MSP430F2252
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/850692/ccs-msp430i2021-reset-occurs-if-disabling-and-then-enabling-ucrxie-on-eusci_a-peripheral-in-uart-mode

器件型号:MSP430I2021
主题中讨论的其他器件: 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 略有不同)。

有什么想法吗?

谢谢大家。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vagni、

    有趣的问题。  我不确定器件复位的原因、但我看不到 USCI 复位器件的任何勘误表。  

    在调试器件时是否仍会发生这种情况?  如果是这样、您能否检查复位标志、因为它们可能会导致一个原因。   

    数据表的第6.6节 确定了导致器件复位的4个中断标志。  它们是 BORIFG、RSTIFG、WDTIFG。  WDTIFG 还包括 KEYV (密钥或存储器违反)。  这些标志位于 IFG1寄存器中。

    我要做的是在代码的开始、添加一条 if 语句来检查这些标志并放置一个断点。  然后、如果在调试时复位、您应该能够看到源代码。  然后我们可以从那里开始。  

    谢谢、

    JD   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    JD、您好!  

    我在调试时检查了复位标志:当复位问题发生时、源复位标志(BORIFG、RSTIFG、WDTIFG)都不会被置位。 在这种情况下、IFG1寄存器中只有 OFIFG 标志始终置1:它是正确的吗?

    I CONFIRM:没有到 UCA0IE 寄存器中 UCRXIE 位的频繁写访问、就不会发生复位。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Vagni、

    我假设 I2021上没有连接振荡器。  是这样吗?  如果是、那么该位始终置位是可以的。  它用于确定一个稳定的时钟信号被馈送到振荡器模块。  

    非常有趣的是没有设置复位标志...  我觉得这是不可能的。   

    您如何确定器件已复位?  

    谢谢、

    JD  

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    JD、您好!

    MSP430I2021未连接振荡器。

    使用调试器(low_level_init.c 源文件中_system_pre_init ()函数中设置的断点) 、我看到我的应用程序在随机数秒后突然重新启动。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了显示模块是链接在一起的并且这定义了它们的优先级之外、手册没有提供很多关于中断系统的详细信息。 即使没有电路细节、这似乎也不可能导致复位。 可能是 NMI。 您有 NMI 处理程序吗? 如果没有、请添加一个简单的、以便您可以查看它是否被触发。

    假 NMI 与重置一样糟糕、也是一个错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在电路板上、我使用 连接到按钮和 RC 网络的 RST_NMI_SBWTDIO 引脚进行外部复位。 按钮用于触发我的 NMI 处理程序。 在我的 NMI 处理程序中、只有 NMIIFG 事件(来自按钮按下或释放事件)被处理;其他标志(OFIFG 和 ACCVIFG)只有在被置位时被清除、这是因为 ACCVIE 和 OFIE 都被设定为0。


    RST_NMI_SBWTDIO 和 TEST_SBWTCK 引脚也用于 2线制 JTAG (Spy-Bi-Wire)程序/调试接口。

    当复位问题发生时、NMI 处理程序不会被触发。





  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好,Vagni

    您能否上传复位检查代码? 我认为这应该是 JD 提到的复位之一。

    此致

    Gary

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gary、

    使用调试器和    low_level_init.c 源文件中_system_pre_init()函数中设置的断点,我看到我的应用程序在随机数秒后突然重新启动。 发生该情况时、IFG1 = 0x02 (请参阅随附的屏幕截图)。

    谢谢、

    Vagni

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好,Vagni

    您能否上传测试代码示例以重现此问题?  

    此致

    Gary

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vagni、

    很抱歉我这边耽误你的时间。  您是否仍有此问题?  您是否有一些代码重复了您可以与我分享的问题?   

    我还回顾了用户指南中的系统复位源、WDT 和闪存 PW 冲突似乎也会直接导致器件 PUC。  WDT 标志位于您在上面查看的 IFG2寄存器中、但实际上、闪存违例会设置 FCTL3寄存器中的位。  特别是 KEYV 和 ACCVIFG 位。   

    您是否还可以检查这些位以查看复位是否来自闪存密码违规?   

    谢谢、

    JD