Other Parts Discussed in Thread: MSP430F5529, MSP430FR6989
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP-EXP430F5529 主题中讨论的其他器件:MSP430FR6989
工具/软件:TI-RTOS
在这个问题之后、尝试降低 运行 TI-RTOS 的 MSP430F5529的电流消耗。
在尝试了几个步骤(见下面)后、我仍然无法获得低于~500uA 的电流。 问题:
- 使用 TI-RTOS 是否会从本质上增加电流消耗?
- 假设没有发出中断(我已禁用系统节拍)、并且 MCU 处于 LPM3模式、MCLK 频率是否仍会影响电流消耗?
测试程序:
- 我已经从一个简单示例项目(gpiointerrupt_MSP_EXP430F5529LP_TI)开始、并将其转换为 MSP-EXP4305529
- 禁用 SVM H/L、如 PMM_ex3_lowCurrentConsumption 中所述
- 在 gpiointerrupt.cfg 中、禁用时钟模块、并在空闲时配置 LPM3 (请参阅下面的 cfg 文件)
配置脚本:
/*
版权所有(c) 2015-2016、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在
*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经
事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、
不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
//
/*========================= 引导配置=================== */
var Boot = xdc.useModule('ti.catalog.msp430.init.Boot');
/*=========== 默认值(模块)配置=================== //
var Defaults = xdc.useModule('xdc.runtime.Defaults');
//
*允许在目标上加载模块名称的标志。 模块名称
*字符串放置在.const 段中以用于调试。
*
*选择一个:
*- true (默认值)
*将此参数设置为 true 将在.const
*段中包含名称字符串,以便更容易调试错误和断言。
*- false
*将此参数设置为 false 将减小.const
*段中的占用空间。 因此、错误和断言消息将包含
*"未知模块"前缀、而不是实际的模块名称。
*/
/Defaults.common$.namedModule = true;
Defaults.common$.namedModule = false;
/*====== 错误配置=================== //
var Error = xdc.useModule('xdc.runtime.Error');
//
*调用此函数以处理所有引发的错误,但与
* Error.raiseHook 不同,此函数负责使用
适当初始化的 Error_Block 完全处理*错误。
*
*选择一个:
*- Error.policyDefault (默认值)
*使用已初始化的 Error_Block 结构调用 Error.raiseHook 并使用
模块的记录器记录*错误。
*- Error.policySpin
*在 while (1)循环中进行陷阱以最大程度地减小目标
*占用空间的简单替代方案。
*使用 Error.PolicySpin 时,将不会调用 Error.raiseHook。
//
//Error.PolicyFxn = Error.PolicyDefault;
Error.PolicyFxn = Error.PolicySpin;
//
*如果 Error.PolicyFxn 设置为 Error.PolicyDefault,则
每当错误模块引发错误时,都会调用此函数*。
*
*选择一个:
*- Error.print (默认值)
*错误通过 System_printf ()进行格式化和输出,以便
于*调试。
*-空
*未格式化或记录错误。 此选项减少了代码占用空间。
*-非空函数
*错误调用自定义用户函数。 有关
更多详细信息、请参阅错误模块文档*。
//
//Error.raiseHook = Error.print;
Error.raiseHook =空;
//Error.raiseHook ="&myErrorFxn";
//
*如果 Error.policyFxn 设置为 Error.PolicyDefault,此选项适用于
* Error.raiseHook 函数可被递归
调用的最大次数*。 此选项限制了无限递归的可能性
、*可能导致栈溢出。
*默认值为16。
*/
Error.maxDepth = 2;
/*========================= Hwi 配置=================== //
var halHwi = xdc.useModule('ti.sysbios.hal.Hwi');
var msp430Hwi = xdc.useModule('ti.sysbios.family.msp430.Hwi');
//
*在空闲循环中检查 Hwi (系统)堆栈溢出。
*
*选择一个:
*- true (默认值)
*检查空闲循环期间系统堆栈溢出的顶字,
*如果检测到错误,则生成错误。
*- false
*禁用运行时检查可提高运行时性能、
并使闪存占用量*减少。
*/
halHwi.checkStackFlag = true;
//halHwi.checkStackFlag = false;
/*====== 空闲配置========================= //
var Idle = xdc.useModule('ti.sysbios.knl.Idle');
//
*空闲模块用于指定
在系统中没有*其他任务正在运行时要调用的函数列表。
*
*此处添加的函数将在空闲任务内连续运行。
*
*函数签名:
* void func (void);
*//idleFunc
("&myIdleFunc");
/*========================= 内核(SYS/BIOS)配置=================== */
var BIOS = xdc.useModule('ti.sysbios.BIOS');
/*
启用 BIOS 库中的断言。
*
*选择一个:
*- true (默认值)
*启用断言以进行调试。
*- false
*禁用断言以减小代码占用空间并提高性能。
//
//BIOS.assertsEnabled = true;
BIOS.assertsEnabled = false;
//
*指定 BIOS 的默认堆大小。
//
BIOS.heapSize = 0;
//
*一个标志,用于确定 xdc.runtime 源是否包含在自定义
*构建的 BIOS 库中。
*
*选择一个:
*- false (默认值)
*预编译的 xdc.runtime 库由用于
编译应用的相应目标提供*。
*- true
* xdc.runtime 库源代码将包含在自定义 BIOS
*库中。 此选项可在代码
*占用空间和运行时性能方面产生最高效的库。
*/
BIOS.includeXdcRuntime = false;
//BIOS.includeXdcRuntime = true;
//
* SYS/BIOS 运行时以库的形式提供
*与应用程序链接*。
SYS/BIOS 产品随附了该库的几种形式。
*
*选择一个:
*- BIOS.LibType_Custom
*针对代码占用空间和
*运行时性能进行了高度优化的自定义构建库。
*- BIOS.LibType_Debug
*自定义编译库、未经过优化
、可*通过调试器单步执行 API。
*
//
BIOS.libType = BIOS.LibType_Non检测 到;
//BIOS.libType = BIOS.LibType_Debug;
//
*运行时实例创建启用标志。
*
*选择一个:
*- true (默认值)
*允许在运行时调用 Mod_create()和 Mod_delete ()
,*需要一个默认堆用于动态内存分配。
*- false
*通过禁止在
运行时调用 Mod_create()和 Mod_delete ()来减少代码占用空间。 对象实例通过
* Mod_construct()构造,并通过 Mod_析 构()析构。
*/
BIOS.runtimeCreatesEnabled = true;
//BIOS.runtimeCreatesEnabled = false;
/*
启用 BIOS 库中的日志。
*
*选择一个:
*- true (默认值)
*启用日志以进行调试。
*- false
*禁用日志记录以减少代码占用空间并提高运行时
*性能。
//
//BIOS.logsEnabled = true;
BIOS.logsEnabled = false;
/*====== 内存配置=================== //
var 内存= xdc.useModule('xdc.runtime.Memory');
//
*内存模块本身只为 IHeap
模块(例如、 HeapMem、HeapBuf)。
//
/*========================= 电源配置======================== */
var Power = xdc.useModule('ti.sysbios.family.msp430.Power');
/*
动态更改空闲模式电源设置。
*
*选择一个:
*- true
*
允许在运行时从中断返回*时动态唤醒 CPU。
*- false (默认值)
*禁用此参数的运行时检查;生成
*小代码保存。
//
//Power.allowDynamicMode = true;
Power.allowDynamicMode = false;
//
*系统进入空闲循环时电源模块的行为。
*
*选择一个:
*- false (默认值)
*禁用省电并忽略电源策略函数。
*- true
*电源模块将电源策略函数插入空闲循环
*在该循环中、它将执行操作以节省功耗
、直到发生下一个 CPU 中断*。 此选项可能会导致调试器与
*目标断开连接。
*/
Power.IDLE = true;
//Power.IDLE = true;
/*
这些选项仅在 Power.IDLE 设置为 true 时适用。 Power.idleMode
*参数决定系统进入空闲循环时的行为。
*
*选择一个:
*- Power.LPM0 (默认值)
*- Power.LPM1
*- Power.LPM2
*- Power.LPM3
*- Power.LPM4
*请参阅相应
* MSP430用户指南的操作模式部分以了解这些模式的详细说明。
//
//Power.idleMode = Power.LPM0;
//Power.idleMode = Power.LPM1;
//Power.idleMode = Power.LPM2;
//Power.idleMode = Power.LPM3;
//Power.idleMode = Power.LPM4;
/*========================= 程序配置=================== IAR
忽略*//* Program.stack。 使用
* IAR Embedded Workbench 中的项目选项来改变系统堆栈大小。
//
if (!Program.build.target.$name.match (/IAR/)){
/*
减小系统堆栈大小(由 ISR 和 Swi 使用)以减少
* RAM 的使用。
//
Program.stack = 768;
}
//
*取消注释以启用将 GNU 目标打印到 CCS 控制台的半主机功能。
*请阅读以下 TIRTOS Wiki 页面以了解有关半主机的更多信息:
* processors.wiki.ti.com/.../TI-RTOS_Examples_SemiHosting
*/
if (Program.build.target.$name.match (/GNU/){//var
SemiHost = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');
}/*
========== 信标配置=================== //
var semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
//
*启用对任务优先级挂起队列的全局支持。
*
*选择一个:
*- true (默认值)
*这允许根据待处理任务的优先级为其提供服务。
*- false
*暂挂任务是基于先入先出的服务。
*
*在 ROM 中使用 BIOS 时:
*必须将此选项设置为 false。
//
//semaphore.supportsPriority = true;
semaphore.supportsPriority = false;
//
*允许通过信号量隐式布置事件,
*禁用以保存其他代码。
*
*选择一个:
*- true
*这允许信标模块
同时发布信标和事件*。
*- false (默认值)
*必须显式布置事件以解除阻止任务。
*
///semaphore.supportsEvents
= true;
semaphore.supportsEvents = false;
/*=================== Swi 配置=================== //
var Swi = xdc.useModule('ti.sysbios.knl.Swi');
//
*软件中断是一个包含
要*执行的函数和优先级的对象。 软件中断被优先化、优先任务
*并被硬件中断服务例程抢先。
*
*包括此模块是为了允许在用户的应用程序中使用 Swi。
//
/*========================= 系统配置=================== //
var System = xdc.useModule('xdc.runtime.System');
//
*当系统异常退出时调用中止处理程序。
*
*选择一个:
*- System.AbortStd (默认)
*调用 ANSI C 标准'abort()'以终止应用程序。
*- System.AbortSpin
*一种轻量级中止函数、在 while (1) trap
*函数中无限循环。
*-自定义中止处理程序
*用户定义的函数。 有关
*详细信息、请参阅系统模块文档。
//
//System.ABortFxn = System.ABortStd;
System.ABortFxn = System.ABortSpin;
//System.ABortFxn =“&myAbortSystem”;
//
*系统正常退出时调用 Exit 处理程序。
*
*选择一个:
*- System.exitStd (默认)
*调用 ANSI C 标准'exit()'以终止应用程序。
*- System.exitSpin
*一种轻量退出函数、在 while (1) trap
*函数中无限循环。
*-自定义退出函数
*用户定义的函数。 有关
*详细信息、请参阅系统模块文档。
//
//System.exitFxn = System.exitStd;
System.exitFxn = System.exitSpin;
//System.exitFxn ="&myExitSystem";
//
*最小化系统模块中的退出处理程序数组。 System 模块包括
*一个在 System_atexit()中注册的函数数数组,System_exit()
调用该函数组。 默认值为8。
//
System.maxAtexitHandlers = 2;
//
* System.SupportProxy 定义了 System
*函数的低级实现,例如 System_printf ()、System_flush ()等
*
*选择一对:
*- SysMin
*此模块维护一个内部可配置循环缓冲器,
*存储输出,直到调用 System_flush()。
*循环缓冲区的大小通过 SysMin .bufSize 设置。
*- SysCallback
* SysCallback 允许用户定义的系统 API 实现。
* SysCallback 支持代理的代码占用空间较小
,*可用于提供自定义 System_printf 服务。
*默认的 SysCallback 函数指向存根函数。 请参阅
* SysCallback 模块的文档。
*/
var SysMin = xdc.useModule('xdc.runtime.SysMin');
SysMin。bufSize = 128;
System.SupportProxy = SysMin;
/*=================== 文本配置=================== //
var text = xdc.useModule('xdc.runtime.Text');
//
*这些字符串放置在.const 段中。 将此参数设置为
* false 将节省.const 段中的空间。 错误、断言和日志消息
*将打印原始 ID 和 args、而不是格式化的消息。
*
*选择一个:
*- true (默认值)
*此选项将测试字符串加载到.const 中以方便调试。
*- false
*此选项可减小.const 占用空间。
//
//text.isLoaded = true;
text.isLoaded = false;
/*====== 类型配置=================== */
var types = xdc.useModule('xdc.runtime.Types');
/*
此模块定义了在
* xdc.runtime 软件包中使用的基本常量和类型。
//
/*========================= TI-RTOS 中间件配置================= */
var mwConfig = xdc.useModule('ti.mw.Config');
/*
包括 TI-RTOS 中间件库
*/
/*================== TI-RTOS 驱动程序的配置==== //
var driversConfig = xdc.useModule('ti.drivers.Config');
//
*包含 TI-RTOS 驱动程序
*
选择一个:
*- driversConfig.LibType_Non检测(默认)
*使用针对占用空间和性能进行优化的 TI-RTOS 驱动程序库
*不使用断言或日志。
*- driversConfig.LibType_Instrumented
*使用 TI-RTOS 驱动程序库进行调试、并启用断言和日志。
*/
driversConfig.libType = driversConfig.LibType_noniced;
//driversConfig.libType = driversConfig.LibType_instrumented;
/*=========== 应用程序特定实例========================= //
//*仅将 UARTMon 与 TI 工具链一起使用*/
if (!Program.build.target.$name.match (/IAR/)){
var UARTM= xdc.useModule('ti.tirtos.utils.UARTMon');
}
//
* MSP430需要创建静态 Hwi isnance。
*
*在发生硬件中断的情况下,将运行此处添加的函数。
*
*函数签名
:* void func (UArg);
*/
var hwiParams = new halHwi.Params ();
//将 GPIO 端口号添加为 Hwi 参数*/
hwiParams.arg = 2;
halHwi.create (42、"&GPIO_hwiIntFxn"、hwiParams.47);
/ hwiParwi_hwiParams.47;* hwi_hwiparwiams.cream
1、halwi_hwi_hwiParn"
/*
添加 UART 索引号作为 Hwi 参数。
*此参数用于索引到
board.c 文件中声明的 UART 外设数组*。
*/
hwiParams.arg = 0;
halHwi.create (46、"&UARTUSCIA_hwiIntFxn"、hwiParams);
Power.idleMode = Power.LPM3;