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.

[参考译文] MSP430F2618:启用中断和实施LPM0后,WDT/UART出现问题

Guru**** 2607805 points
Other Parts Discussed in Thread: MSP430F2618

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/655658/msp430f2618-problem-with-wdt-uart-after-enabling-interrupt-and-implementing-lpm0

部件号:MSP430F2618

大家好,

我正在处理BSL项目,该项目运行良好,直到我继续实施LPM0并启用通过ISR接收UART字符,而不是在设置RXIFG时读取RX缓冲区。

我的项目将UCA0用于UART,将WDT计时器间隔用于超时。 当它工作时,没有启用中断例程,将查找 IFG2和UCA0RXIFG以 直接从UCA0RXBUF接收。 我实施了LPM0,它改变了接收机制,现在我在 启用 IE2 |= UCA0RXIE后在__interrupt void usart0_rx(void)中接收;它将帮助我 从LPM0唤醒,因为它会产生中断。 在我的初始化序列中,我使用 IE1 &=~WDIE禁用监视程序计时器中断,然后清除监视程序间隔计时器标志。  

当我发送.txt文件时,我的UART接收似乎工作正常,并且在接收字符时不使用超时。 但是,当我通过Xmodem传输固件时,程序在我认为的第一个字节就中断,转到 _c_int00_noargs_noexit()。  


__interrupt void usart0_rx(void)将收到的字符放入我的Rx_buf环缓冲区中,我使用以下函数从环缓冲区中读取字符。 GetCharTM()中的一个使用超时。   

extern "C"
__interrupt void usart0_rx(void)
{
字符;
CH = UCA0RXBUF; //获取我们已阅读的字符

IF (!rx_buf.put (ch))
{

}
否则
{

}

__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);
}


int main (int argc,char* argv[])
{....



//串行端口初始化

UCA0CTL1 = UCSSEL1 + UCSSWRST; //**初始化USCI状态机**
IE2 &=~UCA0RXIE; //禁用USI_A0 RX中断
UCA0BR0 = 0x15;//0xAD;//0x11; // 16MHz/5.76万 =//10MHz/9600 = 1041.667 = 0x0411 -> 9600波特的除数
UCA0BR1 = 0x01;//0x00;//0x04; // 277.78 = 0x115 //10MHz/5.76万 = 173.111 = 0x00AD -> 5.76万波特的除数
UCA0MCTL = UCBRS2 + UCBRS0; //调制UCBRSx = 5舍入错误
UCA0CTL1 &=~UCSWRST; //**初始化USCI状态机**
P3SEL || BIT4 + BIT5; // WFP 3.4 ,5 = USI_A0 TXD/RXD
P3SEL || BIT0;
P3DIR &=~BIT0;

//监视器计时器初始化-我们将监视器计时器置于间隔模式
//将WDT+更改为间隔计时器模式,ACLK,时钟/8192间隔

IE1 &=~WTIE; //禁用看门狗计时器中断-我们不使用
IFG1 &=~WDTIFG; //清除看门狗间隔计时器标记
WDTCTL = WDTPW + WDTCNTCL + WDTTMSEL + WDTIS0; //将WDT+更改为间隔计时器模式

//初始化变量
//P3OUT |= 0x08;

IE2 |= UCA0RXIE; //启用USI_A0 RX中断
__bis_sr_register (GIE); //启用全局中断,当前的Rx中断来自Mac和Hso

...

,同时(1)
{
__bis_sr_register(LPM0_bits+GIE);
...
/*从环形缓冲区读取char cmd[256]此处*/


ProcessCommand(cmd);//将命令传递给命令处理器
}
}

作废TimerSpin()
{
静态int timer_tick_count = 2;
static int secCounter = timer_tick_count;

IF((IFG1 & WDTIFG)&&--secCounter )
{
secCounter = timer_tick_count;
IFG1 &=~WDTIFG;
//倒计时任何处于活动状态的时间
IF( getCharTimer!=0) getCharTimer--;
}
return;
}

Int16_t GetChar()
{
字符;

while (!rx_buf.get (ch))
{
TimerSpin();
}
返回通道
;}

Int16_t GetCharTMo (uint16_t TMO)
{
字符;

getCharTimer = TMO;

while (!rx_buf.get (ch))
{
TimerSpin();

IF( getCharTimer ==0)
返回-1;
}
返回ch;
}





注:在LPM0中,我的程序等待接收字符。 一旦接收到字符,它将从低功耗模式唤醒,并在接收中断例程中禁用LPM0,然后在正常模式下等待固件。  

