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.

[参考译文] 编译器/MSP430F5335:MSP430F5335 WDT 不会复位微控制器

Guru**** 2532560 points
Other Parts Discussed in Thread: MSP430F5335

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/672317/compiler-msp430f5335-msp430f5335-wdt-does-not-reset-the-micro

器件型号:MSP430F5335

工具/软件:TI C/C++编译器

由于某些初始化错误、无法重置微控制器。  在 autoinit.h 函数中调试函数时、系统会运行到 breakpoint_2 (请参阅下文)、我按"run"、但系统永远不会返回到 BREAKPINT_1、但它在控制台中显示错误

控制台

断言失败、(!(((*(volatile uint16_t *)(uint16_t) baseAddress +(0x0000)))和(0x0002)))、文件./driverlib/adc12_a.c、第1行 

上面引用的代码。  我该怎么做?


/********* //*
cinit */
********* /

static __inline __attribute__(always_inline) void run_cinit (void)
{
#if defined (__TI_EABI _)&&
已定义(__MSP430__)&&
已定义(__large_code_model__)&&!已定义(__large_data_model__)
/*--------------- //
//*处理压缩的 ELF cinit 表。 格式如下: */
*|4字节加载 addr|4字节运行 addr| */
*|4字节加载 addr|4字节运行 addr| */
* */
/*处理步骤: */
/* 1. 读取加载和运行地址。 */
/* 2. 在加载地址读取一个字节、例如 idx。 */
/* 3. 获取到 handler_start[idx]处处理程序的指针 */
/* 4. 调用处理程序(load_addr + 1、run_addr) */
//*----------------------------------------------------------------------------------------------------- //
if (__TI_Handler_Table_Base!=_TI_Handler_Table_Limit)
{
unsigned long const * table_ptr =(unsigned long const *)_TI_CINIT_Base;
unsigned long const * table_limit =(unsigned long const *)_TI_CINIT_limit;

while (table_ptr!= table_limit)
{
unsigned long load_addr =*表_ptr++;
unsigned long run_addr =*表_ptr++;
unsigned char handler_idx =__data20_read_char (load_addr++);

handler_fn_t handler =__TI_Handler_Table_BAS[handler_idx];
handler (load_addr、run_addr);
}
}
#elif defined (__TI_EABI i__)|| defined (__ARM_EABI __)
/*--------------- //
//*处理压缩的 ELF cinit 表。 格式如下: */
*|4字节加载 addr|4字节运行 addr| */
*|4字节加载 addr|4字节运行 addr| */
* */
/*处理步骤: */
/* 1. 读取加载和运行地址。 */
/* 2. 在加载地址读取一个字节、例如 idx。 */
/* 3. 获取到 handler_start[idx]处处理程序的指针 */
/* 4. 调用处理程序(load_addr + 1、run_addr) */
//*----------------------------------------------------------------------------------------------------- */
#if defined (__Frozen __)
/*----------------- //
//*对于 C7X,使用_symval ()对这些符号强制进行绝对寻址,*/
//*否则,如果我们依赖,我们最终将得到一个不正确的值 //
//*独立于位置的 PC 相对寻址。 这是临时的 */
*权变措施。 有关详细信息,请参见 Jira compile-362。 */
//*----------------------------------------------------------------------------------------------------- //
if (_symval (__TI_Handler_Table_Base)!=_symval (_TI_Handler_Table_Limit))
{
char * const * table_ptr =(char * const *)_symval (__TI_CINIT_Base);
char * const * table_limit =(char * const *)_symval (__TI_CINIT_limit);
#else
if (__TI_Handler_Table_Base!=__TI_Handler_Table_Limit)
{
char * const * table_ptr =__TI_CINIT_Base;
char * const * table_limit =__TI_CINIT_limit;
#endif

while (table_ptr!= table_limit)//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<) 断点_1
{
char const * load_addr =* table_ptr++;
特性 *run_addr =*table_ptr++;
特性 handler_idx =* load_addr++;

handler_fn_t handler =__TI_Handler_Table_BAS[handler_idx];
处理程序(load_addr、run_addr);//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 断点_2
}
}
#else
/*------------------ COFF
的*//*进程 Cinit 表。 */
//*----------------------------------------------------------------------------------------------------- *

#ifdef _TMS320C6x
#define align_type uintptr_t
#define ALIGN ALIGN 0x7
#Elif defined (_MSP430__)
#ifdef __large_data_model__
#define align_type unsigned long
其他
#define align_type unsigned
#endif
#define ALIGN ALIGN 0x1
其他
#define align_type uintptr_t
#define ALIGING_MASK 0x3
#endif

#define align_ptr (ptr)\
((unsigned const *)(((align_type) ptr + align_mask)&~align_mask))

unsigned const * recptr =(unsigned const *)_cinit__;
int length;

if (recptr!=(unsigned *)-1)
while ((length =* recptr++)!= 0)
{
#if defined (__MSP430__)&& defined (__large_data_model__)
char *至=(void *)*(unsigned long const *) recptr;
recptr += 2;
#else
char *至=(void *)*recptr++;
#endif

char * from =(void *) ptr

;rcpy、from

=(r.py、rength;(rect from)、r.py、rength;(rect from)、r.py、rength;
recptr = align_ptr (来自);
}
#endif
}

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

    器件型号:MSP430F5335

    在我的 MSP430上、在大多数情况下、当我执行以下代码时:

    WDTCTL = WDT_ARST_1000;
    while (1); 

    微重置、但有时微重置不会重置、而是进入此处所述的循环( )。  为什么它不会每次复位?  实际上、在同一情况下、如果上述代码被替换为:

    PMMCTL0 = PMMSBOR | PMMPW; 

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

    默认情况下、器件启动时应使 WDT 启用32ms 超时、而长的 CINIT 实际上会导致器件在启动代码之前复位。 对于这些情况、我们通常建议在较长的 CINIT 期间关闭 WDT。 是否在该环路之前关闭 WDT? 在运行目标无法检查 WDT 寄存器时、您能否连接到它?

    这种情况是形式上的冷启动还是某种 PUC?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哇、如果 ADC12正在工作、WDT 复位或 PMMCTL0 |= PMMSWBOR 不工作。 因此、我将 WDT 变为计时器、并在 ISR 中执行 ADC12CTL0 = 0;复位正常。 这是一个已知问题吗? 使系统在所有条件下都无法复位是很糟糕的。 如果系统启动、则应能够重置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jace、我按下了一个错误的按钮、您的表扬实际上没有解决我的问题。 因此、只有当 ADC 工作且 WDT 超时或任何 PUC (如 PMMCTL0|= PMMSWBOR)时、才会出现此问题。

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

    您是否能够使用简化的代码重现此问题? 就像使用 ADC 示例并尝试复位一样? 您对该误差有哪些 ADC 设置?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不、我没有尝试构建简化的代码、但我能够使用代码重现错误。  无论如何、WDT 软重启不应取决于我的代码、如果系统在一种情况下可以软重启、它每次都应以相同的方式工作、否则 WDT 的重点是什么?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、当我设置`ADC12CTL0 = ADC12SHT02 + ADC12SHT12 + ADC12ON 时;`重启不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    银色、

    我尝试查看是否出现简化代码的原因是两个方面;
    1) 1)在您的情况下、打开 ADC 是否确实是防止 WDT 的"触发器"?
    2) 2)您似乎正在执行自己的 CINT 文件、该文件可能与编译器自己执行的操作不同。 WDT 计时器可能会意外关闭。

    连接调试器时是否发生此错误? 还是独立运行还是自由运行模式? 有时、由于 EEM 模块引入的时序差异、连接调试器可能会导致或屏蔽问题。 (这是一个侵入式调试。) 如果您在独立运行或自由运行时看到这种情况、我建议连接到运行目标以使用 EEM 暂停 MCU、并检查 WDT 寄存器的状态以确保它们设置正确。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jace、

    我理解您的说法、但我不做我自己的 CINIT 文件、调试器会引导我浏览 TI CINIT 文件。  设置 ADC12CTRL0 = 0;使我的复位可预测、否则系统会卡住。  除了 ADC12CTRL0的值、一切都是一样的、为什么?  这毫无意义。  我没有时间编写最小代码来隔离问题。  为什么 CCS8在 ADC driverlib 中指向置位?

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

    出现问题时、您是否能够连接到正在运行的目标并检查 WDT 的寄存器设置? 除非我们能够缩小问题的范围、否则我没有任何答案。

    根据您之前的评论、您似乎正在使用 driverlib。 是这样吗? 如果是、您是否使用了在调用时可能会复位 WDT 的任何函数?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Silver、

    您是否能够执行"附加到运行目标"测试?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jace、

    在软复位装置之前、我确实验证了 WDT 是否设置正确。 此时、在我的复位例程中、我只需禁用 ADC12A、我再也没有看到这个问题。 另一方面、Assert 是如何工作的、CCS8在哪里获取信息以在控制台中显示以下内容:

    断言失败、(!(((*(volatile uint16_t *)(uint16_t) baseAddress +(0x0000)))和(0x0002)))、文件./driverlib/adc12_a.c、第1行

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

    CCS 将从 DriverLib 获取该断言信息。 有关断言的更多信息、您必须检查 Driverlib 详细信息。 这可能是问题原因的一部分。

    请参阅有关 DriverLib 断言的另一个 E2E 主题。 我认为您是本次讨论的一部分。 e2e.ti.com/.../309119