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.

[参考译文] RTOS/CC1310:RTOS/CC1310

Guru**** 2539500 points
Other Parts Discussed in Thread: TMP116

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/692015/rtos-cc1310-rtos-cc1310

器件型号:CC1310
Thread 中讨论的其他器件:TMP116SYSBIOS

工具/软件:TI-RTOS

如何在我的个性化 PCB 的待机模式下降低功耗、该板与传感器 tmp116相连接、我还使用了 CC130 4x4mm 和通信射频、请这么做?

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

    在待机模式下、许多外设和 PD 仍然可以处于活动状态。 我建议您在进入待机模式之前关闭正在使用的域。

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

    大家好、感谢您的回复、

    您能不能说,如何做,请?

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

    您好!

    我们提供的电源管理 API 可让您控制每个外设的父电源域。 我们的技术参考手册有一个非常好的描述性部分,介绍了电源管理的工作原理,并提供了每个外设所在位置的图表()

    至于 API、我们提供了一份具体的电源管理文档、可指导您完成以下操作:  

    我们还提供了引脚关断示例和引脚待机示例、您可以使用此示例更好地了解驱动器。

    此致、

    AB

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复、
    这是我的代码、感谢您解释了如何添加电源管理部分、我尝试了信标和限制、但电流始终相同。

    -------------------------------------- 主--------------------------------------------------------------------
    * POSIX 头文件*/
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include


    /* BIOS 头文件*/
    #include
    #include
    #include
    #include
    #include
    #include


    /* TI-RTOS 头文件*/
    #include
    #include

    #include
    #include
    #include
    #include
    #include
    #include

    /*板头文件*/
    #include "Board.h"

    /* EasyLink API 头文件*/
    #include "EasyLink/EasyLink.h"



    #include "version.h"
    #include "../sonde_gw_FW/sys_intf.h"

    #include
    #include

    #define RFEASINKTX_TASK_STACK_SIZE 1024
    #define RFEASINKTX_TASK_PRIORITY 2.

    #define RFEASINKTX_BURST_SIZE 1
    #define THREADSTACKSIZE 768

    #define SAMPLE_TIME 1 /*in seconds (*秒)*/
    #define TMP_TASK_STACK_SIZE 768

    TMP116_handle tmp116Handle =空;
    I2C_Handle i2cHandle =空;
    SEM_t tmp116Sem;

    uint8_t SavedBattery;


    /*可从 GUI Composer App 访问和设置的全局采样率*/
    volatile uint16_t sampleTime;

    /*
    *==== tmp116Callback ====
    *当 TMP116硬件上满足警报条件时、ALERT 引脚
    *被置为有效、生成中断。 此回调函数用作
    *用于单个 TMP116传感器的 ISR。
    *
    void tmp116Callback (uint_least8_t 索引)

    SEM_post (&tmp116Sem);


    /*
    *==== tmp116AlertTask ====
    *当 ALERT 引脚被置为有效时、此任务将被解除阻止并生成
    *中断。 当 TMP116处于中断模式时、必须使用状态寄存器
    *以清除 ALERT 引脚。
    *

    void *tmp116AlertTask (void *arg0)

    uint16_t 数据;

    while (1){

    /*在信标上挂起、tmp116Sem */
    if (0 =SEM_WAIT (&tmp116Sem)){

    /*读取状态寄存器、复位 ALERT 引脚*/
    TMP116_readStatus (tmp116Handle、&data);

    /*检查物体温度高标志*/
    IF (DATA & TMP116_STAT_ALR_HI){


    /*检查物体温度低标志*/
    IF (DATA & TMP116_STAT_ALR_LO){







    Task_Structt txTask;//不是静态的,因此可以在 ROV 中看到*/
    静态 Task_Params txTaskParams;
    静态 uint8_t txTaskStack[RFEASINKTX_TASK_STACK_SIZE];

    Task_StructsensorTask;//不是静态的,因此可以在 ROV 中看到*/
    静态 Task_Params sensorTaskParams;
    静态 uint8_t sensorTaskStack[RFEASINKTX_TASK_STACK_SIZE];

    typedef 结构{
    uint8_t 原因;
    INT8_t TEMP_DEG_FRAC_8;
    uint8_t temp_deg_FRAC_8_vir;
    uint8_t bat_20mV;
    } opto_sonde_data_t;

    typedef 结构{
    int8_t temp_msb;
    uint8_t temp_LSB;
    }DATA_t;

    void sleepAndReset (uint32_t sleep_time_s){

    uint32_t s = sleep_time_s;
    while (秒> 0)

    uint32_t SLEEP_s =秒> 2000? 2000:秒;
    Task_sleep ((sleep_s * 1000u * 1000)/ Clock_tickPeriod);
    secs --sleep_s;


    SysCtrlSystemReset();


    静态空 rfEasyLinkTxFnx (UArg0、UArgarg1)


    opto_sonde_data_t* optosonde_data =(opto_sonde_data_t*) arg0;

    EasyLink_init (EasyLink_Phy_Custom);

    /*
    *如果您希望使用默认频率以外的频率、请使用
    *以下 API:
    * EasyLink_setFrequency (868000000);
    *

    /*将输出功率设置为12dBm */
    // EasyLink_setRfPwr (12);
    EasyLink_setRfPwr (10);

    EasyLink_TxPacket txPacket;

    //填充数据包数据
    uint8_t PAYLOAD_ptr = 0;
    //有效载荷版本
    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(0x0);
    // src MAC
    EasyLink_getIeeAddr (&txPackage.PAYLOAD[PAYLOAD_PTR]);
    PAYLOAD_PTR += 8;

    //复制数据
    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->原因);
    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->temp_deg_FRAC_8);
    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->temp_deg_FRAC_8_vir);
    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->bat_20mV);
    //固件版本
    memcpy (&txPacket.PAYLOAD[PAYLOAD_PTR]、&version_hash、sizeof (version_hash));
    PAYLOAD_PTR += sizeof (version_hash);

    txPacket.len = PAYLOAD_PTR;
    txPacket.absTime = 0;
    txPacket.dstAddr[0]= OPTOSONDE_ADDR;

    EasyLink_Status 结果= EasyLink_transmit (&txPacket);

    if (结果=EasyLink_Status_Success)

    /*切换 LED1以指示 TX */
    // PIN_setOutputValue (pinHandle、Board_PIN_LED1、!PIN_getOutputValue (Board_PIN_LED1));

    其他

    /*切换 LED1和 LED2以指示错误*/
    // PIN_setOutputValue (pinHandle、Board_PIN_LED1、!PIN_getOutputValue (Board_PIN_LED1));
    // PIN_setOutputValue (pinHandle、Board_PIN_LED2、!PIN_getOutputValue (Board_PIN_LED2));


    Task_sleep (5);


    空 sendorTask_AlertCB (UArg0、UArgarg1)

    static opto_sonde_data_t optosonde_data;
    optosonde_data.reason = optosonde_reason_periodic;
    data_t* temptetit =(data_t*) arg0;

    optosonde_data.temp_deg_FRAC_8 =(temptede->temp_MSB);
    optosonde_data.temp_deg_FRAC_8_vir =(temptede->temp_LSB);
    if (!AONBatMonNewBatteryMeasureReady())(如果!AONBatMonNewBatteryMeasureReady())

    //等待
    optosonde_data.bat_20mV = SavedBattery;

    否则{
    SavedBattery =(AONBatMonBatteryVoltageGet ()* 390625)/ 2000000;
    optosonde_data.bat_20mV = SavedBattery;
    AONBatMonDisable();



    // Init Tx 任务
    Task_Params_init (&txTaskParams);
    TxTaskParams.STACKSIZE = RFEASYS LINKTX_TASK_STACK_SIZE;
    txTaskParams.priority = RFEASINKTX_TASK_priority + 1;
    txTaskParams.stack =&txTaskStack;
    txTaskParams.arg0 =(XDC_UArg) optosonde_data (&O);

    Task_construction (&txTask、rfEasyLinkTxFnx、&txTaskParams、NULL);




    /*
    *==== mainThread ====
    *
    void * mainThread (void * argc)


    静态 DATA_t temptetic;
    INT8_t MSB;
    uint8_t LSB;
    浮点 tempTooread;
    I2C_Handle i2cHandle;
    I2C_Params i2cParams;
    内部 REC;
    pthread_t alertTask;
    pthread_attr_t pAttrs;
    sampleTime = sample_time;
    TMP116_Params tmp116Params;

    /*调用驱动程序初始化函数*/
    //GPIO_init();
    I2C_init();
    TMP116_init();


    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);

    i2cParams.bitrate = I2C_400kHz;

    i2cHandle = I2C_open (Board_I2C_TMP、&i2cParams);
    if (i2cHandle == NULL){
    while (1);

    否则{


    if (0!= SEM_INIT (&tmp116Sem、0、0))

    /* SEM_INIT()失败*/
    while (1);


    pthread_attr_init (&pAttrs);
    pthread_attr_setstacksize (&pAttrs、TMP_task_stack_size);
    retc = pthread_create (alertTask、&pAttrs、tmp116AlertTask、NULL);
    如果(retc!= 0){
    /* pthread_create()失败*/
    while (1);


    /*将 tmp116Params 结构初始化为默认值*/
    TMP116_Params_init (&tmp116Params);

    /*警报事件回叫*/
    tmp116Params.callback = tmp116Callback (&T);

    /*使用自定义参数打开 TMP116传感器*/
    tmp116Handle = TMP116_open (Board_TMP007_ROOMTEMP、i2cHandle、&tmp116Params);

    /*检查打开是否成功*/
    if (tmp116Handle == NULL){
    while (1);


    /*允许传感器硬件完成其第一次转换*/
    睡眠(2);


    /*获取摄氏温度*
    if (!TMP116_getTemp (tmp116Handle、TMP116_Celsius、&tempTooread)){



    /*开始无限任务循环*/
    while (1){

    TMP116_getTemp (tmp116Handle、TMP116_Celsius、tempTooread);
    /*获取裸片和物体温度*/
    MSB =(INT8_t) tempTooread;
    LSB =(uint8_t)((tempToread-MSB)* 100);
    tempterit.ptemp_MSB=MSB;
    tempterit.ptemp_LSB=LSB;

    //传感器任务
    Task_Params_init (&sensorTaskParams);
    sensorTaskParams.STACKSIZE = RFEASINKTX_TASK_STACK_SIZE;
    sensorTaskParams.priority = RFEASINKTX_TASK_PRIORITY;
    sensorTaskParams.stack = sensorTaskStack;
    sensorTaskParams.arg0 =(XDC_UArg) temptour;

    Task_construct(&sensorTask, sendorTask_AlertCB,&sensorTaskParams, NULL);

    //将 RTC 设置为休眠状态
    #ifdef OPTOSONDE_DEMO_MODE
    uint32_t SLEEP_TIME_s = 30;
    #Elif OPTOSONDE_VITICODE
    uint32_t SLEEP_TIME_s = 10 * 60;
    其他
    uint32_t SLEEP_TIME_s = 1 * 60;
    #endif

    sleepAndReset (SLEEP_TIME_s);




    /*
    *==== main ====
    *

    void maini2c (void)

    pthread_t 线程;
    pthread_attr_t pAttrs;
    struct sched_param primParam;
    内部 REC;
    内部 detachState;

    /*设置优先级和堆栈大小属性*/
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;

    detachState = pthread_create_detached;
    retc = pthread_attr_setdetachstate (&pAttrs、detachState);
    如果(retc!= 0){
    ///* pthread_attr_setdetachstate()失败*/
    while (1);


    pthread_attr_setschedparam (&pAttrs、&priParam);

    retc |= pthread_attr_setstacksize (&pAttrs、THREADSTACKSIZE);
    如果(retc!= 0){
    /* pthread_attr_setstacksize()失败*/
    while (1);


    retc = pthread_create (&thread、&pAttrs、mainThread、NULL);
    如果(retc!= 0){
    /* pthread_create()失败*/
    while (1);


    /*销毁 pthread 属性*/
    pthread_attr_destroy (&pAttrs);



    int opto_main (void)


    /*调用驱动程序初始化函数。 *
    maini2c();
    Board_initGeneral();

    /*启动 BIOS */
    BIOS_start();

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

    我看不到您是如何使 MCU 处于睡眠状态的。 我确实看到您正在调用任务睡眠、但这只是阻止您从中调用任务的任务。 传感器任务仍然在运行、然后 EasyLink 任务在运行。 此外、您还需要考虑、如果不关闭传感器电源、电流将不会下降。 我建议让任务在 while 循环(永远)上运行并在信标上挂起、而不是重新调用 MCU 并重新启动所有内容。

    此致、
    AB
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、感谢您的回答、
    解释的很好、传感器的螺纹是否仍然正常工作?
    可以帮助我更正我的代码吗? 因为我不知道如何实现您刚才谈到的任务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这里有许多示例: dev.ti.com/.../ 显示了如何使用任务等

    若要了解基本原理、请观看链接到的视频:
    processors.wiki.ti.com/.../TI-RTOS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、感谢您的回答、
    解释的很好、传感器的螺纹是否仍然正常工作?
    可以帮助我更正我的代码吗? 因为我不知道如何实现您刚才谈到的任务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们仅以代码为例进行编写。 您必须使用这些示例作为代码的起点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的请求
    那么为什么要举办论坛呢?