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.

[参考译文] MSP432 HFXT 故障触发硬故障

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/587159/msp432-hfxt-fail-trigger-hard-fault

当 HF 外部48Mhz 晶振短接,HF 故障 IFG 将被置位,所以我所做的是清除 CS ISR 中的 HFXTIFG 并等待 HFXT 再次振荡。

但有时(外部48MHz 晶振频率短接),它 会导致 HardFault,,当使用与所连接的代码一样的代码时,LED 指示灯将停止闪烁。

为什么会发生这种情况? 我可以做些什么来避免这种现象?

1) 我进行此实验的原因是、有时 ESD 会导致晶体停止振荡、因此我们需要通过软件手动恢复晶体。

2)我使用的硼是 MSP432 launchpad (红色)

3)我的代码如下 所示:

/* DriverLib 包括*/
#include "driverlib.h"

/*标准包括*/
#include
#include
void CS_IRQHandler (void);

/*应用程序定义*/
#define TIMER_PERIOD 50000

/* Timer_A 上行模式配置参数*/
CONST Timer_A_UpModeConfig upConfig =

Timer_A_CLOCKSOURCE_SMCLK、// SMCLK 时钟源
Timer_A_CLOCKSOURCE_DEVIDER_48、//
Timer_period、// 50000 tick period
Timer_A_TAIE_INTERRUPT_DISABLE、//禁用计时器中断
Timer_A_CCIE_CCR0_INTERRUPT_ENABLE,//启用 CCR0中断
Timer_A_DO 清除//清除值
};

int main (空)

volatile unsigned int i = 0;
/*停止 WDT */
MAP_WDT_A_HOLDTimer();

/*为外设/晶体使用配置引脚、为输出配置 LED */
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、
GPIO_PIN0 | GPIO_PIN1、GPIO_PRIMARY_MODULE_FUNCTION);
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、
GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION);

MAP_CS_disableFaultCounter (CS_HFXT_FAULT_COUNTER);
MAP_CS_disableFaultCounter (CS_LFXT_FAULT_COUNTER);
MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);

/*以防用户想要使用 getACLK、getMCLK 等函数、
*让我们在代码中设置时钟频率。
*
cs_setExternalClockSourceFrequency (32000、48000000);

/*在非旁路模式下启动 HFXT 而不超时。 开始之前
*我们必须将 VCORE 更改为1以支持48MHz 频率*/
MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
MAP_FlashCtl_setWaitState (FLASH_BANK0、2);
MAP_FlashCtl_setWaitState (FLASH_BANK1、2);
CS_startHFXT (false);

MAP_CS_initClockSignal (CS_ACLK、CS_LFXTCLK_SELECT、CS_CLOCK_DEVIDER_1);
MAP_CS_initClockSignal (CS_BCLK、CS_LFXTCLK_SELECT、CS_CLOCK 分频器_1);

MAP_CS_initClockSignal (CS_MCLK、CS_HFXTCLK_SELECT、CS_CLOCK_DEVIDER_1);
MAP_CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_SELECT、CS_CLOCK_DEVIDER_1);
MAP_SYSCTL_DisableNMISSource (SYSCTL_CS_SRC);
MAP_CS_registerInterrupt (&CS_IRQHandler);

/*将 Timer_A1配置为向上计数模式*/
MAP_Timer_A_configureUpMode (timer_A1_base、&upConfig);

/*启用中断并启动计时器*/
MAP_Interrupt_enableInterrupt (INT_TA1_0);
MAP_Timer_A_startCounter (timer_A1_base、timer_A_up_mode);


MAP_Interrupt_setPriorityGrouping (0x02);
MAP_Interrupt_setPriority (CS_HFXT_FAULT、0x00);



/*启用主中断*/
MAP_Interrupt_enableMaster();

MAP_Interrupt_disableInterrupt (FAULT_hard);
MAP_CS_enableInterrupt (CS_HFXT_FAULT | CS_LFXT_FAULT);
while (1)

__no_operation();


空 CS_IRQHandler (空)

volatile uint32_t i;

CS->KEY = CS_KEY_VAL;//解锁 CS 模块以进行寄存器访问

//循环直到 XT1、XT2和 DCO 故障标志被清除
操作

//清除 XT2、XT1、DCO 故障标志
CS->CLRIFG |= CS_CLRIFG_CLR_DCOR_OPNIFG | CS_CLRIFG_CLR_HFXTIFG |
CS_CLRIFG_CLR_LFXTIFG | CS_CLRIFG_CLR_FCNTLFIFG;

SYSCTL->NMI_CTLSTAT &=~ SYSCTL_NMI_CTLSTAT_CS_SRC;

//等待40、000个 CPU 周期
for (i=0;i<40000;i++);

} while (((SYSCTL->NMI_CTLSTAT | SYSCTL_NMI_CTLSTAT_CS_FLG)
&&(((CS->IFG 和 CS_IFG_LFXTIFG)||(CS->IFG 和 CS_IFG_HFXTIFG));//测试振荡器故障标志
CS->KEY = 0;//锁定 CS 模块,防止意外访问

void TA1_0_IRQHandler (void)

静态无符号字符计数;
count++;
if (计数>= 10)

计数= 0;
MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);


MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A1_BASE、
Timer_A_CAPTURECOMPARE 寄存器_0);

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

    我将需要时间对此进行研究、并会尽快为您做出响应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    如何将 ESD 事件隔离到仅晶体? 您是否有办法确保 MSP432承受的应力不会超过您测试时器件的额定值? 此外、您还可以使用 ISR 来捕获硬故障事件并检查硬故障复位寄存器。

    此致、
    Chris