暂停调试模式将显示以下堆栈。  

我不知道是什么导致我的计划中断。 当我开始通过Xmodem接收时,无法在终端上打印任何内容。 开始发送固件映像时中断。 我认为这与中断有关。 任何调试帮助都将受到欢迎。   

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

    能否发布您的USCI初始化,LPM条目和ISR? 我有点困惑,因为您的中断定义指的是USART,它是MSP430F2618上不存在的外设。 引用错误的中断向量可能会导致CPU陷印。

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

    感谢您的快速回复。 我已更新上述相关代码。 希望这会有所帮助。 它的USCI,我只是将ISR命名为USART。

    ProcessCommand()等待正确的命令,并使用Xmodem()接收固件。 Xmodem()在收到第一个字符时使用getCharTM()和nreaks。

    ProcessCommand()-> Xmodem()-> getCharTM()

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    usart0_Rx是指什么中断向量地址? 我假设您的SMCLK设置中的波特率设置正确,但我会从15.3 节中选择数字。13。

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

    ISR23.

    请参阅中断向量的附加文件。

    我将更新并尝试您提到的部分中的波特率。 但是,USART_ISR和 IE2|= UCA0RXIE之外的USSCI设置在我实施LPM0之前工作。 我以前能够通过UART (USCI)传输固件文件。  

    e2e.ti.com/.../xfervect.asm

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

    USCI的设置绝对不是不正确的,只是可以改进。 间隔计时器中断向量是ISR26,在看门狗模式下是ISR31。  是否可以使用调试器的内存窗口来确保 0FFEEh指向RX ISR的有效地址?

    此致,
    Ryan

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

    Ryan,

    我错误地单击了"解决我的问题"选项卡。 我是否必须创建另一个问题?

    要回答您的问题,0x0FFEE的地址为0x3128。 0x3128地址具有类似"$../xp热情.ASM:34:44$, ISR23"的字符串。 在我的矢量表文件xpise.asm中,ISR23位于第34行。 因此,我认为它指向正确的RX ISR地址。

    通过仔细观察,我发现当我发送第一个字符时,PC跳转到Vector Table并查找地址0x314c。 它位于ISR31() ox3148的地址后面。 Xpir热 器部分位于0x3100-0x3150。3150。但继续逐步调试,PC尝试在0x314c跳转,在该处找不到任何符号并中断。
    此外,当我从终端发送字符并在RX中断例程中放置中断点时,它永远不会到达断点。 甚至在进入RX中断向量之前也会中断。 我认为这与我所说的PC在地址0x314c处跳转而找不到任何东西并进而崩溃有关。

    有什么想法??? 我在哪里可以努力???

    感谢您的帮助。

    此致,
    里希特

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

    不需要另一个帖子,我们将继续通过此主题解答您的问题。 您似乎在正确的路径上,xpiect.asm文件似乎有一些错误,不允许在设置RX IFG后输入正确的ISR。 我不熟悉此装配体解决方案,因此目前没有直接答案。

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

    Ryan,

    感谢您的回复。  

    更多信息,我尝试以不同的方式完成整个工作。 我在从LPM0唤醒后清除它,而不是保留UCA0RXIE设置。 希望它能像我没有实施LPM0时那样工作(工作时没有中断事件)。 这样,一旦我从LPM0唤醒并清除UCA0RXIE位,就不会有任何中断事件,一旦设置UCA0RXIFG,我就可以直接从缓冲区读取。 同样,现在使用此设置,它使用GetChar()读取文本文件,但当它开始使用GetCharTM(uint16_t TMO)读取固件文件时,它显示的行为与我保持RX的中断事件打开时的行为相同。 (可能与WDT和RX IRS混在一起)

    根据用户手册,未设置UCARX0IE时,设置RX中断标志时不应出现任何中断事件。 但是,当设置中断标志时,它仍然有中断事件并跳转到向量表(我确定我没有在其他任何地方设置UCA0RXIE)。  

    我找不到任何关于'UCA0RXIE一旦设置,就不能即时更改'的信息。 如果我错了,请纠正我。  

    我真的需要使用LPM0来执行此操作。  

    感谢您的回复。

    此致,

    里希特

    EDIT1:我认为它适用于动态禁用的中断事件。 我正在验证。 请等待我回来。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我收回我在上次答复中所写的全部内容。 我现在可以在运行中禁用中断事件。 但原来的问题仍然存在。 我正在实施一个临时解决方案,以便在短期内降低权力。 但是,当中断事件打开时,我需要让LPM0正常工作。

    感谢Ryan的耐心。

    此致,
    里希特