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;
}
{
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;
}
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;
}
}
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
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