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.

AWR1843BOOST: DSS端调用HWA失败

Part Number: AWR1843BOOST
Other Parts Discussed in Thread: AWR1843

您好,在学习了这个test例程之后,尝试将代码整合进入我的demo中,我的应用描述如下:

我使用的开发板是AWR1843,我想在chirp处理中调用HWA,然后处理完成把数据传出来。我学习了TI的driver中的HWA的test项目,然后参照该测试项目写了具体的代码。我使用的demo是Level Sense。
我的HWA的adc采样点主要参数如下:
adcSamplePoints 64(我会把64个采样点补0到512点)
HWA的fft点数512
一帧chirp数10个
我的处理思路如下,我首先在初始化程序中把HWA初始化好,然后再初始化一个信号量,这个信号量与HWA关联,一旦HWA的所有参数集处理完事,他就调用代码2中的回调函数触发中断,然后我在chirp处理函数中获得这个中断,然后把数据从HWA的内存中拷贝出来。下面我添加三个附件,把初始化的代码展示,我同时还会附上整体的代码
代码1:HWA初始化
static void MmwDemo_dssInitTask(UArg arg0, UArg arg1)
{
    int32_t             errCode;
    MMWave_InitCfg      initCfg;
    Task_Params         taskParams;
    UART_Params         uartParams;
    Semaphore_Params    semParams;
    SemaphoreP_Params    HWA_semParams;
    Mailbox_Config      mboxCfg;
    Error_Block         eb;

    /* Initialize the UART */
    UART_init();

    /* Initialize the Mailbox */
    Mailbox_init(MAILBOX_TYPE_DSS);

    /*****************************************************************************
     * Open & configure the drivers:
     *****************************************************************************/
    /*  Variables required by HWAXU  */
     HWA_Handle              handle;
     int32_t                 compareCode1, compareCode2;
     uint8_t                 paramsetIdx = 0, pingParamSetIdx = 0;// pongParamSetIdx = 0;



     uint8_t                *srcAddr = (uint8_t*)SOC_HWA_MEM0;
     uint8_t                *dstAddr = (uint8_t*)SOC_HWA_MEM2;
    /* START-Setup the HWA */
     HWA_init();
     handle = HWA_open(0, gMmwDssMCB.socHandle, &errCode);
     if (handle == NULL)
         {
             System_printf("Error: Unable to open the HWA Instance err:%d\n", errCode);
             return;
         }
     HWA_handle=handle;
     paramsetIdx = 0;
     memset(gHWATestParamConfig, 0, sizeof(gHWATestParamConfig));
     gHWATestParamConfig[paramsetIdx].triggerMode = HWA_TRIG_MODE_IMMEDIATE; //立即触发
     gHWATestParamConfig[paramsetIdx].accelMode = HWA_ACCELMODE_FFT; //dummy
     gHWATestParamConfig[paramsetIdx].source.srcAddr = (uint16_t)((uint32_t)srcAddr - SOC_HWA_MEM0);
     gHWATestParamConfig[paramsetIdx].source.srcAcnt = 512-1;
     gHWATestParamConfig[paramsetIdx].source.srcAIdx=4;
     gHWATestParamConfig[paramsetIdx].source.srcBcnt = 1;//一次参数集合执行的次数-1
     gHWATestParamConfig[paramsetIdx].source.srcShift = 0; //no shift
     gHWATestParamConfig[paramsetIdx].source.srcCircShiftWrap = 0; //no shift
     gHWATestParamConfig[paramsetIdx].source.srcRealComplex = HWA_SAMPLES_FORMAT_COMPLEX; //complex data
     gHWATestParamConfig[paramsetIdx].source.srcWidth = HWA_SAMPLES_WIDTH_16BIT; //16-bit
     gHWATestParamConfig[paramsetIdx].source.srcSign = HWA_SAMPLES_SIGNED; //signed
     gHWATestParamConfig[paramsetIdx].source.srcConjugate = HWA_FEATURE_BIT_DISABLE; //no conjugate
     gHWATestParamConfig[paramsetIdx].source.srcScale = 8;
     gHWATestParamConfig[paramsetIdx].source.bpmEnable = HWA_FEATURE_BIT_DISABLE; //bpm removal not enabled
     gHWATestParamConfig[paramsetIdx].source.bpmPhase = 0; //dont care
     gHWATestParamConfig[paramsetIdx].dest.dstAddr = (uint16_t)((uint32_t)dstAddr - SOC_HWA_MEM0);
     gHWATestParamConfig[paramsetIdx].dest.dstAcnt = 512 - 1; //this is samples - 1
     gHWATestParamConfig[paramsetIdx].dest.dstAIdx =  4; // 16 bytes
     gHWATestParamConfig[paramsetIdx].dest.dstBIdx = 0; //should be dont care
     gHWATestParamConfig[paramsetIdx].dest.dstRealComplex = HWA_SAMPLES_FORMAT_COMPLEX; //same as input - complex
     gHWATestParamConfig[paramsetIdx].dest.dstWidth = HWA_SAMPLES_WIDTH_16BIT; //same as input - 16 bit
     gHWATestParamConfig[paramsetIdx].dest.dstSign = HWA_SAMPLES_SIGNED; //same as input - signed
     gHWATestParamConfig[paramsetIdx].dest.dstConjugate = HWA_FEATURE_BIT_DISABLE; //no conjugate
     gHWATestParamConfig[paramsetIdx].dest.dstScale = 0;
     gHWATestParamConfig[paramsetIdx].dest.dstSkipInit = 0; // no skipping
     gHWATestParamConfig[paramsetIdx].accelModeArgs.fftMode.fftEn = HWA_FEATURE_BIT_ENABLE;
     gHWATestParamConfig[paramsetIdx].accelModeArgs.fftMode.fftSize = 9;
     gHWATestParamConfig[paramsetIdx].accelModeArgs.fftMode.butterflyScaling = 0x3;
     gHWATestParamConfig[paramsetIdx].accelModeArgs.fftMode.interfZeroOutEn = HWA_FEATURE_BIT_DISABLE; //disabled
     gHWATestParamConfig[paramsetIdx].accelModeArgs.fftMode.magLogEn = HWA_FFT_MODE_MAGNITUDE_LOG2_DISABLED; //disabled
     gHWATestParamConfig[paramsetIdx].accelModeArgs.fftMode.fftOutMode = HWA_FFT_MODE_OUTPUT_DEFAULT; // output FFT samples
     gHWATestParamConfig[paramsetIdx].complexMultiply.mode = HWA_COMPLEX_MULTIPLY_MODE_DISABLE;
     errCode = HWA_configParamSet(handle, paramsetIdx, &gHWATestParamConfig[paramsetIdx], NULL);
      if (errCode != 0)
        {
           System_printf("Error: HWA_configParamSet(%d) (DMA Trigger paramset for ping buffer, AccelMode None) returned %d\n", errCode, paramsetIdx);
           return;
         }
      gCommonConfig.configMask = HWA_COMMONCONFIG_MASK_NUMLOOPS |
      HWA_COMMONCONFIG_MASK_PARAMSTARTIDX |
      HWA_COMMONCONFIG_MASK_PARAMSTOPIDX |
      HWA_COMMONCONFIG_MASK_FFT1DENABLE |
      HWA_COMMONCONFIG_MASK_INTERFERENCETHRESHOLD;
      gCommonConfig.numLoops = 1; //do only one iteration
      gCommonConfig.paramStartIdx = 0;
      gCommonConfig.paramStopIdx = 0;
      gCommonConfig.fftConfig.fft1DEnable = HWA_FEATURE_BIT_DISABLE; //disable this for test vector type of testing so that MEM0/MEM1 are separate memories
      gCommonConfig.fftConfig.interferenceThreshold = 0xFFFFFF;
      errCode = HWA_configCommon(handle, &gCommonConfig);
      if (errCode != 0)
              {
                  System_printf("Error: HWA_enable(1) returned %d\n", errCode);
                  return;
              }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
代码2:信号量初始化
 SemaphoreP_Params_init(&HWA_semParams);
         HWA_semParams.mode             = SemaphoreP_Mode_BINARY;
         doneSem = SemaphoreP_create(0, &HWA_semParams);
         errCode = HWA_enableDoneInterrupt(handle,HWA_Test_DoneISR_Callback,doneSem);
         if (errCode != 0)
         {
             System_printf("Error: HWA_enableDoneInterrupt returned %d\n",errCode);

             return;
         }
中断回调函数:

void HWA_Test_DoneISR_Callback(void * arg)
{
    SemaphoreP_Handle       semHandle;
    gHWATestDoneISR++;

    if (arg!=NULL) {
        semHandle = (SemaphoreP_Handle)arg;
        SemaphoreP_post(semHandle);
    }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
代码3:处理HWA完成
extern SemaphoreP_Handle       doneSem;
extern HWA_Handle HWA_handle;
extern cplx16_t   TestHWAOutput[512*10];
extern cplx16_t   TestHWAInput[512];
 void MmwDemo_processChirp(MmwDemo_DSS_DataPathObj *obj)
{
     int32_t             errCode;
     SemaphoreP_Status       status;
     uint8_t                *srcAddr = (uint8_t*)SOC_HWA_MEM0;
     uint8_t                *dstAddr = (uint8_t*)SOC_HWA_MEM2;


 //    uint8_t                *srcAddr = (uint8_t*)SOC_HWA_MEM0;
 //    uint8_t            *dstAddr = (uint8_t*)SOC_HWA_MEM2;
    /* Kick off DMA to fetch data from ADC buffer for first channel */
    EDMA_startDmaTransfer(obj->edmaHandle[EDMA_INSTANCE_A],
                       MMW_EDMA_CH_1D_IN_PING);

    MmwDemo_dataPathWait1DInputData(obj, 0);

       obj->rangeProcInput->chirpNumber        =    obj->chirpCount;
       obj->rangeProcInput->inputSignal        =    (cplx16_t *)&obj->ADCdataBuf[0];
     memcpy(TestHWAInput, (uint8_t *)obj->rangeProcInput->inputSignal,64*1*4);
     memcpy(srcAddr, (uint8_t *)TestHWAInput,512*1*4);
     errCode = HWA_enable(HWA_handle, 1); // set 1 to enable
                                    if (errCode != 0)
                                        {
                                            System_printf("Error: HWA_enable(1) returned %d\n", errCode);
                                            return;
                                        }
    obj->rangeProcErrorCode = RADARDEMO_highAccuRangeProc_run(
            obj->haRangehandle,
            obj->rangeProcInput,
            obj->rangeProcOutput);
    obj->chirpCount++;
    //TestHWAInput[obj->chirpCount].real=obj->chirpCount;
     status = SemaphoreP_pend(doneSem,BIOS_WAIT_FOREVER);
        if (status == SemaphoreP_OK)
        {
            memcpy(&TestHWAOutput[(obj->chirpCount-1)*512], (uint8_t *)dstAddr,512*1*4);
        }
        HWA_disableDoneInterrupt(HWA_handle);

    if (obj->chirpCount == obj->numChirpsPerFrame)
    {
        obj->chirpCount = 0;
    }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
我使用的代码附件无法暂时无法上传。
我尝试在代码3中加上 HWA_disableDoneInterrupt(HWA_handle);我猜测这个函数是终止CPU中断的,但是我不知道添加它以后是否会有效。
我的consolo报错如下:
[C674X_0] Debug: Logging UART Instance @00816868 has been opened successfully
Debug: DSS Mailbox Handle @0080d490
Debug: MMWDemoDSS create event handle succeeded
Debug: MMWDemoDSS mmWave Control Initialization succeeded
[Cortex_R4_0] **********************************************
Debug: Launching the Millimeter Wave Demo
**********************************************
Debug: MMWDemoMSS Launched the Initialization Task
Debug: MMWDemoMSS mmWave Control Initialization was successful
Debug: CLI is operational
[C674X_0] Debug: MMWDemoDSS ADCBUF Instance(0) @00816850 has been opened successfully
Debug: MMWDemoDSS Data Path init succeeded
Debug: MMWDemoDSS initTask exit
[Cortex_R4_0] numRangeBinZoomIn=2,left=0,right=0
enableRangeLimit=1,skipMin=1.000000,skipMax=3.000000
Debug: MMWDemoMSS Received CLI sensorStart Event
Debug: System Heap (TCM): Size: 65536, Used = 33376, Free = 32160 bytes
Debug: MMWDemoMSS mmWave  config succeeded
[C674X_0] DSS:enableRangeLimit=1,skipMin=1.00,skipMax=3.00,rangeResolution=0.0586,skipLeft=17,skipRight=13
DDR Heap : size 65536 (0x10000), used 8248 (0x2038)
LL2 Heap : size 20480 (0x5000), used 2236 (0x8bc)
LL2 Scratch : size 8192 (0x2000), used 1024 (0x400)
LL1 Scratch : size 16384 (0x4000), used 4096 (0x1000)
HSRAM Heap : size 8192 (0x2000), used 0 (0x0)
{module#8}: "../dss/dss_main.c", line 199: error {id:0x10000, args:[0x8154fc, 0x8154fc]}
xdc.runtime.Error.raise: terminating execution