工具/软件:Code Composer Studio
您好!
我已修改了一些代码以增强产品功能。 部分修改是将 WDT (处于计数器模式)从一个定时周期内被调用(以唤醒处理器)更改为连续运行并使用一个计数器来唤醒处理器。 更改的原因是允许将2ms 时间计数用于计时目的。
但是、在代码的主要部分、我调用一个函数从外部 RTC 读取(紫色下方、未返回错误)。 没有 I2C 总线错误、子函数中的数据返回正确的值。 但是、在调用函数中、数据结构(rtcInput.DateTimeYear)中的一个变量现在为0而不是20 -数据结构中很少有其他元素被破坏。 这是一个不规则的偶然错误、假设在 ISR 在此期间执行操作时发生。
如果我停止 ISR (或者在调用之前禁用 ISR、之后重新启用 ISR)、则没有错误。
我无法理解 WDT ISR 为何会破坏数据。
谢谢
Mike
bool RTC_GetDateTime (DateTimer_MS * dataTimePtr) { bool retval = STATUS_SUCCESS; volatile DateTime_MS rtcInput ={0}; //读取日期和时间寄存器 if (!USCI_B1_I2C_READ (RTC_SLAVE_ADD、RTC_seconds、sizeof (DateTimer_t)、(uint8_t*)&rtcInput)) retval = STATUS_FAIL; //此行允许断点捕获偶尔出现的日期错误,直到原因得到解决。 if (rtcInput.DateTime.Year =0) rtcInput.DateTime.Year = 0; //其他代码后跟… //********* //这是导致损坏的 ISR ... #pragma vector=WDT_Vector _INTERRUPT void WDT_A_ISR (void) { 如果(!- timeoutWDT) { if (!contRunning) WDT_Stop (); LPM3_EXIT; } mSeconds += WDT_INTERVE_MS; 如果(mSeconds >999) mSeconds = 999; if (控制运行) { loopTime += WDT_INTERVE_MS; if (loopTime > MAIN_LOOP_TIME) { LPM3_EXIT; loopTime = 0; } }