当 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);
}