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)

最后,测试的结果

### 关于S32K312 ADC模块的EB(嵌入式Bootloader)配置 对于S32K312微控制器而言,在涉及ADC模块与嵌入式Bootloader(EB)交互时,通常情况下,Bootloader本身并直接处理ADC功能。然而,如果希望在启动过程中利用ADC完成某些特定初始化操作或是自检,则需特别设计Bootloader逻辑来支持这一需求。 #### 设计思路 为了实现带有ADC检测能力的Bootloader,可以考虑以下设计方案: - **阶段一:硬件准备** - 确认所使用的引脚已经正确分配给ADC通道,并且这些引脚处于适合测量的状态。 - **阶段二:软件集成** - 修改现有的Bootloader源码,加入必要的头文件`<adc.h>`以便访问ADC驱动程序接口函数[^1]。 - 初始化ADC外设之前应先调用相应的API设置参数,比如采样时间、分辨率等。 - 编写用于读取ADC转换结果的功能函数,此过程可能涉及到等待标志位或中断服务例程(ISR),具体取决于应用需求。 - **阶段三:测试验证** - 构建并烧录修改后的Bootloader到目标板上。 - 使用调试工具监控ADC采集的数据流,确保其行为符合预期。 ```c // 示例代码片段展示如何初始化和读取ADC值 #include "adc.h" void Adc_Init(void){ /* 设置ADC模式 */ ADC_SetMode(...); /* 启动ADC校准 (如有必要)*/ if (!ADC_StartCalibration()){ while(1); // 错误处理 } } uint16_t ReadAdcValue(uint8_t channel){ uint16_t adcResult; /* 开始单次转换 */ ADC_StartSingleConversion(channel); /* 等待转换结束 */ while(!ADC_GetFlagStatus(ADC_FLAG_EOC)); /* 获取转换结果 */ adcResult = ADC_GetConvertedValue(); return adcResult; } ``` 需要注意的是上述描述并非针对具体的Bootloader框架而是通用指导原则;实际实施细节会依据选用的具体Bootloader版本及其架构有所同。此外,由于当前参考资料并未提及有关S32K312 ADC模块与Bootloader结合使用的实例,因此建议查阅官方文档获取最准确的信息和支持材料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值