请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:RF430FRL152HEVM 主题中讨论的其他器件:RF430FRL152H、 ENERGYTRACE、
您好!
我在 RF430FRL152HEVM 的功耗方面有问题。 最近我正在研究一个程序、该程序从 RF430FRL152H 的内部温度传感器获取温度值、然后检查温度是否达到给定的阈值。 该工程正在进行、因为它还应将此类事件保存到存储器中、以便可以在 NDEF 消息中读出该事件。 由于给定的功能、该项目基于 TI 提供的示例项目(RF430FRL152H NFC)。 然而,我所观察到的是该开发板显著的能耗。 使用 EnergyTrace 进行测量时未运行调试会话、平均电流消耗为4.39mA。 我将代码附在下面。 降低能耗的可能方法是什么? 在最佳情况下、我的目标将小于0.5mA。
我将非常感谢任何帮助。
#include
#include
#include "types.h"
#include
//********* 函数原型******** /
void DeviceInit(void);
void initISO15693 (U16_t 参数);
void SetupSD14 (void);
void SwitchADCtoReference (void);
void SwitchADCtoInternalTemperature (void);
//********* //
********* 定义********* /
#define CLEAR_BLOCK_LOCK_LOCs BIT3
#define FRAM_LOCK_BLOCK_SAGE_SIZE 38
#define FRAM_LOCK_blocks 0xF840 // ISO15693锁定块的地址
#define ROM_EUSCI_SUPPTING_ENABLED 位2
#define EROM_EUSCI_SUPPING_DISABLED 0
#define ROM_SENSOR_SUPPING_ENABLED BIT7
#define ROM_SENSOR_SUPPING_DISABLED 0
#define NFC_Bridge_disabled BIT6
#define NFC_Bridge_enabled 0
#define REIVE_BYTE_BLOCK BIT0
#define Four_byte_block 0
#define FIRST_ISO_PAGE BIT1
#define second_iso_page 0
/*固件系统控制字节
*
位0:ISOBlockSize 0 - 4字节、 1 - 8字节
* 位1:页 0 -第1页、 1 - PAGE 0 (仅对4字节块模式有效)
* 位2:启用 ROMEUSCISupport 0 -禁用、1 -启用(在 RF430FRL153H 上强制为0)
* 位3-5:被保留 ISO
* 位6:NFCBridgeDisable 0 -启用、1 -禁用(请参阅下面的注释)
* 位7:ROMSensorSupportEnable 0 -禁用、1 -启用(在 RF430FRL154H 上强制为0)
*
建议在此项目中禁用 NFC 桥接器。 可能会发生意外行为
、* 使用它、因为这里设置了配置。
*
* 如果需要 eUSCI 主机控制器部分以及射频功能、则为默认项目
* 必须使用。 这就是 NFC 在该应用中不受支持(因为 I2C/SPI 主机控制
器* 控制寄存器位于 NFC 文件所需的同一位置)。 但是 FRAM 的其余部分
* 存储器可用于存储和读取、使用 ISO15693。
*/
#define firmware_control_address 0xF867
#pragma RETAIN (Firmware_System_Control_Byte);
#pragma LOCATION = firmware_control_address
const u08_t Firmware_System_Control_Byte = ROM_SENSOR_SUPPLTE_DISABLED + EROM_EUSCI_SUPPLITD + NFC_BUTE_DISABLE_BLE_BLOCK + FIRST_SECTION;/0x7F、/0x7F 页; //此值设置固件系统控制寄存器
// ROM 变量-请勿更改!!!
//声明不受编译器使用
的保护/******** /
#pragma RETAIN (DS)
#pragma LOCATION = 0x1C00
u08_t DS;
#pragma RETAIN (RF)
#pragma LOCATION = 0x1C6A
const u08_t RF;
#pragma RETAIN (NRX)
#pragma LOCATION = 0x1CA4 //
const u08_t NRX[34];#pragma
RETAx (N08
)#pragma RETAx (NRETAx)#pragma RETAIN = 0x1C12_t RETAx
(N08)#pragma RETAIN = 0x1C12_t RETAx (nT)
#pragma RETAIN (PF)
#pragma LOCATION = 0x1C0A
const U16_t PF[48];
/********* /
#define ADC_Treshold 0x2720
#define NDEF_START_ADDRESS 0xF868
#define TEMP_THRESHOLD 11744
#define INTERVE_CONSTANT _MS 60000
#define INTERVAL_INTERVE_DETANESements 1.
#pragma RETAIN (NFC_NDEF_Message);
#pragma LOCATION = NDEF_START_ADDRESS; //地址
const u08_t NFC_NDEF_Message[12]的位置={
//块0
0xE1、 // NDEF 魔法号
0x40、 //版本号,读取/写入访问条件
0x79、 //0x7E、 // 1008字节/8 = 126个块
0x00、 //0x04、 //8字节扩展存储器//0x00、 //不支持读取多个块(仅限于3个块)
//块1
0x03、 // NDEF 消息存在
0x4E、 //长度,11字节
0xD1、
0x01、
//块2
0x3F、
0x54、
0x02、
0x65
、};
//u08_t memoryAddressTracker = 0;
volatile u08_t n;
/******* 总结
*此项目仅使用 RF430FRL15xH ROM 上的射频堆栈(ISO15693)。 此设置允许用户创建
从 FRAM 运行的*自定义应用程序。 只有运行 RF 堆栈
的 RF13M 矢量需要指向其* ROM 位置。
*//********
分配内存以存储 ADC 读数******** /
#define ADC_ADDRESS 0xF874//0xF88C //块9
#pragma RETAIN (ADC_READ);
#pragma LOCATION = ADC_ADC_ADDRESS;
U16_t ADC_READ[30];//用于存储温度读数的表
U16_t TEMP_Val;//临时存储温度。 来自 ADC 输出寄存器
的值//********* /
/
*主要内容
*
简介:
*
*帕拉姆[IN]:无
*
*帕拉姆[OUT]:无
*
返回:
*
/
void main ()
{
n = 0;
temp_Val = 0;
WDTCTL = WDTPW + WDTHOLD; //停止看门狗
// ROM RF13M 模块设置**正确的 RF 堆栈操作需要以下三行
DS = 1; //需要在此处初始化 ROM 变量
ASM ("调用#0x5CDA "); //调用 ROM 函数(初始化函数指针)
ASM ("调用#0x5CAC "); //调用 ROM 函数(检查器件配置)
initISO15693 (clear_block_locks);
DeviceInit();
SetupSD14();
while (1)
{
SD14CTL0 |= SD14SC;//开始转换
_bis_SR_register (LPM3_bits + GIE);
}
}
void SetupSD14(){
SD14CTL1 = SD14UNI //单极
+ SD14RBEN0
+ SD14RBEN1
+ SD14INTDLY0
+ SD14RATE__CIC128
+ SD14INCH__INTTEMP //内部温度传感器
;
SD14CTL0 = SD14IE //启用中断
+ SD14SGL //单次转换模式
+ VIRTGND //使用虚拟接地(SVSS)
;
SD14CTL0 |= SD14EN; //启用 SD14模块,
SD14CTL0 |= SD14SC; //开始转换
}
void SwitchADCtoReference(){
SD14CTL1 = SD14UNI //单极
+ SD14RBEN0
+ SD14RBEN1
// + SD14GAIN0 //增益为2
+ SD14INTDLY0
+ SD14RATE__CIC128
+ SD14INCH_TEMP1 /* SD14通道输入选择:基准电阻器/Temp1 */
;}
void SwitchADCtoInternalTemperature(){
SD14CTL1 = SD14UNI //单极
+ SD14RBEN0
+ SD14RBEN1
// + SD14GAIN0 //增益为2
+ SD14INTDLY0
+ SD14RATE__CIC128
+ SD14INCH__TEMP /* SD14通道输入选择:内部温度*/
;
*DeviceInit
*
*简介:初始化时钟系统和其他设置
* patchable function
*
* param[in]:parameters:具有这些独立选项
* Initialize_device_clock_system -初始化时钟系统
* populate_interrupt_vector_in_initialization -填充默认中断矢量并重新计算其 CRC
*
param[out]:无
*
返回无
*
*可修补:是
/void
DeviceInit(void){
RFPMMCTL0 = PMMPW; //解锁 RFPMM
RFPMMCTL0_L |= RFPMM_EN_BATSWITCH; //启用电池开关
RFPMMCTL0_H |= 0xFF; //锁定寄存器
P1SEL0 = 0xF0; //保留 JTAG
P1SEL1 = 0xF0; //保留 JTAG
P1DIR &=~0xEF;
P1REN = 0;
CCSCTL0 = CCSKEY; //解锁 CCS
CCSCTL1 = 1; //时钟速度的一半
CCSCTL4 = SERA_1 + // ACLK 源-低频时钟(256kHz)
SELM_0 + // MCLK 源-高频时钟 HFCLK
SELS_0; // SMCLK 源-高频时钟 HFCLK
CCSCTL5 = DIV_5 + // ACLK 源分频器设置为32分频->8kHz
DIVM_1 + // MCLK 源分频器设置为除以2
DIVS_3; // SMCLK 源分频器设置为除以4
CCSCTL6 = XTOFF; //关闭 XT 振荡器
CCSCTL8 = ACLKREQEN + // ACLK 时钟请求使能
MCLKREQEN + // MCLK 时钟请求使能
SMCLKREQEN; // SMCLK 时钟请求使能
TA0CCTL0 = CCIE; //定时器 A0捕捉/比较中断使能
TA0CTL = tassel__ACLK + // Timer_A 时钟源选择-> ACLK
MC_1 + //模式控制、定时器向上计数到存储在 TA0CCR0中的值
ID_3; //输入分频器-> 1/8 (8kHz/8 = 1kHz)-这是进入比较寄存器的频率
TA0CCR0 = INTERVAL_CONSTANT _MS * INTERVE_INTERVE_INTERVE_MEASIN测量;
CCSCTL0_H |= 0xFF;
return;
}
#pragma vector=TIMER0_A0_vector
__interrupt void Timer_A (void)
{
//准备变量以进行读取
switch (__evo_in_range (SD14IV、4))
{
案例 SD14IV__NONE://无中断挂起
{
中断;
}
案例 SD14IV_RES://ADC 数据可用
{
SD14CTL0 &=~SD14IFG;//清除数据可用中断
TEMP_Val = SD14MEM0;
//校准公式:1/35.7 (temp_Val - 11524)+ 287
if (temp_Val > TEMP_THRESHOLD){
ADC_READ[n]= SD14MEM0;
N++;
如果(n = 30){
// memset (adc_read、0、sizeof (adc_read));
N = 0;
}
_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);
中断;
}否则{
_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);
中断;
}
中断;
}
案例 SD14IV__OV://Memory Overflow
{
SD14CTL0 &=~SD14OVIFG;
//清除溢出位
中断;
}
}
/
*initISO15693
*
*简介:初始化射频堆栈
*
* param[in]:参数-设置 ISO15693 (清除锁定块的选项)的配置
*
param[out]:none
*
return 「无」
/
void initISO15693 (u16_t parameters)
{
//启用中断**请勿更改以下两行,
这两行是 RF13MCTL 中正确的射频堆栈操作所需的|| RF13MTXEN + RF13MRXEN + RF13MRFTOEN;//在 RF13M 模块
RF13MNT 上设置 Rx 和 TX 功能|= RF13MRXIE + RF13RXTRF13MTOEN; //如果
(参数& clear_block_lock)
为{,则在 RX 和超时以及过流和欠流检查上启用中断
//initializeBlockLockLockLocks();//inline 函数
memset (((u08_t *) FRAM_LOCK_BLOCK、0xFF、FRAM_LOCK_BLOCK_SAGE_SIZE); //块用零位锁定、 清除 FRAM 和 RAM 锁定块
}
//#pragma
vector = RFPMM_vector
//_INTERRUPT void RFPMM_ISR (void)
////
//////////#pragma vector = Port1_vector
//_interrupt port1_ISR (void)
//{
////////// pragma
ISR vector =
//#pragma COUT_0/ void /RF0_MODE/#BR_COUT_ADC/0/ void
//注释此行以使用 ROM 的 RF13M ISR,取消注释下一行,请参阅.cmd 文件以了解详细信息
#pragma CODE_SECTION (RF13M_ISR,".rf13m_ROM_ISR") //注释此行以创建将存在于 FRAM 中的定制 RF13M ISR、绕过 ROM、取消注释先前
的#pragma vector = RF13M_vector
__interrupt void RF13M_ISR (void)
{
//此矢量现在指向运行射频堆栈的 ROMS 固件位置。
//在此处输入代码,而不更改 CODE_SECTION 行
//以上将导致错误。
//更改上面的代码部分将导致 ROM RF 堆栈被绕过。 需要创建新的处理程序
。}
//#pragma vector = WDT_Vector
//_INTERRUPT void WDT_ISR (void)
//////
//
////////#pragma vector = TIMER0_A1_vector
//_INTERRUPT void TimerA1_ISR (void)
////////////////
////#Sysma vector = TIMER0_A1_vector //(
void
)///中断/nvoid /中断/中断 向量/nvoid /中断向量///