지금까지는 Task에서 주기적으로 ADC 변환 값을 읽어오는 형태였다.
static void AppTask10ms(void)
{
stTestCnt.u32nuCnt10ms++;
Unit_Mode();
/*ADC Test*/
Driver_Adc0_DataObtain();
Driver_Adc0_ConvStart();
}
그 다음으로는 Interrupt를 사용해 ADC 변환 값을 읽고 Task에서는 변환 요청만 주었다.
static void AppTask10ms(void)
{
stTestCnt.u32nuCnt10ms++;
Unit_Mode();
/*ADC Test*/
//Driver_Adc0_DataObtain();
Driver_Adc0_ConvStart();
}
이번에는 Background Scan 을 이용하여 Task에서 요청도 안하고 ADC 변환값도 Interrupt 발생했을때 읽는 방식으로 해보겠다.
Module 초기화는 그대로다.
/* enable background scan source */
adcGroupConfig.arbiter.requestSlotBackgroundScanEnabled = TRUE;
/* enable background scan */
adcGroupConfig.backgroundScanRequest.autoBackgroundScanEnabled = TRUE;
/* enable all gates in "always" mode (no edge detection) */
adcGroupConfig.backgroundScanRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;
Configuration이 모두 바뀌었다. 전부 Background Scan을 위한 값으로 변경되었다.
/* channel init */
for (chnIx = 0; chnIx < 5; ++chnIx) {
IfxVadc_Adc_initChannelConfig(&adcChannelConfig[chnIx], &g_VadcAutoScan.adcGroup);
adcChannelConfig[chnIx].channelId = (IfxVadc_ChannelId)(chnIx);
adcChannelConfig[chnIx].resultRegister = (IfxVadc_ChannelResult)(chnIx);
adcChannelConfig[chnIx].backgroundChannel = TRUE;
adcChannelConfig[chnIx].resultSrcNr = IfxVadc_SrcNr_group1;
/* initialize the channel*/
IfxVadc_Adc_initChannel(&adcChannel[chnIx], &adcChannelConfig[chnIx]);
/* add to scan */
unsigned channels = ( 1 << adcChannelConfig[chnIx].channelId);
unsigned mask = channels;
IfxVadc_Adc_setBackgroundScan(&g_VadcAutoScan.vadc,&g_VadcAutoScan.adcGroup, channels, mask);
}
adcChannelConfig[chnIx].backgroundChannel = TRUE; 이 추가되었다.
IfxVadc_Adc_setBackgroundScan(&g_VadcAutoScan.vadc,&g_VadcAutoScan.adcGroup, channels, mask); 로 변경되었다.
void Driver_Adc0_ConvStart(void)
{
IfxVadc_Adc_startBackgroundScan(&g_VadcAutoScan.vadc);
}
IfxVadc_Adc_startBackgroundScan 로 변경되었다.
static void AppTask10ms(void)
{
stTestCnt.u32nuCnt10ms++;
Unit_Mode();
}
이제 Task에서는 어떠한 일도 하지않는다.


Potentionmeter를 돌렸을때 잘 변경되는것을 확인할 수 있다.