在项目实际应用中,ADC采样的值没有那么高的实时性要求时,使用中断通知会造成资源的浪费,在不必要使用中断的地方,可以不使用中断的方式来实现。本文主要描述S32K312通过轮询的方式获取ADC采样的结果。
创建一个demo工程,在外设模块中添加组件Adc_Sar_Ip。
Adc_Sar_Ip配置如截图所示。将中断通知的项均填入NULL_PTR。
我使用的PTD4引脚,默认路由的功能是ADC。因此没有做额外的引脚配置。
测试代码main.c:
#include "Mcal.h"
#include "Adc_Sar_Ip.h"
#include "Clock_Ip.h"
volatile int exit_code = 0;
/* User includes */
#include "SEGGER_RTT_Conf.h"
#include "SEGGER_RTT.h"
#define ADC_SAR_USED_CH 43U
/*!
\brief The main function for the project.
\details The startup initialization sequence is the following:
* - startup asm routine
* - main()
*/
int main(void)
{
/* Write your code here */
StatusType status;
Clock_Ip_StatusType clockStatus;
uint8 Index;
volatile uint16 data;
SEGGER_RTT_printf(0, "program start...\n");
clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);
while (clockStatus != CLOCK_IP_SUCCESS)
{
clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);
}
status = (StatusType) Adc_Sar_Ip_Init(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, &AdcHwUnit_0_BOARD_INITPERIPHERALS);
while (status != E_OK);
for(Index = 0; Index <= 5; Index++)
{
status = (StatusType) Adc_Sar_Ip_DoCalibration(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE);
if(status == E_OK)
{
break;
}
}
for(;;)
{
Adc_Sar_Ip_StartConversion(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_CONV_CHAIN_NORMAL);
while(!(Adc_Sar_Ip_GetStatusFlags(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE) & ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN))
{
}
data = Adc_Sar_Ip_GetConvData(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_USED_CH);
Adc_Sar_Ip_ClearStatusFlags(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN);
SEGGER_RTT_printf(0, "data = %d\n", data);
}
for(;;)
{
if(exit_code != 0)
{
break;
}
}
return exit_code;
}
使用ADC相关的API的顺序为:
1)Adc_Sar_Ip_StatusType Adc_Sar_Ip_Init(const uint32 u32Instance,
const Adc_Sar_Ip_ConfigType * const pConfig)
2)Adc_Sar_Ip_StatusType Adc_Sar_Ip_DoCalibration(const uint32 u32Instance)
3)void Adc_Sar_Ip_StartConversion(const uint32 u32Instance,
const Adc_Sar_Ip_ConvChainType pChainType)
4)uint32 Adc_Sar_Ip_GetStatusFlags(const uint32 u32Instance)
5)uint16 Adc_Sar_Ip_GetConvData(const uint32 u32Instance,
const uint32 u32ChnIdx)
6)void Adc_Sar_Ip_ClearStatusFlags(const uint32 u32Instance,
const uint32 u32Mask)
最后,测试的结果