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.
您好! 所以我正在测试低功耗模式,看看我是否可以让我的主板在某些时间消耗更少的电流,但是我得到的电流比我将芯片置于空闲模式(空闲,待机或停止)时预期的高得多。 现在,我的代码启动,将PLL设置为将时钟分别乘以3和1 (因此系统时钟为30MHz),检查我是否正在启动加载固件(大约需要5秒钟),然后进入空闲模式。 下面是我在不同模式下看到的当前绘制:
空闲模式:38 mA
待机模式:37.5mA
HALT模式:34.4 mA
从数据表中,我期望看到的最高电流是22mA,我确定我只是没有正确设置,但我不确定是什么。 我甚至尝试加载HaltWake的示例代码,我的电流仍在35mA左右。
请注意,我在主板上只安装了F2.8069万,以及启动模式上拉电阻器,在3.3V和1.8V VDD引脚上安装了几个滤波器盖,因此主板上没有其他任何东西可以消耗额外的电流。 如果有人对我可能做错的事情有任何想法,请告诉我。 谢谢!!
Gregory
您的设备似乎未处于低功耗模式。 如果您运行了controlSUITE示例,但仍然看不到预期的数字,则可能是您的主板上存在正在绘制电流的内容。 一些想法:
Hareesh,
1)我没有拆除F2.8069万,而是安装了一个具有相同组件的新板,除了F2.8069万 (一些电阻器和盖更容易安装,拆除和安装一个100引脚芯片:-)),并测量了电流消耗,结果是零。
2)我实际上是使用台式电源来获取当前读数。电源的分辨率高达小数点后4位(SO .0000A)。 我也用万用表试过它,并且得到了与工作台电源类似的电流读数。
3)在这块主板上,我使用的是内部时钟,因为主板上除了处理器,一些电阻器和盖子外没有安装任何东西。
4)如果我通过调试器运行示例代码,然后再次尝试调试,我会得到以下"错误"
连接到目标时出错:
(错误-1155 @ 0x0)
设备可能在低功耗模式下运行。 调试器已强制唤醒设备。 选择'确定'以尝试完成调试连接。
(仿真软件包6.0 .407.6)
这听起来像是处于低功耗模式。 我可以按"好",它会正常加载固件。
如果我按照建议逐步执行代码,主板将向上拉约145毫安,直到我逐步执行空闲指令,然后它将降至35毫安。 这与我刚运行代码而不是停止代码时看到的电流是一致的。 进入IDLE指令后,我立即收到以下错误:
不能单步目标程序:
(错误-1156 @ 0x85A5)
设备可能在低功耗模式下运行。 是否要使其退出此模式? 选择'是'强制设备唤醒,然后重试此操作。 选择'No'(否)在不唤醒设备的情况下重试此操作。
(仿真软件包6.0 .407.6)
如果我选择"否",将弹出相同的错误,如果我说"是",则板电流将返回到大约142mA。
话虽如此,运行代码时也会看到类似的结果。主板在前5秒(通过串行端口加载固件时)消耗90mA,然后在HALT模式下降至34mA左右。 我可以停止该代码并逐步浏览它,电流也会下降。 在我的最后一个板上,将有一个外部振荡器进入XCLKIN (GPIO 19),我认为这是正确的停止点。
如果您看到我可以尝试的其他内容,请告诉我。 如果可以,我可以尝试使用controlSTICK (带有USB连接器的F2.8069万开发板)进行测试。 我应该能够从外部连接3.3V电源,这样我就可以测量并仍然能够进行编程,但我想将其保存为最后的解决办法,因为我的主板几乎没有安装任何组件,应该能够做同样的事情。 只是为了给自己省些工作。
谢谢!
我感觉闪存没有关机。 关闭闪存模块电源并执行空闲指令的功能必须从RAM中运行。 您的代码是否能做到这一点?
我尝试对行进行分组注释,在分组中对行进行注释,然后运行代码,然后对下一组注释并重复。 下面是我评论的几组行。
第1组: 102 PieCtrlRegs.PIEIER1.bit.INTx8 = 1; 103 PieCtrlRegs.PIEACK/bit.ACKACK1 = 1; 第2组: 099 IER || M_INISR; 第3组: 090 PieVectorTable.WAKEINT =&WAKE_GAUKEUP; 第4组: 062 GPIOIOREG0位/ GPIO1
到最后,我一共有5条线路被注释掉,所有这些线路的结果都是一样的,电流大约是35mA。 我还将下面的块移到了不同的位置,看看这是否有帮助,但它没有做出任何重大改变。
EALLOW; IF (SysCtrlRegs.PLLSTS.bit.MCLKSTS !=1)//仅在PLL未处于跛形模式时进入低功耗模式。 { SysCtrlRegs.LPMCR0.bit.lpm = 0x0002;// LPM模式= halt } EDIS; //强制设备进入halt __ASM(" IDE";
我在main的开头,在InitSycStrl()之后,在DINT之后添加了这个块(根据注释,DINT应该禁用所有CPU中断)。
此外,关于台式万用表,我认为我们这里没有一个。 相反,我添加了一个直插式电流感应电阻器,并在其上连接了一个万用表以测量压降。 我认为这比万用表或电源要好。 我在这个电流感应电阻器上的最低电流读数(非常最低的峰值,而不是平均值)约为29mA,所以这与我的其余读数相当接近。 我可以向您发送我正在修改的代码(如果这一点有帮助),但我不确定是否会。 请告诉我您的想法。 谢谢!
数据表编号是在JTAG连接器断开的情况下提供的。 请确保已物理断开JTAG连接器。
让我们来看看controlSUITE示例,因为它已经过验证。
程序:
编译/链接以在RAM中运行代码,这是本示例的运行方式。
加载代码。 单步执行前几个指令以确保CPU运行良好。
免运行并卸下JTAG连接器。
您可以先将设备置于空闲状态,然后再置于待机状态。 如数据表所示,您应该会看到大约16 mA的增量。
现在让我们保持空闲和待机状态。 HALT模式电流进入毫安范围,难以准确测量。
Hareesh,
我目前正在尝试修复我的处理器...我犯了一个错误,用一些固件对它进行编程,这些固件关闭了闪存,使用 FlashRegs.FPWR.Bit.PWR =0;。 调用此函数的应用程序代码在闪存中,我试图创建一个enterLMP ()函数(我相信它已加载到RAM中)。 enterLMP函数如下所示:
#pragma code_section (enterLmp,"lpmRamFuncs")
void enterLMP(void) { EALLOW; FlashRegs.FPWR.Bit.PWR =0; EDIS; ASM(" RPT #6|| NOP");// 输入低功率模式 ASM("空闲"); FlashRegs.FPWR.Bit.PWR =1; }
从那以后,我可能已经重新编程了。 我可以将内容编程到RAM,但当我尝试将其编程到闪存时,它不会通过"擦除闪存扇区A"阶段。
我尝试加载halt示例,并将行SysCtrlRegs.LPMCR0.bit.lpm = 0x0002;更改为 =0x0000以将其置于空闲模式,但它似乎没有正常运行。 我唯一可以将其向下设置为ASM (闲置)行的方法是一次设置代码1行,即使这样,它似乎也不会进入低功耗模式。
我很可能只需要更换芯片
话虽如此,当我在把所有事情搞砸之前运行halt示例时,我添加了FlashRegs.FPwr.bit.PWR =0,在我运行空闲指令之前将闪存置于睡眠状态。 当我这样做的时候,电流从35mA到5mA左右,所以可能只是我需要在运行空闲指令之前将闪存置于休眠状态。
如果是这种情况,我是否可以在进入空闲/待机模式之前将闪光灯置于睡眠状态? 然后让唤醒处理器的中断重新打开闪存?
Gregory
在将设备置于其中一种低功耗模式之前,您确实需要关闭闪存*如果*您要了解数据表编号。 这样做的方法是有一个单独的功能来执行此操作并执行空闲指令。 此函数在引导时复制到RAM,然后从RAM执行。 您不能关闭闪存中的代码。 我在较早的时候引用了我的以下引文,将所有这些都提请你注意:
“.........我感觉闪存没有关机。 关闭闪存模块电源并执行空闲指令的功能必须从RAM中运行。 您的代码是否会执行此操作?.......... "
现在,您说您可以将代码加载到RAM,但不能加载到闪存。 您是否为项目使用了密码? 我感觉您的设备可能已锁定。 如果是这种情况,您将无法访问闪存或安全RAM。 如果您尝试访问安全内存,ECSL逻辑应切断仿真器连接。
您问:"如果是这种情况,我能否在进入空闲/待机模式之前将闪光灯置于睡眠状态? 然后让唤醒处理器的中断重新打开闪存? "。 答案是"是"。 这是通常的做法。
我们没有为项目使用密码,但它可能会被意外地覆盖。 在链接器文件中,我们当前定义了ram和flash,如下所示:
内存 { 第0页:/*程序存储器*/ Begin_M0 :Origin = 0x0万,length = 0x0.0002万 /* M0SARAM的一部分-用于“Boot to M0”bootloader模式*/ L4SARAM :原点= 0x0.9万,长度= 0x0.1万 /* L4 SARAM,CSM安全*/ OTP (R) :原点= 0x3D7800,长度= 0x0.04万 /* OTP */ 零件ID :原点= 0x3D7E80,长度= 0x0.0001万 /*零件ID登记位置*/ FLASH_ABCDEFGH (R):原点= 0x3D8000,长度= 0x01CF80 /*闪存,所有扇区组合*/ TwiddleZ :原点= 0x3F5000,长度= 0x0.2万 CSM_RSVD :原点= 0x3F7F80,长度= 0x0.0076万 /*闪存扇区A的一部分-在CSM正在使用时保留*/ 开始闪烁(R) :原点= 0x3F7FF6,长度= 0x0.0002万 /*闪存扇区A的一部分-用于“跳至闪存”引导加载程序模式*/ 密码(R) :原点= 0x3F7FF8,长度= 0x0.0008万 /*闪存扇区A的一部分- CSM密码位置*/ 重置 :原点= 0x3FFFC0,长度= 0x0.0002万 FPUTABLES :原点= 0x3FD860,长度= 0x0006A0 /* Boot ROM中的FPU表*/ IQTABLES :原点= 0x3FDF00,长度= 0x000B50 /*引导ROM中的IQ数学表*/ IQTABLES2 :原点= 0x3FEA50,长度= 0x0.0008万C /*引导ROM中的IQ数学表*/ IQTABLES3 :原点= 0x3FEADC,长度= 0x0000AA /*引导ROM中的IQ数学表*/ BootROM :原点= 0x3FF3B0,长度= 0x000C10 第1页:/*数据存储器*/ M1SARAM :原点= 0x0.04万,长度= 0x0.04万 /* M1 SARAM */ dev_emu :原点= 0x0.088万,长度= 0x0.0105万 /*设备仿真寄存器*/ SYS_PWR_CTL:原点= 0x0.0985万,长度= 0x0.0003万 /*系统电源控制寄存器*/ flash_regs:origin = 0x000A80,length = 0x0.006万 /*闪存寄存器*/ CSM :原点= 0x000AE0,长度= 0x0.002万 /*代码安全模块寄存器*/ ADC_Result:原点= 0x000B00,长度= 0x0.002万 /* ADC结果寄存器镜像*/ CPU_TIMER0:原点= 0x000C00,长度= 0x0.0008万 /* CPU Timer0寄存器*/ CPU_Timer1:源站= 0x000C08,长度= 0x0.0008万 /* CPU Timer1寄存器*/ CPU_TIMER2:原点= 0x000C10,长度= 0x0.0008万 /* CPU Timer2寄存器*/ PIE_CTRL:原点= 0x000CE0,长度= 0x0.002万 /* PIE控制寄存器*/ PIE_VECT:原点= 0x000D00,长度= 0x0.01万 /* PIE矢量表*/ DMA :原点= 0x0.1万,长度= 0x0.02万 /* DMA寄存器*/ CLA1 :原点= 0x0.14万,长度= 0x0.008万 /* CLA寄存器*/ CLAMSGRAM1:原点= 0x0.148万,长度= 0x0.008万 /* PF0的一部分- CLA到CPU消息RAM */ CLAMSGRAM2:原点= 0x0.15万,长度= 0x0.008万 /* PF0的一部分- CPU到CLA消息RAM */ USB0 :原点= 0x0.4万,长度= 0x0.1万 /* USB0寄存器*/ McBSPA :原点= 0x0.5万,长度= 0x0.004万 /* McBSPA-A寄存器*/ ECANA :原点= 0x0.6万,长度= 0x0.004万 /* eCAN-A控制和状态寄存器*/ ECANA_LAM:原始= 0x0.604万,长度= 0x0.004万 /* eCAN-A本地验收掩码*/ ECANA_MOTS:原点= 0x0.608万,长度= 0x0.004万 /* eCAN-A消息对象时间戳*/ ECANA_MOTO:原点= 0x0060C0,长度= 0x0.004万 /* eCAN-A对象超时寄存器*/ ECANA_MBOX:原点= 0x0.61万,长度= 0x0.01万 /* eCAN-A Milboxes */ 能力1 :原点= 0x0.64万,长度= 0x0.002万 /*比较器+ DAC 1寄存器*/ 能力2 :原点= 0x0.642万,长度= 0x0.002万 /*比较器+ DAC 2寄存器*/ 能力3 :原点= 0x0.644万,长度= 0x0.002万 /*比较器+ DAC 3寄存器*/ EPWM1 :原点= 0x0.68万,长度= 0x0.004万 /*增强型PWM 1寄存器*/ EPWM2 :原点= 0x0.684万,长度= 0x0.004万 /*增强型PWM 2寄存器*/ EPWM3 :原点= 0x0.688万,长度= 0x0.004万 /*增强型PWM 3寄存器*/ EPWM4 :原点= 0x0068C0,长度= 0x0.004万 /*增强型PWM 4寄存器*/ EPWM5 :原点= 0x0.69万,长度= 0x0.004万 /*增强型PWM 5寄存器*/ EPWM6 :原点= 0x0.694万,长度= 0x0.004万 /*增强型PWM 6寄存器*/ EPWM7 :原点= 0x0.698万,长度= 0x0.004万 /*增强型PWM 7寄存器*/ EPWM8 :原点= 0x0069C0,长度= 0x0.004万 /*增强型PWM 8寄存器*/ eCAP1 :原点= 0x006A00,长度= 0x0.002万 /*增强捕获1寄存器*/ ECAP2 :原点= 0x006A20,长度= 0x0.002万 /*增强捕获2寄存器*/ ECAP3 :原点= 0x006A40,长度= 0x0.002万 /*增强捕获3寄存器*/ HRCAP1 :原点= 0x006AC0,长度= 0x0.002万 /*高分辨率捕获1寄存器*/ HRCAP2 :原点= 0x006AE0,长度= 0x0.002万 /*高分辨率捕获2寄存器*/ EQEP1 :原点= 0x006B00,长度= 0x0.004万 /*增强型QEP 1寄存器*/ EQEP2 :原点= 0x006B40,长度= 0x0.004万 /*增强型QEP 2寄存器*/ HRCAP3 :原点= 0x006C80,长度= 0x0.002万 /*高分辨率捕获3寄存器*/ HRCAP4 :原点= 0x006CA0,长度= 0x0.002万 /*高分辨率捕获4寄存器*/ GPIOCTRL:原点= 0x006F80,长度= 0x0.004万 /* GPIO控制寄存器*/ GPIODAT :原始= 0x006FC0,长度= 0x0.002万 /* GPIO数据寄存器*/ GPIOINT :原点= 0x006FE0,长度= 0x0.002万 /* GPIO中断/LPM寄存器*/ 系统 :原点= 0x0.701万,长度= 0x0.003万 /*系统控制寄存器*/ SPIA :原点= 0x0.704万,长度= 0x0.001万 /* SPI-A寄存器*/ SPIB :原点= 0x0.774万,长度= 0x0.001万 /* SPI-B寄存器*/ SCIA :原点= 0x0.705万,长度= 0x0.001万 /* SCI-A寄存器*/ SCIB :原点= 0x0.775万,长度= 0x0.001万 /* SCI-B寄存器*/ NMIINTRUPT:Origin = 0x0.706万,length = 0x0.001万 /* NMI监护程序中断寄存器*/ XINTRUPT:原点= 0x0.707万,长度= 0x0.001万 /*外部中断寄存器*/ ADC :原点= 0x0.71万,长度= 0x0.008万 /* ADC寄存器*/ I2CA :原点= 0x0.79万,长度= 0x0.004万 /* I2C-A寄存器*/ L0DPSARAM:原点= 0x0.8万,长度= 0x0.01万 /* L0 DPSARAM,CSM安全,CLA数据RAM 2 */ L1DPSARAM:原始= 0x0.81万,长度= 0x0.01万 /* L1 DPSARAM,CSM安全,CLA数据RAM 0 */ L2DPSARAM:原点= 0x0.82万,长度= 0x0.01万 /* L2 DPSARAM,CSM安全,CLA数据RAM 1*/ L5DPSARAM:原点= 0x0.83万,长度= 0x0.01万 /* L5 DPSARAM,DMA RAM 0 */ L6DPSARAM:原始= 0x0.84万,长度= 0x0.01万 /* L6 DPSARAM,DMA RAM 1 */ L7DPSARAM:原点= 0x0.85万,长度= 0x0.01万 /* L7 DPSARAM,DMA RAM 2 */ L8DPSARAM:原点= 0x0.86万,长度= 0x0.01万 /* L8 DPSARAM,DMA RAM 3 */ RAML4 :原始= 0x0.87万,长度= 0x0.02万 /* FFT输入缓冲器*/ RAML5 :原始= 0x0.89万,长度= 0x0.02万 /* FFT输出缓冲器*/ RAML6 :原始= 0x008b00,长度= 0x0.02万 /* FFT输出缓冲器*/ M0SARAM :原点= 0x00A000,长度= 0x00A000 /* M0 SARAM */ }
然后定义要复制到RAM中的函数的几个位置,如下所示:
secureRamFuncs.(安全RamFuncs. : load = flash_ABCDEFGH,page = 0 /*加载到闪存,从CSM安全RAM */运行 运行= L4SARAM, 页面= 0 load_start(_secureRamFuncs_loadstart), load_size (_secureRamFuncs_loadsize), run_start(_secureRamFuncs_runstart) IIRinRam : load = flash_ABCDEFGH,page = 0 /*加载到闪存,从CSM安全RAM */运行 运行= L4SARAM, 页面= 0 load_start(_IIRinRam_loadstart), load_size (_IIRinRam_loadsize), run_start(_IIRinRam_runstart)
我在链接器文件中添加了以下部分,以便复制我的函数使设备进入休眠状态:
lpmRamFuncs : load = flash_ABCDEFGH,page = 0 /*加载到闪存,从CSM安全RAM */运行 运行= L4SARAM, 页面= 0 load_start(_lpmRamFuncs_loadstart), load_size (_lpmRamFuncs_loadsize), run_start(_lpmRamFuncs_runstart)
然后我的功能让处理器进入休眠状态
#pragma code_section (enterLMP,"lpmRamFuncs") void enterLMP(void) { EALLOW; FlashRegs.FPWR.bit.PWR =0;//关闭闪存 EDIS; ASM(" RPT #6|| NOP"); //输入低功率模式 ASM(" IDLEE"); FlashRegs.F1.PWR =打开闪存/}
然后,在主菜单中,我使用以下命令初始化我的低功耗模式:
EALLOW; IF (SysCtrlRegs.PLLSTS.bit.MCLKSTS !=1)//仅在PLL未处于跛行模式时进入空闲模式。 { SysCtrlRegs.LPMCR0.bit.lpm = 0x0000;// LPM模式=空闲 // SysCtrlRegs.LPMCR0.bit.LPM = 0x0001;// LPM模式=待机 // SysCtrlRegs.LPMCR0.bit.lpm = 0x0002;// LPM模式= halt } EDIS;
这时,我应该可以随时调用我的enterLPM函数,让我的中断唤醒它,对吗? 您能在此处看到任何可能已覆盖密码的内容吗?
请检查您的.map文件,查看是否有任何内容链接到您的密码位置。 在您的项目中,您可能有一个带有所有0xFF的.asm密码文件。 如果您能够连接到设备,并且能够写入一些虚拟值以保护RAM (如L0)(通过调试器),则设备不会被锁定。 在这种情况下,您还应该能够查看密码位置。
请更新当前状态,并让我确切知道您目前遇到的问题。