AutoSar标准下ADC的结果访问(Adc_ReadGroup与Adc_GetStreamLastPointer)的异同

系列文章目录

等待更新中…



前言:

看懂此章,阁下已经跨入炼气期第五层了(滑稽)
在这里插入图片描述

1、什么是ADC的结果访问

在Autosar标准中,我们使用标准函数Adc_GetStreamLastPointer与Adc_ReadGroup对AD转换结果进行取值;那么这二者之间有何异同呢

2、ADC访问模式:

1、1 AdcGroupAccessMode----- ADC的Group的访问模式
在ONE-SHOT的转化模式下:
软件触发只能选择SINGLE-ACCESS(单次访问模式)
硬件触发可以选择SINGLE-ACCEESS 或者 STREAMING-ACCESS(线性流访问模式)

在这里插入图片描述

3、AUTOSAR标准配置案例分析

配置案例:(来源Autosr标准4.2.2;搞autosar的不看标准文档等于少条腿;网上博主写的文章大家也都是基于标准来写的)

3.1 Configuration

在这里插入图片描述
group G1中配置两个通道 CH0,CH1 结果指针指向G1_ResultPtr
group G2中配置1个通道 CH2 结果指针指向G2_ResultPtr
group G3中配置1个通道 CH3 结果指针指向G3_ResultPtr

在这里插入图片描述

group G1配置为STREAMING模式 AdcStreamingNumSamples(采样数)为3
group G2配置为STREAMING模式 AdcStreamingNumSamples(采样数)为2
group G1配置为SINGLE模式 此时AdcStreamingNumSamples(采样数)为1
NOTE: SINGLE模式相当于配置STREAMING模式时,把AdcStreamingNumSamples设置为1;

3.2 图形展示结果指针初始化

具体表现:
根据下图可以看出:
G1设置了采样数为3,所以在result buffer中,对同一个通道CH0有三个结果;
G2设置了采样数为2,所以在result buffer中,对同一个通道CH0有两个结果;
G2设置为了SINGLE模式(即采样数为1),所以在result buffer中,对同一个通道CH0有一个结果;
在这里插入图片描述

3.3 使用Adc_GetStreamLastPointer API访问结果:

在这里插入图片描述
Adc_GetStreamLastPointer(Adc_GroupType Group,Adc_ValueGroupType** Ptr To SamplePtr)

Fuc:返回每个通道的有效样本数量,存储在结果缓冲区中。
读取一个指针,指向组结果缓冲区中的某个位置。通过指针位置,可以访问最后一次完成转换轮的所有组通道的结果;(指向的都是最上层的结果,说明这个result buffer应该是一个栈的结构)

3.4 使用Adc_ReadGroup API访问结果:

在这里插入图片描述

Std_ReturnType Adc_ReadGroup(Adc_GroupType Group,Adc_ValueGroupType* DataBufferPtr)
调用Adc_ReadGroup将结果从结果缓冲区 -复制*到可选的读缓冲区

读取所请求组的最后一轮完成转换的组转换结果,并存储从DataBufferPtr地址开始的通道值。组信道值按信道号升序存储(与配置流访问时结果缓冲区的存储布局相反)。

3、Adc_GetStreamLastPointer与Adc_ReadGroup比较:

共同点:
1、函数都将读取请求组的最新可用转换结果;
2、第一个入参相同,都是GroupID

不同点:

  1. 、结果缓冲区的存储布局相反,Adc_ReadGroup的最新转化结果放在下面;而Adc_GetStreamLastPointer的最新转化结果放在上面;
  2. 、第二个入参不同: Adc_GetStreamLastPointer的第二个参数类型PtrToSamplePtr为二级指针,Adc_ReadGroup的第二个参数DataBufferPtr类型为一级指针;
  3. 、需要的结果缓冲区的大小不同:Adc_GetStreamLastPointer采集的有效值的数量为Group中设置的通道数量×设置的AdcStreamingNumSamples(采样数)
    例如:配置了2个通道,设置的采样数为3;那么结果缓冲区的大小至少要能接收超过六个数据,你设置的数组大小必须大于等于6;
  4. 、返回值不同: Adc_GetStreamLastPointer返回每个通道的有效样本数量,存储在结果缓冲区中。
    Adc_ReadGroup返回E_OK(结果可用,并写入数据缓冲区)、E_NOT_OK(没有可用的结果或发生了开发错误)

4、 运用实例:

Adc_GetStreamLastPointer :

uint32 Sample_Num;
uint16 *ResultPtr;
uint16 Adc_Result_array[16];
uint8 status;

Adc_Init(&Adc_ConfigSet);
status = Adc_SetupResultBuffer(Group_0, Adc_Result_array);
if(status == E_OK)
{
Adc_StartGroupConversion(Group_0);
do
{
Sample_Num = Adc_GetStreamLastPointer(Group_0, &ResultPtr);
}while(Sample_Num == 0);
printf("%d\n", ResultPtr[0]);
}else
{
printf("setup result buffer fail");
}
Adc_StopGroupConversion(Group_0);