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.

[参考译文] RF430FRL152HEVM:功耗优化

Guru**** 2436930 points
Other Parts Discussed in Thread: RF430FRL152H, ENERGYTRACE, RF430FRL152HEVM

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/769818/rf430frl152hevm-power-consumption-optimizations

器件型号:RF430FRL152HEVM
主题中讨论的其他器件:RF430FRL152HENERGYTRACE

您好!

 我在 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 /中断向量///


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

    我将尝试重现这一情况、并将在下周开始时再次向您介绍。

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

    您能否检查代码中的中断服务例程。
    ISR 正在处理 Timer_A IRQ、但随后会检查 SD14。

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

    检查 SD14的原因是、我希望每指定的时间间隔从 SD14中读出值-这就是我将此过程放入 Timer_A IRQ 的原因。 这种态度是否正确?