请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:F28M35H52C 大家好。 这是我的第一篇帖子、请您保持友好。
我修改了 M3看门狗示例代码、使其在本演示中更加紧凑、并使用宏在看门狗计时器之间切换。 请参阅 以下生成的代码:
//取消注释下面四行以使用 WDT0
//#define DOGBASE STATCHDOG0_BASE //#define DOGPERI SYSCTL_PERIPH_WDOG0 //#define DOGWAIT //#define DOGCLOCK (SYSCONGET (SYSTEM_CLOCK_SPEED)) //取消注释以下四行以使用 WDT1
#define DOGBASE GATCHDOG1_BASE #define DOGPERI SYSCTL_PERIPH_WDOG1 #define DOGWAIT while (!WatchdogWriteReady ()); #define DOGCLOCK (SYSTEM_CLOCK_SPEED) void main (void){ SysCtlClockConfigSet (SYSCTL_SYSDIV_1 | SYSCTL_M3SSDIV_2 | SYSCTL_USE_PLL |(SYSCTL_SPLLIMULT_M & 0x0F)); #ifdef _FLASH memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize); FlashInit(); #endif IntRegister (INT_Watchdog、WatchdogTimerHandler); SysCtlPeripheralEnable (DOGPERI); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC); GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_6); GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_6、0); DOGWAIT 看门狗解锁(DOGBASE-); IntEnable (INT_Watchdog); IntMasterEnable(); DOGWAIT WatchdogReloadSet (DOGBASE、DOGCLOCK); DOGWAIT 看门狗 ResetEnable (DOGBASE); DOGWAIT 看门狗使能(DOGBASE-); DOGWAIT 看门狗锁定(DOGBASE-); while (1); } void WatchdogTimerHandler (void){ if (!g_bFeedWatchdog) return; DOGWAIT WatchdogIntClear (DOGBASE); GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_6、(GPIOPinRead (GPIO_PORTC_BASE、GPIO_PIN_6)^ GPIO_PIN_6)); G_InterruptCount++; }
要在 WDT0和 WDT1之间切换、请在该代码段开头注释掉相应的四行。 当选择 WDT0时、此代码的运行方式与 TI 示例代码一样。 没问题。 选择 WDT1后、代码挂起、等待 WDTCTL 寄存器中的写入完成位(WRC)在看门狗 ReloadSet (DOGBASE、DOGCLOCK)之后立即调用。 在调试器中、我可以看到 WRC 位确实卡在零。 我还看到 WDTVALUE 正在递减计数、我还看到对 WDTLOAD 寄存器(SYSTEM_CLOCK_SPEED)的写入没有进行、并且 WDTLOAD 值保持为0xFFFFFFFF。
如果能深入了解我所犯的错误、我们将不胜感激。
谢谢