Other Parts Discussed in Thread: EK-TM4C1294XL
Thread 中讨论的其他器件:EK-TM4C1294XL
我已修改 TM4C1294 Launchpad、以便移除 R39、以便测量 Vbat 电流消耗。 如 相关主题所示、数据表显示空闲模式下的电流消耗应约为1.3uA。 当 MCU 通电(JP2已移除)时、如何使用 Fluke 289测量4.41uA 电流。
我无法确定超过3uA 的电流在哪里消失。 我检查了休眠模块寄存器设置、在那里找不到任何东西。
我将使用休眠示例项目作为基础。 当 MCU 断电时、系统正常工作、运行秒数。
以下是代码(对于某些被拒绝访问的内容、我无法通过插入工具插入):
//
//
//此示例演示了不同的休眠唤醒源。 。
//用户将微控制器置于休眠状态并根据唤醒
//超时或用户输入之一。 该示例还演示了 RTC
//跟踪日期和时间的日历函数。
//
//
内部
main (空)
{
uint32_t ui32SysClock、ui32Status、ui32HibernateCount、ui32Len;
//
//从 PLL 以120MHz 运行。
//注意:SYSCTL_CFG_VCO_240是 TivaWare 2.2.x 和中提供的新设置
//之后更好地反映由于 SYSCTL_22而导致的实际 VCO 速度。
//
ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_240)、120000000);
//
//配置器件引脚。
//
PinoutSet (false、false);
//
//启用 UART0
//
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//
//初始化控制台 I/O 的 UART
//
UARTStdioConfig (0、115200、ui32SysClock);
//
//启用休眠模块。
//
SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
//
//在使用这些变量之前初始化它们。
//
ui32Status = 0;
ui32休眠计数= 0;
//
//检查休眠模块是否已激活,这可能意味着
//处理器从休眠状态中唤醒。
//
if (HibernateIsActivate())
{
//
//读取状态位以查看导致唤醒的原因。 清除唤醒
//源、以便器件可以再次进入休眠模式。
//
ui32Status = HibernateIntStatus (0);
HibernateIntClear (ui32状态);
//
//将唤醒信息消息的公共部分存储到缓冲区中。
//将根据状态位附加唤醒源。
//
ui32Len = usnprintf (g_pcWakeBuf、sizeof (g_pcWakeBuf)、
"因以下原因而唤醒:");
//
//唤醒是由于 RTC 匹配所致。
//
if (ui32Status 和 HIBERNATE_INT_RTC_MATH_0)
{
ui32Len = usnprintf (&g_pcWakeBuf[ui32Len]、
sizeof (g_pcWakeBuf)- ui32Len、"%s"、
G_ppcWakeSource[0]);
}
//
//唤醒是由于重置按钮所致。
//
否则、如果(ui32Status 和 HIBERNATE_INT_RESET_WAKE)
{
ui32Len = usnprintf (&g_pcWakeBuf[ui32Len]、
sizeof (g_pcWakeBuf)- ui32Len、"%s"、
G_ppcWakeSource[1]);
}
//
//唤醒是由外部唤醒引脚引起的。
//
否则、如果(ui32Status 和 HIBERNATE_INT_PIN_WAKE)
{
ui32Len = usnprintf (&g_pcWakeBuf[ui32Len]、
sizeof (g_pcWakeBuf)- ui32Len、"%s"、
G_ppcWakeSource[2]);
}
//
//唤醒是由于 GPIO 唤醒。
//
否则、如果(ui32Status 和 HIBERNATE_INT_GPIO_WAKE)
{
ui32Len = usnprintf (&g_pcWakeBuf[ui32Len]、
sizeof (g_pcWakeBuf)- ui32Len、"%s"、
G_ppcWakeSource[3]);
}
//
//如果唤醒是由于任何配置的唤醒源导致的,则读取
//从电池供电内存中的第一个位置,如所示
//休眠计数。
//
if (ui32Status &(HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATH_0 |
HIBERNATE_INT_GPIO_WAKE | HIBERNATE_INT_RESET_WAKE)
{
HibernateDataGet (\ui32 HibernateCount、1);
}
}
//
//配置休眠模块时钟。
//
HibernateEnableExpClk (ui32SysClock);
//
//如果唤醒不是由于上述原因,则是一个系统
//复位。
//
if (!(ui32Status &(HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATH_0 |
HIBERNATE_INT_GPIO_WAKE | HIBERNATE_INT_RESET_WAKE)))
{
//
//配置模块时钟源。
//
HibernateClockConfig (HIBERNATE_OSC_LOWDRIVE);
//
//存储这是一个系统重新启动,而不是从休眠中唤醒。
//
ui32Len = usnprintf (g_pcWakeBuf、sizeof (g_pcWakeBuf)、"%s"、
G_ppcWakeSource[4]);
//
//设置标志以指示我们需要有效日期。 然后将设置日期
//在 while (1)循环中。
//
G_bSetDate = true;
}
UARTprintf ("%s\n"、g_pcWakeBuf);
UARTprintf ("欢迎使用 Tiva C 系列 TM4C1294 LaunchPad!\n");
UARTprintf ("休眠示例\n");
UARTprintf ("键入'help'查看命令列表\n");
UARTprintf (">");
UARTFlushTx (false);
//
//将休眠模块计数器配置为24小时日历模式。
//
休眠计数器模式(HIBERNATE_COUNTER_24HR);
//
//启用 RTC 模式。
//
HibernateRTCEnable();
struct tm Sttime;
HibernateCalendarGet (&S);
if ((((Stime.TM_sec < 0)||(Stime.TM_sec > 59))||
(((Stime.TM_min < 0)||(Stime.TM_min > 59))||
(((Stime.TM_Hour < 0)||(Stime.TM_Hour > 23))||
(((Stime.TM_mday < 1)||(Stime.TM_mday > 31))||
(((Stime.TM_mon < 0)||(Stime.TM_mon > 11))||
(((Stime.TM_year < 100)||(Stime.TM_year > 199)))
{
UARTprintf ("日历错误:\n");
UARTprintf ("sec:%i\n"、Stime.TM_sec);
UARTprintf ("最小值:%i\n"、Stime.TM_min);
UARTprintf ("小时:%i\n"、Stime.TM_hour);
UARTprintf ("mday:%i\n"、Stime.TM_mday);
UARTprintf ("mon:%i\n"、Stime.TM_mon);
UARTprintf ("年:%i\n"、Stime.TM_year);
UARTprintf ("日期设置为1.1.2020 - 00:00:00\n");
Stime.TM_sec = 0;
Stime.TM_min = 0;
Stime.TM_Hour = 0;
Stime.TM_mday = 1;//月中的第1-31天
Stime.TM_min = 0;//自1月起的月数
Stime.TM_year = 120;//自1900年起
}
uint32_t prev_clk_seconds = Stime.TM_sec;
while (1)
{
HibernateCalendarGet (&S);
if (Stime.TM_sec!= prev_clk_seconds)
{
UARTprintf ("%02u.%02u.20%02u "、Stime.TM_mday、Stime.TM_mon、Stime.TM_year - 100);
UARTprintf ("%02u:%02u:%02u\n\n"、Stime.TM_hour、Stime.TM_min、Stime.TM_sec);
Previ_clk_seconds = Stime.TM_sec;
}
}
}
