大家好、德州仪器团队和社区、 我观察 到 ADCBufCC26XX 驱动程序在单次采样转换的单次触发阻断模式下被使用时、会无限期挂起。 我在下面解释代码执行。 我们非常感谢您为帮助调试这一问题提供的任何见解或建议。 我使用的是1.30.00 SDK (simplelink_cc2640r2_sdk_1_30_00_25)
我将以100Hz 的采样率对两个模拟信号进行采样。 由于 ADCBufCC26XX 不支持 ADCBuf_RECURE_MODE_Continuous 模式下的多通道采样、因此我改用具有 GPTimer2A 的 GPTimerCC26XX 驱动程序来生成100Hz 时钟。 在每个时钟事件中、我都会以单次触发阻断模式执行两次背靠背单次采样 ADC 转换。 两个模拟信号中的每一个。
代码相对简单、遵循以下模式:
静态空 taskFxn (UArg a0、UArg A1){
//...
//此处初始化 ADC 驱动程序
//...
GPTimerCC26XX_Params_init (&timerParams);
timerParams.width = gppt_config_16BIT;
timerParams.mode = gppt_mode_period_up;
timerParams.debugStallMode = gpTimerCC26XX_debug_stal_off;
计时器= gpTimerCC26XX_open (Board_gpTIMEer2A、&timerParams);
if (timer = NULL){
GPTimerCC26XX_CLOSE (定时器);
返回 false;
}
Types_FreqHz freq;
BIOS_getCpuFreq (&freq);
//每10ms 触发
一次 GPTimerCC26XX_Value loadVal = freq.lo / 100 - 1;//479999
GPTimerCC26XX_setTimValue (timer、loadVal);
GPTimerCC26XX_registerInterrupt (timer、loadTimerBack、timerCaller) GPT_INT_TIMEOUT);
GPTimerCC26XX_START (计时器);
ADCBuf_Conversion 阻塞转换;
blockingConversion.arg = NULL;
blockingConversion.adcChannel =(uint32_t) channel;
blockingConversion.sampleBufferTwo = NULL;
blockingConversion.samplesRequestedCount = 1;
while (true){
事件= Event_pend (event、Event_ID_none、SAMPLING_TIMER_Fired_EVT、BIOS_WAIT_FOREVE);
blockingConversion.sampleBuffer = signalA_writePtr;
if (ADCBuf_convert (adcBuf、blockingConversion、1)!= ADCBuf_STATUS_SUCCESS){
返回 false;
}
blockingConversion.sampleBuffer = signalB_writePtr;
if (ADCBuf_convert (adcBuf、blockingConversion、1)!= ADCBuf_STATUS_SUCCESS){
返回 false;
}
}
void timerCallback (GPTimerCC26XX_Handle handle、GPTimerCC26XX_IntMask interruptMask){
EVENT_POST (EVENT、SAMPLING_TIMER_Fired_EVT);
}
执行一段时间后、任务将挂起、等待阻塞的 ADCBuf_convert 调用返回。 调试挂起代码时、我看到 ADCBufCC26XX_hwifxn 会定期执行、但 ADCBufCC26XX_swiFxn 不会执行。 下面是 ADCBuf 驱动程序对象和 BIOS 错误扫描。
您是否看到过我采样方式的任何问题? 为什么会出现这些症状?
-Ray

