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.

[参考译文] MSP430FR2355:为什么我的应用程序要重新启动?

Guru**** 2543220 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/841188/msp430fr2355-why-is-my-application-restarting

器件型号:MSP430FR2355

因此、我的软件的主体循环运行。 循环会持续一段时间。 对于本次对话、它几乎是一个无限循环。  

在循环发生之前、它实际上只是设置 TimerB、RTC 和 GPIO 引脚。  

一旦我们到达环路、这就是流程

如果 USB 已连接且!burse_cycle
如果
!USB 已连接且 BURST_CYCLE、则进入菜单模式
如果
!burse_cycle、则禁用 burse_cycle
准备4 LPM
如果!USB 已连接且未达到 lpm 时间
输入 LPM
退出 LPM
计算 LPM 中的时间并添加到系统时间
唤醒
如果 USB 已连接且!burse_cycle
在回路
准备开始时重新启动,以便扫描
预定的时间段,或直到!USB 连接
的结束扫描功能在
回路开始时开始

这里是循环本身的实际代码。  

而(localrecord < 0xFFFF)//FFFF 是磁盘上可能的最后一条记录
{

//检查 USB 电缆是否连接到器件,但不在 terminal_debug 中。
IF (((P2IN 和 BIT4)&&!BURST_CYCLE)
{

run_menu();

继续;
}
否则、如果(!(P2IN & BIT4)&& BURST_CYCLE)
{

BURST_CYCLE = 0;
继续;
}
//连接或断开 USB 电缆但退出主菜单而不处于终端调试模式时的正常操作。
否则、如果(!burse_cycle)
{

prep_4_sleep();

while (!(P2IN & BIT4)&&(lpm_count < lpm_multiplier))
{

enter_low_power_mode();
CALC_SYS_TIME (LPM_PERIOD);
LPM_COUNT++;

}

LPM_COUNT = 0;

WAKE_UP();

delay_ms (500);

IF (((P2IN 和 BIT4)&&!BURST_CYCLE)
继续;

}

prep_scan();

start_read = time2Sec ();

readFlag = 1;

操作
{

read_sensor();
if (readFlag)
readFlag =计数器(START_READ、READTIME);

if (!(P2IN & BIT4)&&(numOfComReads ==1))
中断;

}while (readFlag ||(numOfComReads!=1));

end_scan();
} 

我看到的是应用本身在随机时间进行重置。 它将正常运行、然后从 Main 方法的开头全部启动。  

现在、我知道 LPM 的软件示例不使用循环、而是在预定的时间进入 LPM、退出、主菜单会自行重新启动。 不是我的人预先确定他们希望通过使用循环来实现软件。 而不是使用芯片的自动重启方面。  

如何防止从主方法的开头重新启动软件?  

请记住、我认为 while 循环令人兴奋、因此我在 while 循环之外抛出了一个断点、它从未跳过。  

现在我已经想到了、我很确定它不是从 Main Method 的开头重新启动、而是重新加载整个软件包。 我对此是否正确?

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

    SYSRSTIV 说什么? [参考数据表(SLASEC4B)表6-12]

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

    Bruce、您好!  

    SYSRSTIV 被设定为一个值0x0002。

    查看 MSP430FR2355数据表的表6-12。 它显示02h 是一个欠压事件 (BOR) 。  

    因此、通过查找 BOR、我找到了的定义  

    电源中有意或无意的电压降。 

    当寄存器 SYSRSTIV 设置为0x0002时、请原谅我。 这是否意味着如果发生 BOR 或发生 BOR、它将复位? 它看起来始终是0x0002的值。 在用户指南中、BOR 在以下事件期间发生。  

    •
    •当配置为复位模式时、为 RST/NMI 引脚上的器件上电低电平信号
    •从 LPMx.5 (LPM3.5或 LPM4.5)模式唤醒事件
    •使能时、SVSH 低电平状态(详细信息请见 PMM 一章)
    •软件 BOR 事件 

    我可以排除为器件加电的问题。  

    从 LPMx.5中唤醒后、RST/NMI 似乎跳闸、这种情况似乎不会发生、因为每次我将电路板置于 LPM 中时、复位都不会发生。 但是、我的电路板确实将 RST/NMI 引脚连接到我所连接的 JTAG 14引脚连接器。 我将与 EE 讨论、看看是否有低电平信号导致了该问题。  

    我不确定什么是 SVSH、我将进一步了解这一点。  

    我相信我在任何时候都不会做软件 BOR。 但是、再说一次、我不确定如何执行该操作、因此我不知道我是否是。 这里还有更多研究。  

    如果你有一个方向,我应该先研究,那就很好了。  

    再次感谢您的观看。  

    Michael

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

    我仍然不清楚(a)您期望发生什么与(b)实际发生什么。

    您使用的是哪种 LPM? LPM0-4内联执行、WAKEUP 执行下一条指令。 LPM3.5/4.5通过复位矢量唤醒。  

    如果您不确定是否涉及复位、则可以在 main 的第二行(具有 main 第一行的调试器工具)设置断点。 更好的一点是在复位入口点(通常为_c_int00)处有一个断点、因为此时会保留许多预复位环境。

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

    Bruce、  

    当我不与芯片交互时、我希望发生什么。 是由它自己进入和退出 LPM。 基本流程应如下所示

    我的软件的主体是循环。 因此、它的设置是进入和退出 LPM。 我使用的是 LPM3。 这是我的设置 LPM 函数

    void RTC_LP_Timer_setup (unsigned int LPT)
    {
    
    RTCCTL &=~ RTCIE;
    
    操作
    {
    
    CSCTL7 &=~(XT1OFFG | DCOFFG);
    SFRIFG1 &=~OFIFG;
    }
    while (SFRIFG1和 OFIFG); //测试振荡器故障标志
    
    _enable_interrupt ();
    
    闪存(1、1000);
    
    RTCMOD =(LPT * 32)- 1;
    //初始化 RTC
    //源= 32kHz 晶振,除以1024
    RTCCTL = RTCSS_2 | RTCSR | RTCPS_7;
    RTCCTL &=~RTCIE;
    } 

    void enter_low_power_mode ()
    {
    
    TB0CTL &=~TBIE;
    TB0CTL &=~MC_2;
    RTCCTL |= RTCSR | RTCIE | RTCSS_2;
    bis_SR_register (LPM3_bits| GIE);
    RTCCTL &=~RTCIE;
    RTCCTL &=~RTCSS_2;
    TB0CTL |= TBIE | TBCLR | MC_2;
    } 

    毫无疑问、软件正在自行复位。 正如您所建议的那样、我在第二条线路上投了一个断点、然后它跳闸了。 因此它已经过验证  

    现在、在唤醒前、我有 LPM3 10秒。 它进入 LPM3 10秒、然后唤醒。 此时它不会触发复位。 当 RTC 生成一个我使用的中断信号时  

    low_power_mode_off_in_exit (); 

    中断。  

    我也使用  

    low_power_mode_off_in_exit (); 

    连接 USB 设备时。 我有另一个 ISR 需要识别何时连接 USB 器件以退出 LPM。  

    因此、我现在要进行测试、当我处于延迟环路中时、系统似乎会自行复位。  

    我必须在两次操作之间等待60秒。 那么、我编写了一个延迟函数、时间为毫秒。 呼叫

    delay_ms (60000); 

    函数

    void delay_ms (unsigned int ms)
    {
    
    while (ms)
    {
    
    _delay_cycles (8000);
    MS-;
    }
    } 

    我在一段时间前已经读过,如果我记得正确的话,应该不要使用 delay_cycles()调用来阻止中断。 但我计划实施计时器调用、稍后将替换它。 现在、这变得更加简单。  

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

    看门狗定时器是如何配置的? 用户指南(SLAU445I)表12-2中提到了16秒超时(32kHz 时钟)、时间介于10和60秒之间。

    _delay_cycles 本身不会阻止中断。 如果您在禁用中断的上下文中使用它、那么中断将被阻止这么长时间。

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

    我认为在程序开始时禁用了看门狗计时器

    WDTCTL = WDTPW | WDTHOLD; 

    但是、验证 WDTCTL 的值是0x6980或110100110000000。 位7设置为1、因此看门狗计时器停止。  

    我昨天花了时间进行调试、试图弄清它到底在哪里复位。 如果程序中有特定点。 我想我把它缩小到30秒 DELAY_CYCLE、但我评论了之前的延迟、后来发生了延迟、然后我开始连接一个示波器、以便我可以查看电源功耗、看看是否有任何骤降或尖峰、 当我打开和关闭电路板上的泵引脚时、我注意到了一些有趣的事情。 但是、由于只是四处探查、它开始工作。 我运行了大约一个小时、没有复位。 今天我将再次运行几个小时、看看是否发生了复位。 看看会发生什么情况。  

    我可能需要对此提出一个新问题、但为什么我发现的有关 delay_cycles 的所有信息都是一种不良做法、因为它们会阻止中断?  

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

    如果您可以在"Reset"条目处断点、则会保留大部分"Pre-Reset"上下文。 (名称类似于_c_int00;如果需要、请使用工具栏中的"硬重置"按钮、查看它将带您进入的位置。) PC 已消失、但 SP 未出现。 走回堆栈需要相当多的耐心、但我已经做过很多次了。

    我不能真正评论你在其他地方读到的东西。 _delay_cycles 不会(自身)禁用中断。 通常的论点是"你应该使用 LPM",这种说法虽然不是总是正确的--例如,对于非常短的延迟,它比 LPM 便宜。 它简单、自包含且可靠。

    __delay_cycles 不是魔术--它生成计数循环,并根据指令时序进行计数调节。 您可以对 for ()循环执行相同的操作、但校准循环(因为编译器可以对其执行各种操作)非常困难。

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

    Bruce、  

    在哪里可以找到 _c_int00。 我已经完成了一些搜索、它引用了 boot.h 我在 Code Composer 的 src 库中的器件目录中找到这些文件。 我尝试将文件添加到我的项目员工中、但当我尝试插入中断语句时、它告诉我从未调用过该文件。  

    我是否查看了正确的文件和/或 在调用_c_int00时如何插入 breakstatement?

    我尝试在 stack_init();call 处插入断点

    void _c_int00_template (int needs_args、int need_init、int needs_mpu)
    {
    stack_init ();
    
    if (need_mpu)
    _mpu_init();
    
    /*------------------ 在
    初
    始化 C/C++环境(全局变量初始化、*/
    *构造函数)之前、*//*允许任何应用特定的低级初始化。 如果_system_pre_init()返回0,则绕过 C/C++ */
    *初始化。 注意:绕过对 C/C++初始化*/
    //*例程的调用可能会导致程序失败。 */
    //*----------------------------------------------------------------------------------------------------- //
    if (_system_pre_init ()!= 0)
    {
    if (needs 初始化)
    _auto_init();}/*--><!--kadov_tag{</spaces>}}-->
    
    
    //
    //*处理任何 argc/argv 参数(如果 MSP430加载程序支持)。 */
    //*----------------------------------------------------------------------------------------------------- //
    if (needs _args)
    args_main_main();
    否则
    MAIN (0);
    
    EXIT (1);
    } 

    当我获得这些欠压时、我已经标记了。 我可以看到、它完全是随机的。 插入 USB 器件时可以获得、BOR 之后可以立即获得、器件进入 LPM3可能需要几分钟、此时它将休眠30分钟。 我看不到任何明显的模式。  

    已更新: 您知道上述内容。 我注意到它顶部的模板。 我找到了正确的呼叫位置。  

    CSTART_DECL _c_int00 (void)
    {
    _c_int00_template (1、1、0);
    } 

    我在_c_init00_template (1、1、0)旁边插入了 break 语句;现在我只是在等待欠压。  

     

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

    Bruce、  

    和我的另一个回复一样、我尝试使用您关于 _c_int00的建议。 我找到了位于 boot.c 中的_c_int00函数 我插入了一个断点、但 SP 中没有任何内容。 我想我会检查其他文件以查看函数实际被调用的位置、并将断点放在调用本身上。 我在 CCS 中搜索了所有文件记录、只找到了三个引用了_c_int00的文件。 boot.c、mpu_init.c 和 pre_init.c。MPU 和 pree 文件仅包含有关_c_int00的注释、实际上没有语句。  

    我还扫描了工作区中是否有_c_int00的引用、并且在.xml 文件中仅找到了_c_int00_noargs_mpu 的引用。  

    您能告诉我您之前取得了哪些成功吗?  

    感谢你能抽出时间并提供帮助。  

    Michael

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

    当我不确定使用哪个_c_int00变体(根据 CCS 项目设置、我认为)时、我点击工具栏中的"Hard Reset"按钮、查看它将我带到哪里。 按钮大致位于中间,图标看起来像一个 MCU 芯片。

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

    我暂停了程序并执行硬复位。 (我使用复位的唯一方法是程序暂停、不确定这是否正常)。 我是对的  

    CSTART_DECL _c_int00 (void)
    {
    _c_int00_template (1、1、0);
    } 

    这与我在另一天发现的功能相同。 但是、我无法在调用栈中看到任何内容。  

    为了澄清这一点、我不是在找对的地方。 我上拉 Debug 视图、在微控制器名称下是我一直在查看调用栈的位置。   

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

    实际上、我讨论的是使用内存浏览器通过堆栈(从 SP 值开始)。 正如我所说,这需要相当多的耐心;我只是在没有其他东西的情况下才这样做。

    如果您决定尝试、我建议首先查找类似代码地址的字。 其中第一个将是最新的调用方函数;Disassembly 窗口可帮助查找名称。 您可能应该预算一个小时左右。

    如果您决定不尝试、任何人都不会责怪您。

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

    是的、我看到您的说法是什么。 昨天晚上、我更仔细地阅读了文档、发现 SP 是从寄存器中读出的。  

    什么是代码地址?  

    我相信我在任何地方都没有必要的经验来解决这个问题。 未知因素太多了。 我会去看看、但我认为我不能弄清楚这一点。 不确定从哪里去。  

    Bruce、像往常一样、您一直是一个很好的帮助人。 我感谢所有信息。 我真的很感激。  

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

    好的。 我并不是要分散你的注意力,我只是把它作为一种可能的策略。 (通过"代码地址"、我只是指0x8000和0x80之间的一个数字、这是(高概率)指向代码的指针。)

    您还发现了哪些其他实验?

    一个问题是、我们通过一个非常小的窗口看到您的程序。 另一种策略是开始删除代码片段、直到症状停止。 这将为您(以及我们的其他人)提供一个关注的地方。

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

    Bruce、  

    你完全没有分散我的注意力。 你给了我一些建议、我很感激。 我需要了解如何读取存储器浏览器并在某个时候使用它进行调试。 我认为我现在还不知道该怎么做。  

    我已经开始后退、试图找到它的工作点。 因为 BOR 会在我启动程序的几分钟内或最多39分钟内出现、所以它会很耗时。 39分钟是我在没有 BOR 的情况下运行程序的最长时间。  

    与同事一起工作时、他认为这是一个中断问题、我们从 TimerB 的 ISR 中删除了 switch 语句、然后插入了一条带有标志复位的 if 语句

    // Timer0_B3中断矢量(TBIV)处理程序
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=TIMER0_B1_Vector
    __interrupt void TIMER0_B1_ISR (void)
    #elif definef defined (__GNU__)#pragma vector=TIMER0_B1_BIMCU_
    (void)(void TIMER0_B1)(void)(void TI_INTERRUPT)#interrupt
    
    0!(void TIMERB1_ISR (void)(void)(void)
    #endif
    {
    // switch (__even_in_range (TB0IV、TB0IV_TBIFG))
    //{
    /// 案例 TB0IV_NONE:
    //// 中断; //无中断
    // 案例 TB0IV_TBCCR1:
    /// 中断; //未使用 CCR1
    //// 案例 TB0IV_TBCCR2:
    /// 中断; //未使用 CCR2
    // 案例 TB0IV_TBIFG:
    //
    // //P1OUT ^= BIT0;
    // //IIIII++;
    
    IF (TB0IV_TBIFG)
    {
    my_seconds=my_seconds+1;
    if (my_seconds=60){my_seconds =0;my_minutes++;}
    if (my_minutes=60){my_minutes =0;my_hours++;}
    if (my_hours==24){my_hours =0;my_days++;}
    }
    
    TB0CTL &=~TBIFG;
    // 中断;
    // 默认值:
    // 中断;
    //}
    

    与我所说的内容的对比。  

    他认为、由于我使用两个计时器、Timer B 和 RTC、计数方式中必须有一些会导致中断发生冲突并导致 BOR 的东西。 他似乎认为中断比 Timer B 设置的时间间隔长一秒、因此会引起随机弹出的问题。  

    我的 Timer B 设置

    void active_timer_setup()
    {
    
    // ACLK、计数器长度、计数模式、除法器、清零 TBR、 启用中断
    // 32768、0FFFh、连续、/8、清除使能
    TB0CTL = TBSSEL_1 | CNTL_1 | MC_2 | ID_3 | TBCLR | TBIE;
    }
    
    

    我目前正在做的是运行交给我的程序。 它仅使用单个计时器 RTC、
    我将让它运行一个小时左右。 看看它最初是否在那里。 然后、我将开始工作
    我所做的事情向后移动。 模块时进行的测试。 除了添加第二个计时器外、
    我的代码版本可与更多外部硬件配合使用、例如操纵泵和一些螺线管。
    进一步整理代码、通过创建函数来删除冗余语句、通过新类来组织它们等
    我们只需说、自从推出代码以来、已经发生了很多变化。

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

    Bruce、您好!  

    所以我对我的程序的整个主体进行了注释。 现在、它将经过配置、并点击一条什么都不做的 while 语句。 我让它运行、它仍然有一个 BOR。 我昨天已经注释了 RTC 计时器、让它仅使用 TimerB 运行

    active_timer_setup(); 
    void active_timer_setup()
    {
    
    // ACLK、计数器长度、计数模式、除法器、清零 TBR、 启用中断
    // 32768、0FFFh、连续、/8、清除使能
    TB0CTL = TBSSEL_1 | CNTL_1 | MC_2 | ID_3 | TBCLR | TBIE;
    } 
    // Timer0_B3中断矢量(TBIV)处理程序
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=TIMER0_B1_Vector
    __interrupt void TIMER0_B1_ISR (void)
    #elif definef defined (__GNU__)#pragma vector=TIMER0_B1_BIMCU_
    (void)(void TIMER0_B1)(void)(void TI_INTERRUPT)#interrupt
    
    0!(void TIMERB1_ISR (void)(void)(void)
    #endif
    {
    
    switch (__evo_in_range (TB0IV、TB0IV_TBIFG))
    {
    案例 TB0IV_NONE:
    中断; //无中断
    案例 TB0IV_TBCCR1:
    中断; // CCR1未使用
    案例 TB0IV_TBCCR2:
    中断; //未使用 CCR2
    案例 TB0IV_TBIFG:
    
    my_seconds=my_seconds+1;
    if (my_seconds=60){my_seconds =0;my_minutes++;}
    if (my_minutes=60){my_minutes =0;my_hours++;}
    if (my_hours==24){my_hours =0;my_days++;}
    
    中断;
    默认值:
    中断;
    }
    } 

    没有问题、我回来了、它已经运行了16个小时、没有 BOR。  

    因此、我在前面已经注释掉了 TimerB、并删除了 RTC 计时器的注释

     

    LPM_PERIOD = 30;//秒 
    RTC_LP_Timer_setup (lPM_PERIOD); 
    void RTC_LP_Timer_setup (unsigned int LPT)
    {
    
    RTCCTL &=~ RTCIE;
    
    操作
    {
    
    CSCTL7 &=~(XT1OFFG | DCOFFG);
    SFRIFG1 &=~OFIFG;
    }
    while (SFRIFG1和 OFIFG); //测试振荡器故障标志
    
    _enable_interrupt ();
    
    闪存(1、1000);
    
    RTCMOD =(LPT * 32)- 1;
    //初始化 RTC
    //源= 32kHz 晶振,除以1024
    RTCCTL = RTCSS_2 | RTCSR | RTCPS_7;
    RTCCTL &=~RTCIE;
    } 
    ////////////////////////////////////////////// 定时器中断服务例程####################################
    //
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector=RTC_vector
    //这是使用
    的中断代码__interrupt void RTC_ISR (void)
    
    #elif defined (__GNU__)
    void __attribute__((interrupt (RTC_vector)))#else
    
    
    
    编译器#error!
    #endif
    {
    开关(__evo_in_range (RTCIV、RTCIV_RTCIF))
    {
    案例 RTCIV_NONE:
    中断; //无中断
    案例 RTCIV_RTCIF: // RTC 溢出
    {
    
    //如果自上次激活后的时间不大于睡眠时间,则不会完全唤醒。
    _low_power_mode_off_in_exit ();//退出低功耗模式3.
    中断;
    }
    
    默认值:
    中断;
    }
    //_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//退出低功耗模式3
    
    } 

    并在一个半小时内重置。 我知道这并不一定意味着 RTC 就是问题所在。 但这是迄今为止最好的铅。  

    我觉得有趣的是在 RTC_LP_Timer_setup()中我禁用了中断。 我在 RTC ISR 中插入了一个断点、它从未跳闸。

    什么会导致与 BOR 相关的 BOR? 我知道、如果我退出 LPM3.5、会发生 BOR、但我从未进入 LPM3.5。 我从来不会打电话

    bis_SR_register (LPM3_bits| GIE); 

    已在主循环中注释掉。 之前当我输入 LPM 时、它是 LPM3、因为在 LPM OSCOFF 中、它仍然被启用。  

    有什么想法吗?

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

    是否多次调用 RTC 设置函数?

    另外,flash()有什么作用?

    [编辑:我忘记问:您提到了泵和螺线管。 它们是否离得相当远(物理和电气方面)?]

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

    是否多次调用 RTC 设置函数?

    • 是和否 当程序完全执行时、在开始时调用 RTC 设置以设置默认 LPM 时间。 但是、如果用户需要更短或更长的时间、则可以调用一个将更新 LPM 的命令。 该命令计算他们需要的时间、然后调用 RTC 设置来应用新时间。  
    • 但是、在当前的程序形式中、我注释掉了大部分代码。 它只调用 RTC 设置一次。 使用这一个调用、它仍然会触发 BOR

    另外,flash()有什么作用?

    • 闪存是一个延迟、它是交付给我的原始软件的一部分。 其最初目的是使开发板上的 LED 闪烁。 现在、它会在您对其所放置的任何时间内发出延迟。 我把它取出来,因为它不是必要的,它仍然有一个 BOR。   

    [编辑:我忘记问:您提到了泵和螺线管。 它们是否离得相当远(物理和电气方面)?]

    • 不、我不会认为它们处于某个距离。  我想说、电路板上可能有一英尺的导线、目前连接到泵或传感器。 此时、螺线管实际上并未连接到电路板。

    那么、我目前正在配置一个新程序。 慢慢地从原稿中拉入内容、看看我是否看到同样的问题。  

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

    嗨、Michael、

    只是想赶上这里这个长线程。  很抱歉,如果我漏了一些东西。   

    首先、BOR 是器件复位、只能由几个事件引起。  所有这些都列在系列用户指南的第1.2节中。   http://www.ti.com/lit/ug/slau445i/slau445i.pdf   几乎所有这些引脚都从 LPMx.5或 VCC 或复位上的外部电压挖掘中唤醒。   

    如果您看到 BOR、则可能是硬件问题。  您是否在 VCC 或复位上看到任何噪声或突降?  

    如果它与软件相关、那么它可能不是 BOR。  SYSRSTIV 寄存器实际上嵌套了复位源。 (第1.3.7节) 如果您从未读取过该寄存器、那么它可能会始终从初始上电返回 BOR、因为它是最高优先级的中断。  

    现在、我将在软件启动时以断点循环读取寄存器、直到它读取0x00、并观察每个值。  我想、除了 BOR 之外、您还会看到一些东西、这些东西将引导我们朝着正确的方向前进。

    谢谢、

    JD    

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

    JD、  

    大家好、感谢您的支持。 这个社区一直是一个很好的资源。  

    VCC 或复位时无噪声或突降。 这些是我们查看的电路板的前两个区域。 请记住、当我运行原始代码或 TI 的任何示例代码时、运行正常。 切勿复位、除非其意图是这样。 因此、我认为说它不是硬件问题是相当安全的。 我已经在开发板上测试了失败的代码。 但仍然失败了。  

    话虽如此,我相信我昨晚可能无意中发现了这个问题。 于是我创建了一个新项目、并开始使用原始软件。 我开始逐模块介绍我所做的所有更改。 我会运行每个部分一个小时或直到它复位。 我初始化 GPIO 端口的部分导致了复位。  

    让我们返回到我所做的。 在我编写软件时、我停止添加新功能、并开始返回并清理代码。 主要是添加注释、但我也花了一些时间来查看与功耗相关的警告和建议部分。 因此、我们建议的其中一项内容是端口7 - 10和 A - E 未初始化、应将其初始化为默认值。 嗯、看芯片布局、我没有看到任何端口7 - 10或 A - E、所以我发现它们不在那里、只是初始化它们有什么危害。 那么、在我的 GPIO 初始化函数中、我实现了这一点。  

    void init_gpio()
    {
    
    P1DIR = 0x00;P2DIR = 0x00;P3DIR = 0x00;P4DIR = 0x00;P5DIR = 0x00; P6DIR = 0x00;
    P1REN = 0xFF;P2REN = 0xFF;P3REN = 0xFF;P4REN = 0xFF;P5REN = 0xFF; P6REN = 0xFF;
    P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;P5OUT = 0x00; P6OUT = 0x00;
    P1SEL0 = 0x00;P2SEL0 = 0x00;P3SEL0 = 0x00;P4SEL0 = 0x00;P5SEL0 = 0x00; P6SEL0 = 0x00;
    P1SEL1 = 0x00;P2SEL1 = 0x00;P3SEL1 = 0x00;P4SEL1 = 0x00;P5SEL1 = 0x00; P6SEL1 = 0x00;
    P1IES = 0x00;P2IES = 0x00;P3IES = 0x00;P4IES = 0x00;P5IES = 0x00; P6IES = 0x00;
    P1IE = 0x00;P2IE = 0x00;P3IE = 0x00;P4IE = 0x00;P5IE = 0x00; P6IE = 0x00;
    
    P7DIR = 0x00;P8DIR = 0x00;P9DIR = 0x00;P10DIR = 0x00;
    P7REN = 0xFF;P8REN = 0xFF;P9REN = 0xFF;P10REN = 0xFF;
    P7OUT = 0x00;P8OUT = 0x00;P9OUT = 0x00;P10OUT = 0x00;
    P7SEL0 = 0x00;P8SEL0 = 0x00;P9SEL0 = 0x00;P10SEL0 = 0x00;
    P7SEL1 = 0x00;P8SEL1 = 0x00;P9SEL1 = 0x00;P10SEL1 = 0x00;
    P7IES = 0x00;P8IES = 0x00;P9IES = 0x00;P10IES = 0x00;
    P7IE = 0x00;P8IE = 0x00;P9IE = 0x00;P10IE = 0x00;
    
    PADIR = 0x00;PBDIR = 0x00;PCDIR = 0x00;PDDIR = 0x00;PEDIR = 0x00;
    PAREN = 0xFF;PBREN = 0xFF;PCREN = 0xFF;PDREN = 0xFF;PEREN = 0xFF;
    PAOUT = 0x00;PBOUT = 0x00;PCOUT = 0x00;PDOUT = 0x00;PEOUT = 0x00;
    PASEL0 = 0x00;PBSEL0 = 0x00;PCSEL0 = 0x00;PDSEL0 = 0x00;PESEL0 = 0x00;
    PASEL1 = 0x00;PBSEL1 = 0x00;PCSEL1 = 0x00;PDSEL1 = 0x00;PESEL1 = 0x00;
    PAIES = 0x00;PBIES = 0x00;PCIES = 0x00;PDIES = 0x00;PEIES = 0x00;
    PAIE = 0x00;PBIE = 0x00;PCIe = 0x00;PDIE = 0x00;PEIE = 0x00;
    
    //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    ////////////////////////////////////////////////// 设置所有端口////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    

    此函数在开始时仅调用一次、仅用于默认所有引脚。 以防止任何东西悬空。

    嗯、似乎我不应该在7-10年或者 A-E 中这么做 正如我注释过的那样、软件现在已经运行了几乎17个小时、没有复位。  

    深入到标有字母的端口中、这些端口似乎是配对的端口。 因此、端口 A 是端口1和2的组合。 正如我之前说过的、端口7 -10不在这个芯片上。 由于端口 A-E 是实际的寄存器、因此我假设端口7-10的初始化是真正的故障层。 在数据表或手册中、似乎没有任何对字母端口的引用。 我在论坛上搜索过它、以查找有关它的信息。  

    我将继续让这一天的跑步、看看会发生什么、但它始终会在一小时前重置、因此这是一个非常好的迹象。  

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

    感谢您发表这篇文章、这很有用。 几周前、我只是在这方面的一个问题上说:(另一个问题) MCU 有一组_MSP430_has _PORTn_R_、我很确定它不存在。 设置寄存器(在我的情况下)没有明显的不良影响、但现在我知道不要这么做。

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

    是的、速度不是很快。 它已重新启动。  

    ……………

    是的,这是^我哭的。  

    因此它很奇怪。 因为我在没有重置的情况下、一直无法使其运行这么长时间。 但我在晚上跑了17个小时,没有任何问题。 那么、它为什么运行这么长时间呢? 它是7-10、A-E 的端口设置吗? 可能是一个因素、但现在还不确定了。  

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

    JD、  

    因此、我返回查看 SYSRSTIV、它不再显示、不记得它是什么。 因此、我更改了前几行代码。 看起来是这样的。  

    int main (void)
    {
    
    ///////////////////////////////////////////////////////////// 设置服务/etc///////////////////////////////////
    START_READ = 0;
    readFlag = 0;
    SYSRSTIV = 0x00;
    
    (笑声)
    (笑声)
    
    。} 

    我在文档状态中写入了 SYSRSTIV、这将复位所有挂起标志。 我认为我的操作不正确、因为当它复位并在 readFlag=0时到达块;

    它显示没有标志、SYSRSTIV = 0000000000000 -无   

    我不确定您通过执行循环和读取寄存器意味着什么。 块和查看"Registers"选项卡是否执行相同的操作?

    这两个警告中是否有一个正在发挥作用?

    说明资源路径位置类型
    此项目是使用当前未安装的编译器版本创建的- 18.1.4.LTS [MSP430]。 编译器的另一个版本将在编译期间使用- 18.12.2.LTS。 请参阅"帮助">"安装新软件"并选择"代码生成工具更新"以检查此编译器是否可通过 CCS 更新获得。 访问 CCS App Center 以获取最新的编译器支持。 或者 下载 并安装编译器、然后通过"Preferences > CCS > Build > Compiler"在 CCS 中注册。 flow_Recording 属性问题 
    说明资源路径位置类型
    #10229-D 空:输出段".data"指加载符号"_nop"、因此无法压缩;压缩"lzss"被忽略flow_RecordingC/C++ problem
    
    说明资源路径位置类型
    #177-D 下标超出范围main.c/flow_Recordingline 313C/C++ problem
    

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

    JD 所说的是可能有多个"复位原因"。 如果您读取了 IV、则会得到一个、然后会显示下一个。 (最终变为0。)

    对于大多数/所有在读取它们时发生变化的寄存器、调试器具有特殊的访问方法、可以读取值而无需"读取"、因此该值保持不变。 如果程序未读取 IV、您将不会看到第一个程序后面"隐藏"的任何内容。 写入0会将所有这些位清零、因此您不会看到其中的任何一个。 在写入0之前、如果 iv=0、则看起来是奇数。 (我个人会查看汇编代码、并确保指令未重新排序。 一个聪明的人曾经说过“应该”是宇宙中最弱的力量。”)

    1) 1)编译器版本几乎从不会产生影响。 您可以在“生成设置->常规”页面(“自动”或某些此类)上解决此问题。

    2) 2)我不太确定会触发第二个触发器的是什么。 听起来无害、但如果您可以使它消失、这可能是好的。 您是否识别"_nop"?

    3)看起来很可疑。 是真的吗? main.c 第313行中的代码是什么?

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

    好的、这澄清了一些问题。 有道理。  

    1) 1)已在 Build Settings > General 下选择"Manage the project 's target-configuration automatically"。  

    2) 2)不能识别_nop。 神秘

    3) 3)是的、这是一个很简单的错误

    这是我们的大故事。 我把它留了一个晚上。 从昨天下午2:21开始。 大约再次运行16小时。 但是、这次我断开了 JTAG。 它仍在强劲运行。 我将继续让它运行。 使用 Android 应用程序、我可以将数据从电路板上拉出以检查运行时间。 那么、如果它复位。 时间也会复位、我大概知道它上次复位的时间、但不知道多少次。 我从板上提取了数据、数据在16小时以上的时间里运行得非常强劲。 是的。  

    我决定拉 JTAG 电缆、因为其中一条线路连接到 RST/NMI 引脚、我想看看会发生什么情况。  

    您对此有何看法? 这是该部分的原理图、如果有用的话。  

    我还想现在应该放弃这个、朝着新的方向发展。 无论如何、我们需要更好的节能效果。 因此、我可能会拉动无限循环并实现 LPM3.5、因此无论如何都会发生复位。 当然、不知道原因是不良的、因此确实需要解决。 不确定从哪里去。  

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

    我想对于“生成设置->常规->编译器”没有“自动”。 我想、只需选择警告提到的编译器版本。 我很确定这并不重要、但警告(当我收到警告时)有点烦人。

    JTAG 线的另一端是什么? 我不使用4线制 JTAG,除非我必须--我无论如何都不知道如何解释边界扫描输出。

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

    断开 JTAG 连接后、软件就在运行、我现在的运行时间是1天17小时23分钟。 看起来不错。  

    在连接到 PC 导致复位的同时、必须发生与 JTAG 连接相关的事情。 如果 PC 整夜休眠、似乎不会导致任何复位、因为我看到它在夜间运行、没有复位、但在 PC 退出休眠后的30分钟内、它将复位。  

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

    嗨、Michael、

    赶上进度、并希望在此处查看进度。  是否还有其他意外复位?   

    我不确定在这种情况下 JTAG 为什么会导致复位。  它可能像额外的电线/电缆在 RST 线路上拾取噪声一样简单、也可能是更复杂的事情。  当 JTAG/调试器运行时、它主动与内核接触、并且可以改变小行为、特别是时序。  我不确定这些东西会如何导致复位、但我想这是可能的。   

    如果仍有问题、请随时在此处回复。   

    谢谢、

    JD

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

    您好 JD、  

    此时、我想我们将在 PC 运行时解决 JTAG 问题。 它已经连续运行了大约6天、没有任何问题、并且 JTAG 被断开。 我每天都连接平板电脑、以获取传感器读数和时间信息、从而验证事情进展顺利。 需要实施更多的冗余、但我认为这是一个好地方。  

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

    感谢您的更新、Michael。  听得不错!