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.

[参考译文] MSP432P401R:为什么控制器在操作过程中重置?

Guru**** 2609955 points
Other Parts Discussed in Thread: ADS131A04

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/655296/msp432p401r-why-does-the-contoller-resets-during-operation

部件号:MSP432P401R
主题中讨论的其他部件:ADS131A04

您好! 我正在将MSP432与ADS131A04 ADC配合使用以读取某些传感器。 到目前为止,我能够读取1000个样本,将它们保存在MCU存储器中,并在CCS 7中绘制它们。

现在我的代码不起作用。 我运行该程序9到10次,当它读取100多个样本时,CPU重置。 有时它可以正常读取,但大多数时候它会重置。 有时,程序在Default_Handler()中挂起,但大多数时候我可以在Reset_Handler()中捕获它。

我在Reset_Handler()中放置了一个断点,并看到了RSTCTL寄存器值。 硬重置源0,14,15为"1",软重置源0为"1"(CPU锁定,这意味着什么? 此外,COREDEBUG - DHCPR - S_LOCUP为“0”,表示没有锁定?)。

该程序使用SPI与ADC和DRDY的GPIO中断进行通信。 我尝试了剥离其他代码的程序,只留下与ADC通信和读取示例所需的内容。

是否有人知道导致此问题的原因? 我真的不知道如何继续调查。

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

    我有几个问题要问

    1.您使用的是Launchpad还是自定义主板?
    2.您使用的是TI驱动程序还是DriverLib API
    3.既然你要去DefaultHandler,我怀疑总线有故障。 您能否检查Cortex M4专用外设地址空间中的故障状态寄存器,以查看它是哪种类型的总线故障条件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    1.定制板。
    2. DriverLib API。
    3.如果它在Reset_Handler()中停止,则CFSR为0。 如果它在Default_Handler()中停止,则设置BFARVALID和PRECISERR,有时只设置IBUSERR,有时只设置IMPRECISERR。

    有时,它可以正常工作。 它有时起作用,但大多数时候不起作用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Cristian:

    我认为有两个问题(因为我没有主板和软件)

    1.正在进行重置。 您能否在问题发生之前清除代码中的重置寄存器位,以便我们可以隔离调用重置处理程序的原因
    2.调用默认处理程序时,问题很可能是由SRAM堆栈损坏引起的。 您是否检查是否为应用程序提供了足够的堆栈和堆栈。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Amit:

    1.当它在Reset_Handler()中停止时,我无法重现这种情况。 我尝试过很多次,但没有发生,我不知道为什么,所以我没有清除代码中的任何位。 至少这是一个需要考虑的问题。

    2.我尝试增加堆栈和堆大小(分别高达16k和8k),但它的行为相同(有时工作,有时在Default_Handler()中挂起)。 内存分配视图看起来很好,堆栈使用情况视图主要显示绿色区域,但_c_int00 - main - ADC采样功能除外,该功能在弹出窗口中显示"136 of 136 bytes used"(已使用136个字节)。 但是,我不知道如何解释这些消息或显示的值。

    您对如何进一步调查这一问题有什么想法吗?

    谢谢!

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

    您是否可以向我发送您的软件的简化版本,以便我可以在自己的身边试用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然。 我已将该项目包含在此消息中。 我建议连续运行该程序至少10次,以便在默认处理程序中捕获它(有时它工作,有时不工作)。

    我希望我们能弄清楚这一点。

    e2e.ti.com/.../8015.test.zip

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

    我进行了将近20次测试,测试始终处于WFI状态。 在连接调试器的情况下加载程序后,我使用SDK 1.60 执行了以下步骤

    1.已重置CPU。
    2.运行代码4秒
    3.已停止CPU并检查程序执行情况。 ==>它始终在WFI中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Cristian:

    值得一提的是,我没有ADS131A04,因此从系统角度来看,所有的线路都有效地浮动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否在默认处理程序和重置处理程序中放置了断点? 在我的情况下,经过几次尝试后,它在缺省处理程序中挂起。 如果它很重要,我使用的是SDK 1.50 .00.12 ,因为1.60 尚未发布。

    我想您已经评论了期望ADC响应的行,因为您没有它。 我在MSP432 Launchpad上试用过,我确认程序不会挂起或重新启动。 但是,在我的主板上运行时,评论代码有时会挂起,表明主板存在硬件问题。 如果问题与硬件有关,我们如何才能找到导致问题的原因?

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

    我会尝试使用断点。 我也没有对代码进行任何更改。

    我检查了TI.com,1.60 已发布。

    www.ti.com/.../SIMPLELINK-MSP432-SDK

    我将告知Web支持团队SDK登录页面未显示正确版本的SDK。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Amit:

    我已经使用新的SDK进行了测试,但不幸的是,这种行为是相同的。

    该问题是否与我的硬件(我的主板)有关? 是什么原因造成的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Cristian

    ADS131A04是否由与MSP432P401R相同的电源供电? 您是否可以尝试将两个设备的电源分开?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Amit:

    是的,它由与MCU相同的电源供电。 但是,我确实通过从实验室电源为ADC供电来完全分离电源。 但结果是相同的:有时它在默认处理程序中挂起。

    您是否有其他想法来找出问题的原因?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Cristian:

    如果您有自定义版块,我认为除了浏览原理图和布局之外,我没有其他想法。 另一件可能有助于运行写入和读取模式的SRAM测试,以查看是否存在导致位翻转的电源不稳定。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Amit:

    您是否有代码示例用于将模式写入/读取到SRAM或从SRAM读取模式? 正如我所看到的那样,由于变量存储在SRAM中,我已经通过运行我在这里发布的程序来实现这一目标了。 或者我是否应该每次都写入相同的预定义值并查找内容(什么)?

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

    您可以使用函数rand()来生成值。 rand提供的功能之一是播种的能力。 另一种方法是在备用位置执行0x5555.5555万和0xAAAAAAAA模式。 这是自定义板吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

     我正在调试新的定制MSP42P401R,并重复使用以前(旧)定制432板上使用的代码。

     我刚刚看到Default_Handler的神秘引导程序,通过谷歌搜索我的问题,我找到了这篇文章。

     我将在Entry语句中添加一个断点,并让您知道我看到了什么...

    Bob s

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

    是的,它是一个定制板。 我会采纳你的建议,但我应该寻找什么? 如果它在默认处理程序中挂起?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议,我可能要做的是为每个可能的中断编写一个处理程序。
    然后我至少会知道哪种中断行为不正常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为,至少在我的情况下,我是在读取ROM数据结构超过其末尾(坏循环终止测试),并且可能会访问非法的内存读取地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    就是这样,解决我的问题。 ROM数据结构中的索引器不正确。
    我想这也是你的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想我找到了问题的原因,但我不能解释。

    首先,我遵循了您的建议,并测试了使用以下代码写入SRAM的过程:

    对于(i = 0;i < noSamples;I++)
    {
    如果(I % 2 = 0)
    {
    ch1d[i]= 0xAAAAAAAAAA;
    ch2d[i]= 0xAAAAAAAAAA;
    ch3d[i]= 0xAAAAAAAAAA;
    ch4d[i]= 0xAAAAAAAAAAAA;
    }
    否则
    {
    ch1d[i]= 0x5555.5555万;
    ch2d[i]= 0x5555.5555万;
    ch3d[i]= 0x5555.5555万;
    ch4d[i]= 0x5555.5555万;
    }
    } 

    它成功地运作。 但是,当使用我的代码时,它有时会在Default_Handler()中挂起:

    对于(i = 0;i < noSamples;I++)
    {
    如果(I % 2 = 0)
    {
    ch1d[i]= ADS131A04_LSB*Int24BitTwoCommpleToSignedInt(0xAAAAAAAAAA);
    ch2d[i]= ADS131A04_LSB*Int24BitTwoCommpleToSignedInt(0xAAAAAAAAAA);
    ch3d[i]= ADS131A04_LSB*Int24BitTwoCommpleToSignedInt(0xAAAAAAAAAA);
    ch4d[i]= ADS131A04_LSB*Int24BitTwoCommpleToSignedInt(0xAAAAAAAAAaa);}
    
    否则
    {
    ch1d[i]= ADS131A04_LSB*Int24BitTwoCommpleToSignedInt(0x55.5555万55555);5.5555万;
    ch2d[i]= ADS131A04_LSB*Int24BitTwoCommpleToSignedInt(0x55.5555万55555);5.5555万;
    ch3d[i]= ADS131A04_LSB*Int24BitTwoCommpleToSignedInt(0x55.5555万55555);5.5555万;
    ch4d[i]= ADS131A04_LSB*Int24BitTwoCommpleToSignedInt(0x5.55555555亿);}
    
    }//
    
    24位2对带符号int
    Int24BitTwoCommpleToSignedInt(unsigned int val)
    {的补码
    返回(0x80万和val? (Int)(0x7FFFFFFF & val)- 0x80万 : val);
    } 

    #define ADS131A04_LSB 0.0万298023223876953125</xmt-block>29.8023万                          //22.3876万 //[V]95.3125万[V]


    导致此行为的代码有什么问题? 你能给我建议吗? 您可以检查我之前上传的测试项目。

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

    ch1d变量是否为UINT32_t? 我认为,当您将浮点和整数相乘而不执行正确的拼写时,就会出现问题,并且某个地方会导致堆栈损坏。

    例如,我使用以下方法执行类似操作

    alterstedfloatInput[loopCount*4]=(float32_t)(((副官SampleBuffer[loopCount]& 0xff))/(float32_t)(6553.6f);

    其中,副官floatInput是float32_t

    其次,如果您可以使用0x00AA.AAAA和0055.5555 ,而不是使用0xAAAAAAAA和5555.5555 ,则会导致相同的问题。

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

    ch1d是浮点。noSamples是1000。 尝试0x00AA.AAAA和0055.5555 时出现相同问题。 我尝试过:

    ch1d[i]=(float) ADS131A04_LSB*(float) Int24BitTwoCommempleToSignedInt (readDataCh1[i]); 

    但同样如此。

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

    在我运行您在上一篇文章中发送的代码之前,如果我在一段时间内仅运行上述代码(1),它应该会失败吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,我认为是这样。 我也会测试它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在While循环中测试了这条线。 这是整个main():

    #define noSamples 1000
    float ch1d[noSamples];
    
    int main (void)
    {
    //为浮点计算启用了堆栈的FPU
    MAP_FPU_enableModule();
    MAP_FPU_enableLazyStacking();
    
    Clock_System_init();
    
    //map_interrupt_enableMaster();//启用主中断;无论是否启用,它都将挂起
    同时(1)
    {
    ch1d[0]=(FLOW)ADS131A04_LSB*(FLOW)Int24BitTwoCommpleToSignedInt(0x00AAAAAA); 
    //Timer32_sleep_cycles(48万);// 1000 us @ MCLK =48 MHz } }

    我确认它在Default_Handler()中挂起。 但是,我发现了一些非常有趣的事情:如果我在While循环中使用Timer32睡眠功能,每次迭代1毫秒睡眠时间都正常工作,但如果我使用例如每次迭代100秒睡眠时间,它会在Default_Handler()中挂起。

    问题可能是它写入SRAM (ch1d)的速度太快?

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

    我尝试了代码,似乎在LaunchPad上对我有效。 我必须做的一件事是屏蔽Clock_System_init(),因为我没有函数原型。 我注意到的另一个不同之处是,我的代码有以下附加行

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

    您好,

    这是Clock_System_init():

    void Clock_System_init(void)
    {//
    	停止看门狗
    	map_WDT_a_HoldTimer();
    	map_Interrupt_DisableMaster();
    
    	//设置外部时钟频率
    	map_CS_setExternalClockSourceFrequency(3.2768万, 4800万);
    	map_PCM_setCoreVoltageLevel(PCM_VCORE1);/GPIO_21;
    
    	
    	
    	GPIO _primary_module_function);// HFXT
    
    	//MAP_FlashCTL_setWaitState (FLASH_BANK0,1);
    	//MAP_FlashCTL_setWaitState (FLASH_Bank1,1);
    
    	MAP_Flashctl_setWaitState(flash_BANK0, 2);//用于48 MHz
    	MAP_Flashctl_setWaitState(FLASH_Bank1, 2);//用于48 MHz
    
    	//在非旁路模式下启动LFXT,无超时map_CS_startTCXT(flash_MCCS_CLCS_CLCS_SMK, SC_CLCS_CLCS_SMK, CK_CLCS_CLCS_SMK,
    	
    	
    	CK_CLCS_HCMK, SC_HCC_ST_ST_MCK, SC_ST_LK_LCMK, SC_ST_LK_LCMK,
    
    	
    	
    	CS_CLock_diverer_1);//与SMCLK
    	MAP_CS_INITClockSignal (CS_SMCLK,CS_HFXTCLK_SELECT,CS_CLock_2)共享时钟源;//最大HSMCLK / 2;与HSMCLK MAP_CS_FXCLOCK MAP_CS_FXC128kHz
    	信号;CS_CL1最大
    	时钟分频
    器/ CS_TC1;CS_CLK最大时钟信号 

    我已经在MSP432 Launchpad上测试了代码,我确认它工作正常。 所以问题出在我的主板上。

    我按照建议测试了每个中断,以查看导致问题的原因。 因此,我为所有中断编写了处理程序(内部有一个while循环),并逐一对它们进行了测试。 我发现它在以下位置挂起:

    HardFault_Handler()(始终)

    MemManage_Handler()(有时)

    WDT_A_IRQHandler()(有时)-尽管在程序开始时WDT处于暂停状态

    EUSCIA3_IRQHandler()(有时)-尽管没有连接到EUSCIA3

    EUSCIB3_IRQHandler()(有时)-尽管没有连接到EUSCIB3

    T32_INT2_IRQHandler()(有时)-为什么选择INT2?

    PORT3_IRQHandler()(有时)-?

    我不得不多次运行该程序,以使它在我标记为“有时”的中断中挂起。 它可能会在我错过的其他中断中挂起,因为我没有足够的时间运行程序。

    您对如何进一步调查问题有任何想法吗?

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

    由于该问题很可能与您的自定义主板有关,您需要检查主板的示意图和布局。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我被卡住了,因为原理图看起来很好,我不知道如何从这些中断中了解问题的原因。

    很奇怪,直到几周前才发现问题,我还没有对董事会做任何更改。

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

    我被卡住了,因为原理图看起来很好,我不了解中断的原因。

    很奇怪,该计划直到几周前才开始工作,我还没有对董事会进行任何更改。

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

    我怀疑发生了复位或总线故障。 总线故障的原因似乎是SRAM损坏可能是由于设备的电流不足。 为什么现在而不是更早地发生,这取决于ypur代码正在行使什么条件。