【TI毫米波雷达笔记】SOC外设中断监听功能(Listen)初始化配置及驱动(以IWR6843AOP为例)
#include <ti/drivers/soc/soc.h>
SOC初始化以后 可以配置监听以配置中断回调来查看当前运行情况:
采用函数SOC_registerSysIntListener
进行配置
注意这个函数只能配置非系统中断 否则运行时报错:
The system interrupt specified in the argument is not handled by the SOC module
系统中断(硬件中断)则需要其他的方式配置
结构体SOC_SysIntListenerCfg
中指定中断类型 回调函数 和 传参
比如chirp有效中断SOC_XWR68XX_MSS_CHIRP_AVAIL_IRQ
表示chirp数据有效时的中断
另外还有一个可用:
表示frame开始时的中断SOC_XWR68XX_MSS_FRAME_START_INT
配置函数:
void Init_Listen(void)
{
int32_t errCode;
SOC_SysIntListenerCfg listenerCfg;
/* Register Chirp Available Listener */
memset ((void*)&listenerCfg, 0, sizeof(SOC_SysIntListenerCfg));
listenerCfg.systemInterrupt = SOC_XWR68XX_MSS_CHIRP_AVAIL_IRQ;
listenerCfg.listenerFxn = MMWave_chirpIntCallback;
listenerCfg.arg = 0;
MMWave_Global_Params.handle.chirpIntHandle = SOC_registerSysIntListener (MMWave_Global_Params.handle.socHandle, &listenerCfg, &errCode);
if (MMWave_Global_Params.handle.chirpIntHandle == NULL)
{
System_printf ("Error: Unable to register the Chirp Available Listener [Error code %d]\n", errCode);
}
/* Register Frame Start Listener */
memset ((void*)&listenerCfg, 0, sizeof(SOC_SysIntListenerCfg));
listenerCfg.systemInterrupt = SOC_XWR68XX_MSS_FRAME_START_INT;
listenerCfg.listenerFxn = MMWave_frameStartIntCallback;
listenerCfg.arg = 0;
MMWave_Global_Params.handle.frameStartIntHandle = SOC_registerSysIntListener (MMWave_Global_Params.handle.socHandle, &listenerCfg, &errCode);
if (MMWave_Global_Params.handle.frameStartIntHandle == NULL)
{
System_printf("Error: Unable to register the Frame start Listener [Error code %d]\n", errCode);
}
另外 亲测发现中断SOC_XWR68XX_MSS_FRAME_START_INT
其实是在每次发送chirps时调用(也就是一帧内会调用很多次)
而中断SOC_XWR68XX_MSS_CHIRP_AVAIL_IRQ
则是每次chirp发送后 数据有效时调用 这两个其实差不多 所以只用一个就可以了
比如中断SOC_XWR68XX_MSS_CHIRP_AVAIL_IRQ
可以在每次数据有效时通过ADCBuf移动数据
static uint8_t chirp_updata_flag=0;
void MMWave_chirpIntCallback(uintptr_t arg)
{
int32_t errCode;
uint8_t channel=0;
uint32_t add=0;
for(channel=0;channel<4;channel++)
{
add = ADCBuf_getChanBufAddr(MMWave_Global_Params.handle.adcbuf_handle,channel,&errCode);
memset(&L3_RAM_Buf[chirp_updata_flag*2048+channel*512],0,512);
memcpy(&L3_RAM_Buf[chirp_updata_flag*2048+channel*512],(void *)add,512);
}
chirp_updata_flag++;
if(chirp_updata_flag==96)
{
chirp_updata_flag=0;
}
}