CC1312R: CC1312R: 大核使用开启ADC并使用后,无线发送总是进Error_policy_D出不来。

Part Number: CC1312R
Other Parts Discussed in Thread: SYSBIOS

sensor定时唤醒大核,大核进行ADC采集,初始化之后,每次唤醒都会open  adc,采集之后close adc,然后使用 RF_EventMask terminationReason = RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTx,RF_PriorityNormal,
echoCallback, (RF_EventCmdDone | RF_EventRxEntryDone |RF_EventLastCmdDone));采集到的数据,但是发送后程序就进入了

void Error_raiseX(Error_Block *eb, int prefix, const char * id, intptr_t a0, intptr_t a1)
{
Error_Block defErr;

if (eb == Error_IGNORE) {
return;
}

if (eb == NULL) {
eb = &defErr;
}

/* Set up the error-block information */
eb->id = id;
eb->a0 = a0;
eb->a1 = a1;

/* call optional hook function if configured */
if (Error_raiseHook_D) {
Error_raiseHookFxn(eb);
}

if (Error_printDetails_D) {
System_printf(prefixStrings[prefix]);
Error_print(eb);
}

if (Error_policy_D == Error_SPIN) {
for(;;) {
}
}
else if (((eb == &defErr) && (Error_policy_D == Error_UNWIND)) || (Error_policy_D == Error_TERMINATE)) {
System_abort("ti_sysbios_runtime_Error_raise: terminating execution\n");
}
}中的if (Error_policy_D == Error_SPIN) {
for(;;) {
}

把ADC初始化屏蔽掉,不适用ADC功能就能够正常唤醒发送,循环往复。adc在采集结束需要额外的特殊处理后才能发送么

  • 感谢您对TI产品的关注!
    已经收到了您的案例,调查需要些时间,感谢您的耐心等待

  • 您好,大概需要多久能找到原因,有点着急,查了很多地方有没有相关说明。是哪里配置有问题么?

  • 已经将您的问题帮您询问了专项工程师,预计下周会得到回复,请您耐心等待。

  • 您好,

    根据您分享的代码、我无法理解客户在做什么。

    代码只显示了它们的错误处理函数、我立即看到的一件事是、在该函数中、如果不应该编译、则在最后一个函数的前面会有中文字母。

    为了帮助您调试请求:

    • 您能否询问客户、他们是否可以分享一个展示如何实施以下功能的基本应用示例?
    大核进行ADC采集,初始化之后,每次唤醒都会open  adc,采集之后close adc,然后使用 RF_EventMask terminationReason = RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTx,RF_PriorityNormal,
    echoCallback, (RF_EventCmdDone | RF_EventRxEntryDone |RF_EventLastCmdDone));采集到的数据,但是发送后程序就进入了
    • 最好的做法是尽量减少除导致错误的功能外的所有功能、以便我们可以对其进行准确调试。

    请告诉我、是否可以从客户那里获得更多详细信息来进一步进行调试。

  • 首先:我个人认为我表达的没有问题,再次为了你那边更清晰的理解我遇到的问题,我详细表达一下我要实现的目的;

    我要用CC1312芯片实现的功能(当某一个引脚直流电压大于某一个值时小核唤醒大核,使用大核ADC采集一个交流量的数据),目前我实现使用小核COMPB检测某一引脚的电压大于某一个值时唤醒大核的功能,为了调试方便,我也分别实现了,定时器(50Hz的模拟量采集10个周波使用定时器和ADC配合),大核ADC采集数据波形的功能,已经验证过波形正常,然后采集完之后大核恢复到休眠状态等待下一次唤醒,但是验证ADC采样时我没有将ADC采集的结果通过无线发送出去;我也单独调试了无线发送功能,调试结果没有异常,小核唤醒大核不做ADC采集只发送一条数据,然后再次进入休眠等待下一次唤醒。

    验证完每一项单独的功能后我把这两项功能合起来同时运行,小核唤醒大核进行ADC采集,将采集的波形计算出来之后通过SUB1G发送出去,发送完成后再次进入休眠状态,等下下一次唤醒。

    我遇到的问题是,小核唤醒大核后,大核进行ADC采样,计算完使用SUB1G吧数据发送出去时,程序死在了一个某一个错误里面,跑不出来也就不会再进入休眠,也就停止了不再运行。死在错误里面的时候,我仿真暂停发现程序停在了这个里面if (Error_policy_D == Error_SPIN) {
    for(;;) {
    }。

    我尝试着找到问题所在,知道我只把ADC功能屏蔽掉时程序包括屏蔽掉ADC初始化,才能正常运行。只把ADC部分程序屏蔽掉保留ADC初始化也是不能正常运行的。

    这是我得全部实现目的,还有我的调试过程。

    还有就是您那边用了两天的时间回了一句看不懂,如果您那边在我提出问题的时候就提出疑问,说不定现在已经把问题解决了

  • 为了更快的解决问题,我将关键代码附上,希望能看明白我得目的,sensor部分程序不再展示,个人认为与sensor(小核)无关

    ADC初始化

    ADC_init();
    ADC_Params_init(&params_adc);

    定时器初始化
    Timer_init();
    Timer_Params_init(&params);
    params.period = 625;//20/32毫秒
    params.periodUnits = Timer_PERIOD_US;
    params.timerMode = Timer_CONTINUOUS_CALLBACK;
    params.timerCallback = timerCallback;
    timer0 = Timer_open(CONFIG_TIMER_0, &params);

    adc_i=0;

    senser小核初始化
    sensor_controller_init(COLLECT_TIMER);
    Semaphore_pend(Semaphore_handle(&semScTaskAlert), BIOS_WAIT_FOREVER);

    while(1)

    {

    计算ADC采集到的数据然后发出

    txFunctionUpdate();

    发送完成之后进入休眠
    if(adc_i>ADC_SAMPLE_COUNT)
    {
       adc_i=0;
       /* Power down the radio */
       //RF_yield(rfHandle);
       scifAckAlertEvents();
        Semaphore_pend(Semaphore_handle(&semScTaskAlert), BIOS_WAIT_FOREVER);
    }

    }

    通过定时器采集,实现对50Hz得交流波形采集,每个周期采集32个点,采集10个周期的波形,然后停止定时器,关掉ADC

    void timerCallback(Timer_Handle myHandle, int_fast16_t status)
    {
    int_fast16_t res;
    res = ADC_convert(adc, &adcValue[adc_i]);
    if (res == ADC_STATUS_SUCCESS)
    {
    adcValueMicroVolt[adc_i] = (COMPENSATION_FACTOR * (ADC_convertToMicroVolts(adc, adcValue[adc_i]))) / 1000;
    }
    if(++adc_i>=ADC_SAMPLE_COUNT)
    {
    ADC_close(adc);
    Timer_stop(timer0);
    txFunctionUpdate();
    }
    }

    计算数据然后发送的代码

    void txFunctionUpdate(void)
    {
    double adc_Cail=0.0;
    uint16_t BatteryState=0;
    if(scifTaskData.temSensor.output.adcFlag)
    {
    scifTaskData.temSensor.output.adcFlag=0;
    adc = ADC_open(CONFIG_ADC_0, &params_adc);
    if (adc == NULL)
    {
    SysCtrlSystemReset();
    }
    if (Timer_start(timer0) == Timer_STATUS_ERROR)
    {
    /* Failed to start timer */
    // SysCtrlSystemReset();
    }
    }
    if(adc_i==ADC_SAMPLE_COUNT)
    {
    for(uint8_t j=0;j<10;j++)
    {
    adc_Cail=0.0;
    for(uint8_t i=0;i<32;i++)
    {
    adc_Cail+=(double)adcValueMicroVolt[j*32+i]*adcValueMicroVolt[j*32+i];
    }
    U_Value[j]=sqrt(adc_Cail/32);
    }
    adc_i++;
    Switchupdateflag=0;
    /* Call txFunction initialization */
    //txFunctionInit();
    uint32_t U_Val=0;
    for(uint8_t i=0;i<10;i++)
    {
    U_Val+=U_Value[i];
    }
    DataValue.U=(U_Val/10)>>8;
    TxPacket_data.sign_Addr[0]=0xF3;
    TxPacket_data.payload[0] = (uint8_t)(DataValueInit_Value.seqNumber);
    TxPacket_data.payload[1] = (uint8_t)(DataValueInit_Value.seqNumber>>8);
    TxPacket_data.payload[2] = (uint8_t)(DataValueInit_Value.seqNumber>>16);
    TxPacket_data.payload[3] = (uint8_t)(DataValueInit_Value.seqNumber>>24);
    TxPacket_data.payload[4] = (uint8_t)(DataValue.U);
    TxPacket_data.payload[5] = (uint8_t)(DataValue.U>>8);
    TxPacket_data.payload[6] = (uint8_t)(SwitchState+BatteryState);
    TxPacket_data.payload[7] = (uint8_t)(seqNumber);
    TxPacket_data.payload[8] = (uint8_t)(seqNumber>>8);
    seqNumber++;
    SwitchState=0;
    TxPacket_data.len=PAYLOAD_LENGTH;
    memcpy(txBuffer, TxPacket_data.sign_Addr, MAX_ADDR_SIZE);
    memcpy(txBuffer + MAX_ADDR_SIZE, TxPacket_data.payload, TxPacket_data.len);
    RF_cmdPropTx.pktLen = PAYLOAD_LENGTH+MAX_ADDR_SIZE;
    RF_cmdPropTx.pPkt = txBuffer;
    RF_cmdPropTx.startTrigger.triggerType = TRIG_NOW;

    RF_EventMask terminationReason = RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTx,RF_PriorityNormal,
    echoCallback, (RF_EventCmdDone | RF_EventRxEntryDone |RF_EventLastCmdDone));
    RF_yield(rfHandle);//Power down the radio;
    sleep(2);//等待3秒后发送数据;
    }
    }

  • 您好,

    还有就是您那边用了两天的时间回了一句看不懂,如果您那边在我提出问题的时候就提出疑问,说不定现在已经把问题解决了

    您的问题比较特殊我需要帮您询问欧美的产线专家,因为时差关系时间是会有延迟的,如果您的项目进度着急,您可以尝试通过您认为更快捷的方式解决问题。如果您仍然需要我帮您转达,请您耐心等待。请告诉我您是否还需要我的帮助?

  • 为了避免我个人描述不清楚,我使用deepseek对我得问题进行了整理然后我再次核对修改。不知您那边是否能看明白我得问题

    根据您提供的信息,我整理了您的问题描述和调试过程,以便更清晰地理解您遇到的问题:

    ### 1. **功能需求**
    - 使用CC1312芯片实现以下功能:
    - 当某个引脚的直流电压超过设定值时,小核(可能是低功耗核)唤醒大核(主核)。
    - 大核唤醒后,使用ADC采集一个交流信号的数据。
    - 采集完成后,大核将数据通过SUB1G无线发送出去,然后再次进入休眠状态,等待下一次唤醒。

    ### 2. **已实现的功能**
    -1**小核COMPB检测**:小核能够检测某个引脚的电压,并在电压超过设定值时成功唤醒大核。
    - 2**定时器和ADC配合**:实现了50Hz模拟信号的采集(10个周波),并使用定时器和ADC配合采集波形,验证波形正常。大核在完成ADC采集后能够正常进入休眠状态,等待下一次唤醒。
    - 3**无线发送功能**:单独调试了无线发送功能,验证了无线发送功能正常(小核唤醒大核后,大核发送一条数据并再次进入休眠)该过程没有加入ADC啊功能。

    ### 3. **问题描述**
    - 当将ADC采集和无线发送功能结合起来时,程序在发送数据时卡死在某个错误中,无法继续运行。
    - 通过仿真器暂停程序后,发现程序停在以下代码段:
    ```c
    if (Error_policy_D == Error_SPIN) {
    for(;;) {
    }
    }
    ```
    - 经过调试,发现只有当ADC功能完全屏蔽(包括ADC初始化)时,程序才能正常运行。如果仅屏蔽ADC采集部分,保留ADC初始化,程序仍然无法正常运行。

    ### 4. **调试过程**
    - 单独调试了ADC采集和无线发送功能,两者均能正常工作。
    - 将两者结合后,程序在发送数据时卡死。
    - 通过仿真器定位到程序卡死在错误处理循环中。

    希望这些整理能帮助您更好理解问题。如果还有其他疑问或需要进一步的描述,请随时提出。

  • 已经帮您传达给产线专家,请耐心等待产线专家的回复。

  • 我认为已经翻遍了您那边的大量的文献,如果还有其他办法,我是不会吧希望寄托在您这边的。

  • 您好,

    感谢您发送所有细节。

    我认为这里的问题在于如何访问传感器控制器数据结构。 以及如何清除传感器控制器警报。

    我们介绍了如何在 SimpleLink Academy 中将传感器控制器与 Sensor Controller Studio 配合使用、该视频将向您展示如何设置 ADC 窗口监控器: https://dev.ti.com/tirex/explore/node?node=A__AUC-XrZ8GGESU4pZ9CzTRQ__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST 在您的情况下,您想做同样的事情,只是您只关心高阈值。 

    当您使用 SensorController Studio 按照说明生成示例时、您将使用 Sensor Controller Studio 配置 ADC 读数、然后它会生成传感器控制器驱动程序。 

    // Task data
    Task_Struct myTask;
    Char myTaskStack[1024];
    
    
    // Semaphore used to wait for Sensor Controller task ALERT event
    static Semaphore_Struct semScTaskAlert;
    
    
    
    
    void scCtrlReadyCallback(void) {
    
    } // scCtrlReadyCallback
    
    
    
    
    void scTaskAlertCallback(void) {
    
        // Wake up the OS task
        Semaphore_post(Semaphore_handle(&semScTaskAlert));
    
    } // scTaskAlertCallback
    
    
    
    
    void taskFxn(UArg a0, UArg a1) {
    
        // Enable LED pins
        GPIO_setConfig(Board_GLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(Board_RLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        // Initialize the Sensor Controller
        scifOsalInit();
        scifOsalRegisterCtrlReadyCallback(scCtrlReadyCallback);
        scifOsalRegisterTaskAlertCallback(scTaskAlertCallback);
        scifInit(&scifDriverSetup);
        scifStartRtcTicksNow(0x00010000 / 8);
    
        // Configure and start the Sensor Controller's ADC window monitor task (not to be confused with OS tasks)
        scifTaskData.adcWindowMonitor.cfg.adcWindowHigh = 800;
        scifTaskData.adcWindowMonitor.cfg.adcWindowLow  = 400;
        scifStartTasksNbl(BV(SCIF_ADC_WINDOW_MONITOR_TASK_ID));
    
        // Main loop
        while (1) {
    
            // Wait for an ALERT callback
            Semaphore_pend(Semaphore_handle(&semScTaskAlert), BIOS_WAIT_FOREVER);
    
            // Clear the ALERT interrupt source
            scifClearAlertIntSource();
    
            // Indicate on LEDs whether the current ADC value is high and/or low
            if (scifTaskData.adcWindowMonitor.output.bvWindowState & SCIF_ADC_WINDOW_MONITOR_BV_ADC_WINDOW_LOW) {
                GPIO_write(Board_GLED, 1);
                GPIO_write(Board_RLED, 0);
            } else {
                GPIO_write(Board_GLED, 0);
    
                GPIO_write(Board_RLED, 1);
            }
            if (scifTaskData.adcWindowMonitor.output.bvWindowState & SCIF_ADC_WINDOW_MONITOR_BV_ADC_WINDOW_HIGH) {
                GPIO_write(Board_RLED, 1);
            } else {
                GPIO_write(Board_RLED, 0);
            }
    
            // Acknowledge the alert event
            scifAckAlertEvents();
        }
    
    } // taskFxn
    
    
    
    
    int main(void) {
        Task_Params taskParams;
    
        // Initialize the board
        Board_initGeneral();
    #ifdef Board_shutDownExtFlash
        Board_shutDownExtFlash();
    #endif
    
        // Configure the OS task
        Task_Params_init(&taskParams);
        taskParams.stack = myTaskStack;
        taskParams.stackSize = sizeof(myTaskStack);
        taskParams.priority = 3;
        Task_construct(&myTask, taskFxn, &taskParams, NULL);
    
        // Create the semaphore used to wait for Sensor Controller ALERT events
        Semaphore_Params semParams;
        Semaphore_Params_init(&semParams);
        semParams.mode = Semaphore_Mode_BINARY;
        Semaphore_construct(&semScTaskAlert, 0, &semParams);
    
        // Start TI-RTOS
        BIOS_start();
        return 0;
    
    } // main

    如果您按照代码执行操作、您会看到、taskFxn 线程首先使用其回调初始化传感器控制器、然后再使用 RTC 计时器。 之后会启动传感器控制器任务、并进入 while 环路。 信号量由传感器控制器警报回调设置(每次计时器耗尽并触发传感器控制器测量时)。 在传感器控制器完成测量后、它会触发 ALERT 回调、此回调会设置 semScTaskAlert 信标并解锁 while 循环。 首先、中断源被清除、然后访问来自测量的传感器控制器 ADC 值。 在 LED 之后被切换(在您的情况下、您要在这里构建您的消息并将其发送)、并且在传感器控制器警报之后被清除。

    您能否按照示例所示、使用 sesor controller studio 配置传感器控制器、然后按照上面 main 程序的逻辑进行操作(与通过链接导入的示例相同)。

  • 感谢您的回复与协助,在次之前我曾把,timer和ADC配合采集的部分程序放在sensor中运行,然后唤醒大核只用来计算和SUB1G发送,运行正常。但是这样有一个缺点,我使用COMPB功能产生中断使程序运行至Event Handler Code中,在这里面进行波形采集,但是这样导致的问题是sensor唤醒大核出现异常,然后我尝试将ADC必行采集放在Execution Code中,但是COMPB中断来了之后程序不能从Event Handler Code不中立刻转到Execution Code中运行,尝试过这两种方案,无法达到我的目的后,选择了目前这种方案,但是没想到又遇到了新的问题。(备注:我程序的关键点在,必须要在中断来了之后立刻对波形进行采集,否则波形就会过去)

    不知这样描述您那边能否理解我所表达目的

  • 为了您更好的理解我得问题,我这边你依然使用deepseek对我说描述进行优化后再次修改保证描述的准确性:

    ### **1. 功能需求** **核心目标**:

    - **实时性要求**:当CC1312的某个引脚电压超过阈值(COMPB中断触发)时,必须**立即**采集交流信号(50Hz波形),否则信号会丢失。

    - **分工设计**: - **小核(Sensor Controller)**:负责低功耗监测,通过COMPB检测电压阈值并触发中断。

    - **大核(Main CPU)**:被唤醒后,负责高精度ADC采集、波形计算和SUB1G无线发送,完成后重新休眠。

    --- ### **2. 已尝试的方案与问题** ####

    **方案1:ADC采集放在Sensor中(小核)**

    - **实现**: - 小核在COMPB中断的`Event Handler Code`中直接启动ADC采集(通过Timer+ADC配合),采集完成后唤醒大核,大核仅进行数据计算和发送。

    - **优点**: - 实时性满足(中断触发后立即采集)。

    - **问题**: - 小核唤醒大核时出现异常(原因可能是资源冲突或唤醒时序问题)。 ####

    ///////////以下为Event Handler Code中的代码

    //ADC
    //將波形采集代码放在此处采集 32个点  50Hz一个周期
    //会导致唤醒大核出现异常
    if(state.SendFlag>5){
    output.adcFlag=1;
    fwGenQuickAlertInterrupt();
    state.SendFlag=0;
    }else{
    state.SendFlag=state.SendFlag+1;
    }

    //timer0Start(TIMER0_MODE_SINGLE, 40000,3);


    // Schedule the next execution
    fwScheduleTask(cfg.threshold);

    ///////////以上为Event Handler Code中的代码

    **方案2:ADC采集放在Execution Code中**

    - **实现**: - COMPB中断仅唤醒大核,在`Execution Code`中启动ADC采集。

    - **问题**: - **实时性不足**:从中断触后程序无法立刻从Event Handler Code运行到Execution Code`中,导致无法立刻启动ADC采集。无法达到中断来后立刻采集的目的。

    //以下为Execution Code`中的代码

    //ADC
    //將波形采集代码放在此处采集 32个点  50Hz一个周期
    //COPB中断来了之后如何立刻运行到Execution Code中,没有找到方法
    if(state.SendFlag>5){
    output.adcFlag=1;
    fwGenQuickAlertInterrupt();
    state.SendFlag=0;
    }else{
    state.SendFlag=state.SendFlag+1;
    }

    //timer0Start(TIMER0_MODE_SINGLE, 40000,3);


    // Schedule the next execution
    fwScheduleTask(cfg.threshold);

    //以上为Execution Code`中的代码

  • 目前我对您的回复的理解是:将adc采集部分程序,转移到sensor中,能够达到同样的采集目的,避免大核ADC和SUB1G同时运行,避免我所遇到的问题,该方案我再次之前尝试过,遇到过问题,导致我想要使用目前这个办法实现我的目的,对于之前的方案我在上面给您做出了描述,烦请指出问题所在

  • 已经帮您传达给产线专家,请耐心等待产线专家的回复。

  • 您好,

    转发专项工程师的回复,

    由于无法运行、我很难看到此代码中存在的问题。

    如果我正确理解了您的理解、那么使用传感器控制器进行的测量就可以满足您的所有要求、并且您开始通过主 MCU 的应用程序读取 ADC、因为您遇到了传感器控制器问题。

    在这种情况下、我建议您按照此处的说明生成一个工作传感器控制器示例:https://dev.ti.com/tirex/explore/node?node=A__AUC-XrZ8GGESU4pZ9CzTRQ__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST

    之后、您需要按照中的说明将传感器控制器驱动程序包含在您的应用中、并初始化传感器控制器任务、如中所示:

    // Initialize the Sensor Controller
    scifOsalInit();
    scifOsalRegisterCtrlReadyCallback(scCtrlReadyCallback);
    scifOsalRegisterTaskAlertCallback(scTaskAlertCallback);
    scifInit(&scifDriverSetup);
    scifStartRtcTicksNow(0x00010000 / 8); // read the adc 8 times per second

    // Configure and start the Sensor Controller's ADC window monitor task (not to be confused with OS tasks)
    scifTaskData.adcWindowMonitor.cfg.adcWindowHigh = 800;
    scifTaskData.adcWindowMonitor.cfg.adcWindowLow = 400;
    scifStartTasksNbl(BV(SCIF_ADC_WINDOW_MONITOR_TASK_ID));

    如果按照此示例、读取 ADC 将由 RTC 计时器每秒触发8次。 您可以在执行代码中随 Sensor Controller Studio 更改、即只有在满足特定级别或任何其他条件时才会触发回调。 (如果您在 Sensor Controller Studio 中进行更改、需要将新生成的驱动程序导入到项目中)

    您可以从主 MCU 读取回调中的测量数据并确认传感器控制器事件。 最佳方法是在回调中设置一个标志、以触发所有其他后续处理、主 MCU 的消息发送、该发送需要在传感器控制器回调之外完成。


    我认为您最初使用此方法时面临的问题与缺少传感器控制器事件确认或类似问题有关。

    请从我们提供的工作示例之一开始、因为这使以后的调试更容易、而且更容易实现、因为您可以在示例中看到具体的完成方式。

  • 首先感谢您的回复,我个人以及我的同事,对您这段话仔细研读并分析;

    我们对您这段话的理解是,将ADC部分程序放在 Sensor Controller Studio 中,把采集任务放在传感器控制器(Sensor)中,由 RTC 计时器每秒触发8次进行采集(每秒8次采集可以改成我需要的频率),然后再根据我得唤醒主MCU条件,唤醒主MCU进行另外的操作(运算、SUB1G发送等)。

    首先解释一下,ADC采样波形不是无时无刻都存在,定时采样无法达到采样目的,我需要的波形数据不是有规律或者一直存在的,这个波形是以个偶然出现的,我会根据波形的到来使用硬件转换成一个两个信号,一个信号用来产生中断,用来提醒波形已经到来,另一个信号用来ADC采样分析的。如果安装固定的频率去ADC采集,我们无法得到想要的波形,我们必须中断到来之后立刻进行采集才能打到我们的目的。

    如果我理解的没有问题那么这样我也是没有办法实现的。

    再次,您这边一直在回避主MCU中实现TIMER+ADC   和SUB1G发送两个功能能导致程序死机问题,是这个方案是无解么?

    如果上面这段话很难理解下面是我问题的关键希望能够帮助理解:

    关键问题分析

    1. 信号特性‌:目标波形为‌非周期性突发信号‌,无法通过固定频率采样捕捉。
    2. 触发机制‌:需依赖硬件信号实现‌事件驱动型采集‌(而非定时轮询),确保信号到来时立即响应。

  • 已经帮您传达给产线专家,请耐心等待产线专家的回复。

  • 您好,

    感谢您的补充说明。

    我还有一个问题:在测量波形后、您需要始终发送一条消息吗?

    我试着在下面非常清楚地说明你可以实施它的选择。 选项1仅在每次测量波形后不需要发送消息时才有意义。

    选项1:

    如果您只需要在波形高于特定阈值时发送消息、则可以使用传感器控制器来节省电力、因为如果需要发送射频消息、只需要唤醒主 MCU。

    1,使用指示波形正在到达的 GPIO 唤醒传感器控制器: https://dev.ti.com/tirex/explore/node?node=A__AELYQDJk05V9HD6.72FWyw__simplelink-devtools__FUz-xrs__LATEST
    2,使用传感器控制器 ADC 测量波形: https://software-dl.ti.com/lprf/sensor_controller_studio/docs/cc13x2_cc26x2_help/html/adc__1.html?highlight=adc#
    3,使用传感器控制器评估波形测量值、如果高于定义的阈值、则使用传感器控制器中断唤醒主 MCU
     a,初始化传感器控制器并在传感器控制器中断时挂起: https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1045315/cc1310-waking-up-the-cpu-using-the-sensor-controller 
     b,当测得波形且评估结果波形高于阈值时、从传感器控制器触发中断
     c,通过主 MCU 从传感器控制器访问测量数据。 构建并发送数据包。 (prop RF示例)
    如果每次测量后不需要发送消息、该解决方案可节省功耗、因为主 MCU 可以保持睡眠状态。

    选项2:

    每次测量后都需要发送消息。 在这种情况下、您可以直接在主 MCU 上实现所有功能、不使用传感器控制器。

    1,使用指示波形正在到达的 GPIO 唤醒主 MCU:https://dev.ti.com/tirex/explore/node?node=A__AEWw-AI7MR5Ydfq2VaeM8g__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK__BSEc4rl__LATEST
    2,使用 ADC 测量波形:https://dev.ti.com/tirex/explore/node?node=A__ACP8n-eEUUnynk7pLMwchA__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK__BSEc4rl__LATEST
    3,将测量数据打包在消息中并将其与prop RF一起发送 https://dev.ti.com/tirex/explore/node?node=A__AH0JEUXzHv9EUrb4aLfZ.g__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK_PROPRF_MODULE__BSEc4rl__LATEST 

  • 我还有一个问题:在测量波形后、您需要始终发送一条消息吗?

    是的,采集完成之后我需要立刻发送一条数据,把采集到的数用SUB1G发送出去,发送完成住MCU就再次进入休眠状态,等待下一次被唤醒。再次执行同样的操作。采集的目的就是为了发出去。

  • 您这边依然不正面回答利用主MCU+TIMER  采集,然后再发送,全部使用主MCU做这个问题,只用传感器控制器检测中断唤醒。您的一直回复让我不得不怀疑这个问题无法解决,如果您确定这个方案无解,我会考虑其他方案。您一直在引导我一用传感器控制器来做ADC,首先不是我不愿意尝试,我就是因为哪两个方案行不通我才考虑目前这个方案的,再次我也尝试了您的建议,但是问题还是存在的无法达到我的目的

    1. 核心诉求:需要确定"主MCU全权处理数据采集(TIMER+ADC)及通信,仅用传感器控制器作中断唤醒"的技术方案,是否无法实现。如果无法实现我会考虑其他方案
  • 您好,

    是的、它可以解决、您可以按照下面的表达方式来实施:

    核心诉求:需要确定"主MCU全权处理数据采集(TIMER+ADC)及通信,仅用传感器控制器作中断唤醒"的技术方案,是否无法实现。如果无法实现我会考虑其他方案

    请注意、您还可以使用该硬件中断在没有传感器控制器的情况下唤醒"主 MCU"、并且还可以额外运行计时器、而不是像上所述那样复杂地实现。 那么您根本就不需要传感器控制器。 这就是我提到它的原因。

  • 您好,由于此问题将转为线下讨论,此贴关闭。