AUTOSAR ADC驱动详解
目录
- ADC驱动模块概述
- 关键概念定义
- ADC驱动架构
- ADC驱动在AUTOSAR分层架构中的位置
- ADC驱动的主要职责
- ADC驱动配置结构
- 通用配置(AdcGeneral)
- 硬件单元配置(AdcHwUnit)
- 通道配置(AdcChannel)
- 通道组配置(AdcChannelGroup)
- 通道组映射(AdcChannelGroupMapping)
- 电源状态配置(AdcPowerStateConfig)
- ADC通道组状态机
- ADC通道组状态
- 状态转换
- ADC驱动交互流程
- 初始化阶段
- 配置通知阶段
- 软件触发转换阶段
- 转换与中断处理
- 读取结果阶段
- 高优先级中断处理
- 停止转换阶段
- 电源管理阶段
- 总结
1. ADC驱动模块概述
AUTOSAR ADC驱动模块是微控制器抽象层(MCAL)的一部分,负责初始化和控制微控制器内部的模数转换器单元。ADC驱动提供了启动和停止转换的服务,并支持启用/禁用转换触发源,同时提供了通知机制和查询转换状态及结果的功能。
ADC驱动模块工作在所谓的ADC通道上,一个ADC通道将一个模拟输入引脚、必要的ADC电路和转换结果寄存器组合成一个可通过ADC驱动单独控制和访问的实体。
1.1 关键概念定义
- ADC硬件单元:表示包含执行"模数转换"所需所有部件的微控制器输入电子设备。
- ADC通道:表示绑定到一个端口引脚的逻辑ADC实体。多个ADC实体可以映射到同一个端口引脚。
- ADC通道组:链接到同一ADC硬件单元的ADC通道组(例如一个采样保持和一个A/D转换器)。整个组的转换由一个触发源触发。
- ADC结果缓冲区:ADC驱动的用户必须为每个组提供一个缓冲区。如果选择了流式访问模式,此缓冲区可以容纳同一通道组的多个样本。如果选择了单次访问模式,缓冲区中保存每个组通道的一个样本。
- 转换模式:
- 单次模式:在触发后执行一次ADC通道组的转换,结果写入指定的缓冲区。触发可以是软件API调用或硬件事件。
- 连续模式:在软件API调用(启动)后连续执行ADC通道组的转换。转换本身自动运行(由硬件/中断控制)。可以通过软件API调用(停止)停止连续转换。
- 触发源:启动单次转换或连续转换系列的源事件。
- 采样时间:模拟值被采样的时间(例如电容充电)。
- 转换时间:采样的模拟值转换为数字表示的时间。
- 获取时间:采样时间+转换时间。
2. ADC驱动架构
ADC驱动在AUTOSAR分层架构中位于微控制器抽象层(MCAL),它向上提供服务给ECU抽象层,向下控制微控制器的ADC硬件单元。
2.1 ADC驱动在AUTOSAR分层架构中的位置
-
应用层 - 包含应用软件组件(SWC),它们通过RTE层请求ADC相关功能。
- 应用组件可能需要获取模拟传感器数据,如温度、压力、位置等。
-
RTE层 - 运行时环境层,为应用层和基础软件层之间提供标准化接口。
- 通过RTE API,应用无需关心底层细节即可访问ADC功能。
-
BSW层/ECU抽象层 - 包含I/O硬件抽象(IoHwAbs),提供与硬件无关的接口。
- IoHwAbs将模拟输入和ADC通道的映射关系抽象化。
- 向上提供符合AUTOSAR标准的API,向下调用MCAL层的ADC驱动。
-
BSW层/MCAL层 - 包含ADC驱动本身,以及相关的MCU驱动和端口驱动。
- ADC驱动实现针对特定微控制器的ADC初始化和控制。
- 与MCU驱动和端口驱动协作,共同管理ADC硬件资源。
-
硬件层 - 包含ADC硬件单元和微控制器物理资源。
- ADC驱动通过MCAL层的抽象机制控制这些硬件资源。
2.2 ADC驱动的主要职责
- 初始化和控制ADC硬件单元
- 提供ADC通道分组功能
- 支持不同的转换模式(单次/连续)
- 支持不同的触发源(软件/硬件)
- 提供结果访问和通知机制
- 支持电源状态管理
3. ADC驱动配置结构
ADC驱动的配置结构定义了如何设置和使用ADC硬件资源。配置包括通用设置、硬件单元设置、通道设置、通道组设置以及电源管理设置。
3.1 通用配置(AdcGeneral)
通用配置定义了ADC驱动整体的行为和可用功能:
- AdcDeInitApi - 是否支持反初始化API
- AdcDevErrorDetect - 是否支持开发错误检测
- AdcEnableStartStopGroupApi - 是否支持启动/停止通道组转换API
- AdcGroupNotificationSupport - 是否支持通道组通知
- AdcHwTriggerSupport - 是否支持硬件触发
- AdcPrioritySupport - 是否支持通道组优先级机制
- AdcReadGroupApi - 是否支持读取通道组API
- AdcVersionInfoApi - 是否支持版本信息API
这些配置项直接对应SRS_Adc_12307
中描述的基本静态配置。
3.2 硬件单元配置(AdcHwUnit)
硬件单元配置定义了每个ADC硬件单元的基本参数:
- AdcHwUnitId - ADC硬件单元的唯一标识符
- AdcClockSource - ADC时钟源选择
- AdcPrescale - ADC时钟预分频设置
- AdcReferenceVoltage - ADC参考电压源
- AdcResolution - ADC分辨率(8位、10位、12位等)
- AdcResultAlignment - 结果对齐方式(左对齐或右对齐)
根据SRS_Adc_12824
,结果对齐方式可配置为左对齐或右对齐。
3.3 通道配置(AdcChannel)
通道配置定义了每个ADC通道的特性:
- AdcChannelId - 通道标识符
- AdcChannelName - 通道符号名称
- AdcChannelResolution - 通道分辨率
- AdcChannelSamplingTime - 通道采样时间
- AdcChannelConversionTime - 通道转换时间
这些配置项直接对应SRS_Adc_12307
中描述的每个通道的基本静态配置。
3.4 通道组配置(AdcChannelGroup)
通道组配置定义了ADC通道组的行为:
- AdcGroupId - 通道组标识符
- AdcGroupName - 通道组符号名称
- AdcGroupAccessMode - 访问模式(单次/流式)
- AdcGroupConversionMode - 转换模式(单次/连续)
- AdcGroupPriority - 通道组优先级
- AdcGroupTriggSrc - 触发源(软件/硬件)
- AdcNotification - 通知回调函数指针
- AdcStreamingBufferMode - 流式缓冲区模式(线性/循环)
- AdcStreamingNumSamples - 流式采样数量
根据SRS_Adc_12447
,ADC驱动允许将属于同一ADC硬件单元的ADC通道分组到所谓的ADC通道组中。
根据SRS_Adc_12817
,ADC驱动允许为每个ADC通道组静态配置一个触发源。
根据SRS_Adc_12820
,ADC驱动允许为每个通道组配置优先级级别,以便高优先级组可以中断正在进行的低优先级转换。
3.5 通道组映射(AdcChannelGroupMapping)
通道组映射配置定义了通道组中包含的通道:
- AdcChannelIndex - 通道在组中的索引
这实现了SRS_Adc_12818
中描述的功能,允许将一个ADC通道分配给多个ADC通道组。
3.6 电源状态配置(AdcPowerStateConfig)
电源状态配置定义了ADC的电源管理行为:
- AdcPowerStateAsyncTransitionMode - 是否支持异步电源状态转换
- AdcPowerState - 电源状态(全功率/低功率/关闭)
这些配置项实现了SRS_ADC_12826
、SRS_ADC_12827
、SRS_ADC_12828
和SRS_ADC_12829
中描述的电源状态管理功能。
4. ADC通道组状态机
ADC通道组状态机描述了ADC通道组在操作过程中可能的状态和状态转换。
4.1 ADC通道组状态
根据SRS_Adc_12291
,ADC通道组有以下五种状态:
-
未初始化(UNINIT) - ADC驱动未初始化状态,在驱动初始化前的状态。
-
空闲(IDLE) - ADC通道组空闲状态,可以启动新转换或配置通道组。
- 在初始化后进入此状态
- 在转换停止后回到此状态
- 此状态下可以启动新的转换
-
忙(BUSY) - ADC通道组忙状态,表示转换正在进行中。
- 启动转换后进入此状态
- 可能被高优先级组中断
- 转换完成后离开此状态
-
已完成(COMPLETED) - 单次转换已完成状态,结果可以读取。
- 单次转换完成后进入此状态
- 此状态下可以读取最新的转换结果
- 可以从此状态启动新的转换
-
流式已完成(STREAM COMPLETED) - 流式转换已完成状态,所有样本都已存储在缓冲区中。
- 流式转换完成后进入此状态
- 此状态下可以访问采集的所有样本
- 可以从此状态启动新的转换
4.2 状态转换
状态转换描述了ADC通道组如何从一个状态变化到另一个状态:
-
初始化 - 从UNINIT到IDLE:通过
Adc_Init()
函数完成初始化后发生。 -
启动转换 - 从IDLE到BUSY:通过
Adc_StartGroupConversion()
函数启动转换后发生。 -
单次转换完成 - 从BUSY到COMPLETED:单次转换模式下,转换完成后发生。
-
流式转换完成 - 从BUSY到STREAM COMPLETED:流式转换模式下,所有样本转换完成后发生。
-
启动新转换 - 从COMPLETED或STREAM COMPLETED到BUSY:通过
Adc_StartGroupConversion()
函数启动新转换后发生。 -
停止转换 - 从BUSY、COMPLETED或STREAM COMPLETED到IDLE:通过
Adc_StopGroupConversion()
函数停止转换后发生。 -
反初始化 - 从IDLE到UNINIT:通过
Adc_DeInit()
函数反初始化后发生。 -
高优先级中断 - 从BUSY到BUSY:当启用优先级支持时,高优先级组可以中断正在进行的低优先级转换。
这些状态和转换实现了SRS_Adc_12291
中描述的ADC通道组状态查询功能。
5. ADC驱动交互流程
ADC驱动交互流程展示了在ADC转换过程中各个组件之间的交互序列。
5.1 初始化阶段
初始化阶段建立ADC驱动的基本配置:
- 应用调用
Adc_Init(ConfigPtr)
初始化ADC驱动 - ADC驱动配置ADC硬件,包括:
- 配置ADC时钟
- 设置ADC分辨率
- 配置参考电压
- 设置结果对齐方式
这实现了SRS_Adc_12307
中描述的基本静态配置功能。
5.2 配置通知阶段
配置通知阶段设置通道组的通知机制:
- 应用调用
Adc_EnableGroupNotification(Group)
为指定通道组启用通知 - ADC驱动更新内部状态,使该通道组在转换完成时能够触发通知
这实现了SRS_Adc_12318
中描述的启用和禁用通知功能。
5.3 软件触发转换阶段
软件触发转换阶段展示了如何通过软件API启动ADC转换:
- 应用通过IoHwAbs层调用
IoHwAbs_AdcReadGroup()
- IoHwAbs层调用ADC驱动的
Adc_StartGroupConversion(Group)
- ADC驱动启动ADC硬件进行转换
这实现了SRS_Adc_12364
中描述的启动和停止通道组转换功能。
5.4 转换与中断处理
转换与中断处理阶段展示了ADC转换完成后的处理流程:
- ADC硬件完成转换,触发转换完成中断
- ADC驱动处理结果:
- 读取ADC结果寄存器
- 应用结果对齐和掩码(
SRS_Adc_12283
) - 存储到结果缓冲区
- 更新通道组状态
- ADC驱动检查通知状态:
- 如果通知已启用,调用转换完成通知回调函数
- 如果通知已禁用,仅存储结果
这实现了SRS_Adc_12283
中描述的掩码信息位功能和SRS_Adc_12317
中描述的通知功能。
5.5 读取结果阶段
读取结果阶段展示了如何获取ADC转换结果:
- 应用通过IoHwAbs层调用
IoHwAbs_AdcReadChannel()
- IoHwAbs层调用ADC驱动的
Adc_ReadGroup(Group, DataBufferPtr)
- ADC驱动检查通道组状态
- ADC驱动获取最近的转换结果,并返回给上层
这实现了SRS_Adc_12819
中描述的读取最新有效转换结果功能。
5.6 高优先级中断处理
高优先级中断处理阶段展示了优先级机制的工作方式:
- 应用调用
Adc_StartGroupConversion(HighPriorityGroup)
启动高优先级通道组 - ADC驱动检查当前转换状态:
- 如果低优先级转换正在进行,中止当前转换并启动高优先级转换
- 如果没有正在进行的转换,直接启动高优先级转换
这实现了SRS_Adc_12820
中描述的通道组优先级功能。
5.7 停止转换阶段
停止转换阶段展示了如何停止正在进行的转换:
- 应用调用
Adc_StopGroupConversion(Group)
- ADC驱动停止ADC硬件转换
- ADC驱动更新通道组状态为IDLE
这实现了SRS_Adc_12364
中描述的停止通道组转换功能。
5.8 电源管理阶段
电源管理阶段展示了ADC驱动的电源状态管理:
- 应用调用
Adc_SetPowerState(PowerState)
设置ADC电源状态 - ADC驱动配置ADC硬件进入指定的电源状态
- 应用调用
Adc_GetCurrentPowerState(PowerStatePtr)
获取当前电源状态 - ADC驱动返回ADC硬件的当前电源状态
这实现了SRS_ADC_12826
、SRS_ADC_12827
、SRS_ADC_12828
和SRS_ADC_12829
中描述的电源状态管理功能。
6. 总结
AUTOSAR ADC驱动是微控制器抽象层的关键组件,它提供了对微控制器ADC硬件的标准化访问。通过配置结构、状态机和交互流程的设计,ADC驱动实现了以下功能:
- 灵活配置 - 支持多种转换模式、触发源和结果访问方式,满足不同应用场景的需求。
- 状态管理 - 通过明确的状态机设计,确保ADC转换过程的可控性和可预测性。
- 优先级处理 - 通过优先级机制,支持高优先级通道组中断低优先级转换,满足关键应用的实时性要求。
- 电源管理 - 通过电源状态管理,支持不同的功耗模式,优化系统能耗。
- 标准接口 - 提供符合AUTOSAR标准的API,实现软件的可移植性和可重用性。
通过以上设计,ADC驱动能够高效、可靠地管理ADC硬件资源,为上层应用提供稳定、一致的服务。