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: HWA使用问题

Part Number: AWR1843BOOST
Other Parts Discussed in Thread: AWR1843

我是用的是AWR1843 BOOST开发板,我想调用他的HWA功能,我参照的是SDK中driver中的HWA test例程,然后我把他步骤一步步初始化到static void MmwDemo_dssInitTask(UArg arg0, UArg arg1)这个函数中,我选择这个函数的原因是我看到这里初始化了UART,Mailbox等外设,然后我对其做了配置,下面我将附上代码

我的ADC采样点数为64点,然后暂时还没有把数据放进MEM0,我只是做一个测试,我想知道我最后使用HWA_enable函数,这个函数是不是我一调用它他就会开启HWA.而且还有一个问题是不是可以在任何位置调用它,比如我在处理chirp的过程中,把DSP的fft操作换为HWA操作

  • 但是我执行demo之后,发现其并没有输出

  • 请看C:/ti/mmwave_sdk_03_05_00_04/packages/ti/drivers/hwa/docs/doxygen/html/group___h_w_a___d_r_i_v_e_r___e_x_t_e_r_n_a_l___f_u_n_c_t_i_o_n.html里对HWA_enable函数的说明。
    Function to enable the state machine of the HWA. This should be called after paramset and RAM have been programmed.

    是的,调用后会开启HWA。请看下面的user guide。
    1.2 Accelerator Engine – State Machine
    https://www.ti.com/lit/ug/swru526b/swru526b.pdf

  • 问题已解决,是我查看内存太快了,HWA还未处理完成

  • 非常感谢分享解决办法!

  • 您好,在学习了这个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
  • 新问题麻烦另起新帖,方便其他客户参考,谢谢!