S32K312 ADC不使用中断的方式(使用轮询方式)获取结果

在项目实际应用中,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)

最后,测试的结果

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值