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.

[参考译文] TM4C1294NCPDT:VBAT 流耗过高

Guru**** 2625255 points

Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1181433/tm4c1294ncpdt-vbat-current-consumption-is-too-high

器件型号:TM4C1294NCPDT
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;


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

    您好!

     您如何修改原理图? 移除 JP2后、MCU 没有电源。 您是否有为 VBAT 供电的电池?

     LaunchPad 在 VBAT 上似乎有一个电容器。 但是、在阅读数据表时、有人提到它可能会降低测量的精度。  

    '向 VBAT 电源添加外部电容会降低低电池电量测量的精度
    并应尽可能避免。 本节引用的图仅显示连接
    而不是整个系统。"

     您是否有其他未修改的 LaunchPad? 运行休眠代码后、您能否测量 JP2上的电流? 您会测量什么?

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

    我刚刚移除了电阻器、现在我将通过电流表从3.3V 电压源为 Vbat 提供电流。 我还注意到 Vbat 引脚中的电容器、但我不担心 VBAT 电压测量精度。 有趣的是、它还在数据表中提到、由于上升时间或其他原因、电池和 Vbat 之间需要 RC 电路。

    我从原理图中看到、整个 MCU 通过 JP2供电、当我仿真断电状态时、我删除了这一点。 然后、Vbat 通过 Fluke 提供、测量值为4.42uA。 我非常信任该测量、因为它是高端万用表。 当 JP2关闭时、Fluke 的读数应为0.00 uA。

    基本上、当 Tiva 被断电时、我只希望 RTC 工作。 我将在这里使用容量约为210mAh 的 CR2032电池。 这种仅持续五年的4.4uA 消耗。 如果功耗更像数据表中所示、电池的使用寿命很容易是数据表的两倍。

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

    您好!

     我不知道是什么导致了额外的3uA。 您是否有其他 LaunchPad 或您可以尝试的定制板? 您是否获得了相同的结果?

      C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\hibern\hibernate.c 中还有另一个休眠示例 如果您运行此示例、您是否也获得了4.4uA 的电流?