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.

[参考译文] CC2640:在AuxTimer0上使用高速时钟计时器和ADC

Guru**** 2558250 points
Other Parts Discussed in Thread: CC2640

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/582542/cc2640-using-high-speed-clock-timer-alongside-adc-working-on-auxtimer0

部件号:CC2640

您好,

在我的应用程序中,我将CC2640的ADC与AuxTimer0一起使用。 在e2e输入后,我已使实施正常工作。  

我需要精确地为传感器控制器初始化的开始计时,并且我需要使用高速时钟计时器来实现此目的。 基本上,我得到一个远程命令,在某个时间启动传感器控制器(频闪灯)。 应用程序等待其计时器值超过计数,然后启动传感器控制器。  

我面临的问题是,当ADC独立工作,而基于计时器的strobing机制独立工作时,两者都不工作。 基于计时器的循环机制到位后,传感器控制器在初始化过程中挂起。 我怀疑存在资源冲突,因为ADC和计时器使用同一时钟。

我正在使用TimerA进行实施。

我的问题:

1.我对资源冲突的怀疑是否正确。 我是否可以在AuxTimer0上使用TimerA (或TimerB)沿侧ADC工作。

2.只有在执行SCIF初始化时才需要使用计时器。 是否可以在达到strobing后禁用计时器功能,然后在AuxTimer0上使用ADC。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Goutam:
    1. AUX计时器和GPTIMERA A/B是不同的硬件模块,可以并行运行。
    2.您可以使用TI-RTOS单触发时钟处理程序代替计时器进行超时。

    如何实现ADC辅助计时器触发器? 它是否独立工作? 传感器控制器需要处于激活模式,辅助计时器0才能工作:
    '在退出任务代码块之前,必须停止计时器。 "
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eirik,
    谢谢。 我将尝试你关于一次性时钟处理程序的建议。 在我将前面的计时器功能集成之前,传感器控制器曾与AuxTimer0配合使用。 AuxTimer0在传感器控制器工作室迭代开始时启动,并在结束时停止。
    下面是代码。
    ****
    cfg.BufferSize =缓冲大小;
    u16 n=3;

    compaSelectGpioInput(cfg.pAuxioASensorOutput[n]);
    isrcClamp(cfg.pAuxioASensorOutput[n]);
    //释放ISRC输出
    isrcRelease(cfg.pAuxioASensorOutput[n]);


    //禁用ADC缩放
    adcDisableInputScale();
    //启用ADC
    adcEnableSync(ADC_REF_FIXED,ADC_SAMP_TIME_42P6_US,ADC_TRIGG_AUX_TIMER0);//保持此状态不变

    //对ADC值进行采样和存储

    //探测点脉冲以检查采样率
    adcStartAuxTimer0Trigger (400);


    而(cgcfg.exit ==0){
    U16电流= cfg.ISRCCode;
    U16代码=(当前<<2|0x1;
    //在ISRC引脚上驱动电流
    isrcEnable(code;

    //gpioSetOutput (AUXIO_O_sampling_probe);
    用于(U16 n = 0;n < SENSOR_OUTPUT_CNT;n++){


    u16 p = n;//保持电流传感器计数
    如果(p>2){
    N = p-3;
    }

    //选择ADC输入
    adcSelectGpioInput(cfg.pAuxioASensorOutput[n]);

    n = cfg.head;
    adcReadFifo(output.pSamples[n]);

    utilIncrAndWrap (n,buffer_size;cfg.head);



    //如果启用了警报中断生成
    如果(cfg.alertEnabled ==1){

    //计算当前存储的样本数量
    s16 count = cfg.head - cfg.tail;
    如果(计数< 0){
    count += buffer_size;
    }

    //如果高于配置的阈值...
    如果(count >= cfg.alertThr){

    //生成警报中断
    fwGenQuickAlertInterrupt();
    //禁用进一步生成以避免不必要的中断。 它将被重新启用
    //在处理警报中断后由应用程序执行。
    cfg.alertEnabled = 0;
    }
    }

    n = p;
    }
    //gpioClearOutput (AUXIO_O_sampling_probe);

    }

    //停止ADC触发器并刷新ADC FIFO
    adcStopAuxTimer0Trigger();
    adcFlushfifo();

    //禁用ADC
    adcDisable();

    //禁用ISRC
    isrcDisable();

    **********
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Goutam:
    您正在对当前源执行什么操作?
    您是否连接到与ADC输入相同的引脚?
    如何从应用程序控制任务(初始化+启动传感器控制器任务)?

    BTW:
    1)
    禁用ADC输入的输入缩放。 是否确定输入引脚上的电压不会超过1.49 V? 请参阅设备数据表中的5.1 绝对最大额定值。
    2)
    添加外设共享:
    fwAcquitrePeripheral (peripheral_compa_isrc);
    ...执行代码
    fwReleasePeripheral (peripheral_compa_isrc);
    3)
    不严重,但在启动触发器之前启用ADC引脚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eiric,
    我正在使用电流源在模拟链中为我设置偏压。 它完全位于单独的引脚上,不与ADC引脚共享。 有三个ADC输入引脚是时间多路复用的。

    ADC输入电压保证低于1.3V。 启用输入缩放后,我丢失了很多SNR。

    在我们的应用程序中,我们有两个独立的BLE设备,它们将数据发送到Android设备。 两个设备必须同步时间。 我们在Android设备和单个BLE设备之间运行时间同步协议,以获得每个设备的单独偏移,然后通过抵消两者之间的差分延迟来启动采集。 我们正在使用TimerA生成500 us tick。 这将更新系统时间(重置时从零开始)。 将SystemTime发送到Android设备进行时间同步。
    TimeSynch工作正常,SCIF被要求在正确的时刻进行初始化。 但是,RTOS在SCIF初始化过程中挂起。 我尝试禁用整个TimeSynch机制,然后ADC工作正常。
    我还尝试在完成TimeSynch之后,在SCIF初始化之前禁用TimerA。 它仍然挂起。

    我会使用fwAcquitrePeripheral (peripheral_compa_isrc)和fwReleasePeripheral (peripheral_compa_isrc)并试用,但我不确定系统挂起是否与此相关。 如果我禁用了TimeSynch进程,则这些功能工作正常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    刚刚尝试过fwAcquitrePeripheral (peripheral_compa_isrc)和fwReleasePeripheral (peripheral_compa_isrc),没有任何更改。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Goutam:
    我怀疑您的应用程序中的传感器控制器任务处理是问题所在。 您是否根据SDG中提供的指南在应用程序挂起时尝试过调试:
    software-dl.ti.com/.../ble-debugging.html

    您是否查看过传感器控制器任务控制项目以了解如何控制任务? 例如,您应该只调用一次初始化:
    scifOsalInit();
    scifOsalRegisterCtrlReadyCallback(scCtrlReadyCallback);
    scifOsalRegisterTaskAlertCallback(scTaskAlertCallback);
    scifInit(&scifDriverSetup);
    然后启动/停止任务(scifStartTasksNb/scifStopTasksNbl /scifExecuteTasksOnceNbl等),或者可能重置任务结构(scifResetTaskStruts)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eiric,
    我们在计时器功能中将此问题调试为两个方面。 如果我们禁用这两行,SCIF将不会挂起。

    TimerIntRegister (GPT1_base,timer_a,timerInterrupt);
    TimerIntEnable(GPT1_base, timer_TIMA_timeout);

    timerInterrupt()是一个函数,我们在其中查看当前时间并对SCIF初始化进行闪动。

    我们不想禁用中断功能。 如果存在潜在冲突,请告诉我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们还在SCIF初始化之前尝试禁用中断,但没有帮助。 如果在编译期间删除中断代码,则SCIF将初始化并工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Goutam:
    如何"闪动SCIF初始化"?
    您能告诉我您开始传感器控制器任务的片段吗? 您应该从RTOS任务启动传感器控制器任务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eiric,
    我正在附加代码片段。
    在初始化过程中,我们使用初始化HSTimer函数初始化计时器。

    计时器每500 us就会产生一次嘀嗒信号(中断),全局systemTimeNanosec (复位时的值为0)用于以500 us的增量来维护当前系统时间。

    有一个全局标记"strobeEnabled"(已启用),通常为0,但当从Android设备发送StartAcquisition命令时,该标记设置为1。 StartAcquisition命令将来也会发送Strobedtime。 每500 us运行的timerInterrupt函数将systemTimeNanosec与进行比较
    选通时间,如果systemTimeNanosec >=选通时间,则启动SCIF。

    以下是代码片段。 请注意 initializeHSTimer函数中的#ifdef语句。 如果 禁用#ifdef内的这两行 (#ifdef 0),则代码有效。

    ***********


    #define HS_Clock_tick (50万UL)

    void initizeHSTimer()

    PRCMPowerDomainOn(PRCM_DOMAIN_Periph);
    POWER_setDependency (PowerCC26XX_Periph_GPT1);
    PRCMLoadSet();
    PRCMPeripheralRunEnable(PRCM_Periph_Timer1);
    PRCMLoadSet();



    //打开GPT0和GPIO的Periph功率域和时钟
    POWER_setDependency (PowerCC26XX_Periph_GPT1);
    POWER_setConstraint (PowerCC26XX_SB_Disallow);

    //重新配置期间停止计时器
    TimerDisable (GPT1_base,timer_a);

    TimerConfigure(GPT1_base, timer_CFG_A_Periodic_UP);

    //配置为500us间隔
    TimerLoadSet (GPT1_base,timer_a,2.4万);

    POWER_setConstraint (PowerCC26XX_SB_Disallow);

    #ifdef 1.
    TimerIntRegister (GPT1_base,timer_a,timerInterrupt);
    TimerIntEnable(GPT1_base, timer_TIMA_timeout);
    #endif
    TimerEnable(GPT1_base, timer_a);

    }

    作废计时器中断(作废)

    TimerIntClear (GPT1_base,timer_tima_timeout);//清除此事件标志
    SystemTimeNanosec += hs_clock_tick;

    IF ((systemTimeNanosec >= strobeTimeNanosec)&& strobeEnabled)

    频闪启用=0;
    rc = startAcquisition ();
    }
    }


    静态SCIF_result_T startAcquisition (void)

    SCIF_result_T RC;
    scifTaskData.adcDataLogger.cfg.ISRCCode = ISRCCODE_global_;
    scifTaskData.adcDataLogger.cfg.exit = 0;
    auxilliaryinState = 0;
    auxErrorState = 0;

    Sprintf (UART_BUFFER,"正在初始化SCIF \r\n");
    UART_WRITE (uHandle,UART_BUFFER,strlen (UART_BUFFER));
    初始化SCIF();
    Sprintf (UART_BUFFER,"Initialized SCIF \r\n");
    UART_WRITE (uHandle,UART_BUFFER,strlen (UART_BUFFER));
    buffersize = scifTaskData.adcDataLogger.cfg.BufferSize;
    Sprintf (UART_BUFFER,"BBufferSize =%d\r\n",BufferSize);
    UART_WRITE (uHandle,UART_BUFFER,strlen (UART_BUFFER));

    PIN_setOutputValue (hGpioPin,SW_CNTRL_PIN,auxilliaryinState);
    rc = scifExecuteTasksOnceNbl (BV (SCIF_ADC_DATA_LOGER_TASK_ID));
    返回(RC);
    }


    void初始化SCIF (void)

    scifOsalInit();
    scifOsalRegisterCtrlReadyCallback(scCtrlReadyCallback);
    scifOsalRegisterTaskAlertCallback(scTaskAlertCallback);
    scifInit(&scifDriverSetup);


    adcOffset = AUXADCGetAdjustmentOffset(AUXADC_REF_FIXED);
    adcGainError = AUXADCGetAdjustmentGain (AUXADC_REF_FIXED);

    返回;
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在设备重置后,您只能呼叫此呼叫一次(每次开机之间只能呼叫一次):
    scifOsalInit();
    scifOsalRegisterCtrlReadyCallback(scCtrlReadyCallback);
    scifOsalRegisterTaskAlertCallback(scTaskAlertCallback);
    scifInit(&scifDriverSetup);

    Smeaphores在scifOsalInit()中进行构造,在构造后不能再进行,因为这将导致异常和程序退出。

    请研究传感器控制器工作室中的"任务控制"示例项目,了解如何控制任务。 在该示例项目中,您可以看到任务可以停止和启动,但init只调用一次。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Eiric,

    谢谢。 将更改代码并进行试用。 但是,在这种情况下,尽管体系结构存在缺陷,但只调用一次OsalInit,它会挂起。 我想说的是,如果我们多次尝试重新启动SCIF,当前代码应该会出现问题,但这里即使是在我们第一次启用计时器中断时,也会出现问题。 您是否认为在整个初始化代码中提前提取SCIF初始化有助于解决我们当前的问题。

    Goutam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我不明白这在代码中意味着什么。

    我看到您正在使用直接driverlib调用来设置计时器。 请改用TI-RTOS GPTIMER驱动程序。 您可以看到PWM驱动程序如何使用它。

    您是否设置了两个单独的实现,以验证传感器控制器驱动程序和计时器实现在组合它们之前是否能够单独工作? 在合并前设置不带传感器控制器的GPTIMER,以确保正确使用计时器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Eiric,

    在我将SCIF初始化移至计时器初始化之前后,代码工作正常。 我还会更改计时器实现并使用TI RTOS GPTIMERS调用。 感谢您的支持。