关于tresos Studio(EB)的MCAL配置之ADC

配置框图

首先得看你的芯片有多少ADC的硬件,譬如我用的芯片有2个ADC硬件组,每组27通道。

然后看配置的框图,心里知道大概有些什么可以配置

其他模块同学快速理解部分

首先打开AdcHwUnit,这里有多少个ADC硬件就有多少行。

在每一个ADC硬件里面,ADCChannel有多少个,就用到这个硬件里面多少个通道,硬件通道也标注了了。

在AdcGroup里面,从ADCChannel里面抽取一部分通道或者全部通道组成一个新的组,这个组可以调用接口Adc_ReadGroup来读取整组的ADC值。

这里就能看出,里面值用了pump0和pump3组成这个组。

DMA传输配置

使能宏定义,让DMA相关的静态代码参与编译。

要自己建立一个ADC硬件单元,在里面配置为DMA传输方式。

使能DMA通道,并且选择DMA的源,字节写一个DMA传输完成的函数名称,到时候传输完成之后会自动回调这个函数。

ADC标定配置

勾选这个就能使能对应的接口函数

void Adc_Calibrate(VAR(Adc_HwUnitType, AUTOMATIC) Unit,

P2VAR(Adc_CalibrationStatusType, AUTOMATIC, ADC_APPL_DATA) pStatus);

更改时钟和转换定时设置

勾选这个就能使能对应的接口函数

Std_ReturnType Adc_SetClockMode (VAR(Adc_DualClockModeType, AUTOMATIC)
eClockMode);

驱动程序软件优化

不使用中断组

可以减少CPU的负担,转换结果可以直接在Adc_ReadGroup()里面读取,这个打上勾,下面的改下模式就行。

单次硬件触发优化

勾选这个就行

双buffer中断

这个很少人用,意思就是按照ADC组来产生中断。有两次中断,一次是转换完组内所有通道之后产生一次中断;另一次是可选的,转换完组内一半通道时产生一次中断,也叫做半中断。使用这个功能的前提是所有硬件通道都要变为DMA转换。

访问模式要改成流模式

要开启双buffer中断就勾选第一个,如果使能半中断就勾选第二个,要勾选第二个就要先勾选第一个。

再勾选这个优化代码

为了对组多个通道使用双buffer,我们需要为一个硬件单元使用2个DMA通道,其中组多个通道使用双buffer,通道1用于传输,通道2引发中断。

通道1配置举例

通道2配置举例

设置通道优化

ADC组在配置时固定,如果需要转换一组不同的通道,则必须启动另一个组。然而,停止组并启动另一个组花费的时间太长,可以使用Adc_SetChannel在运行时快速更改组的里面的通道。函数原型为

void Adc_SetChannel( Adc_GroupType Group, Adc_GroupDefType pChannel, 
uint16 pDelays,
uint32 u32Mask,
Adc_ChannelIndexType NumberOfChannel);
因为要配置时间参数,要勾选下面这几个。
使能设置通道的API
使能初始化通知参数

使能初始化通知函数,也叫额外回调函数,每个使用到的ADC组都要设置,这个函数指针将在中断例程开始时被调用,在更新硬件寄存器或ADC组状态之前。

Adc_SetChannel接口函数可以由用户应用程序在需要时调用,Adc驱动程序将检查函数是否被调用,并更新所需的硬件寄存器以匹配新的配置。

单次转换时间

勾选这个,让单次转换时间只在Adc_Init()里面配置一次。

勾选红框里面的两个,再配置蓝框里面的采样时间和时钟分频。

旁路一致性环路

极少用到这个功能,前提条件是ADC组访问模式设置为single。

然后把这个勾上

延迟块

也叫Programmable Delay Block (PDB),

函数

初始化void Adc_Init(const Adc_ConfigType *ConfigPtr);

逆初始化void Adc_DeInit(void);

安装接收转换结果的buffer 
Std_ReturnType Adc_SetupResultBuffer(Adc_GroupType Group,
Adc_ValueGroupType *DataBufferPtr);
ADC通道组使能转换结束通知void Adc_EnableGroupNotification(Adc_GroupType Group);

ADC通道组失能转换结束通知void Adc_DisableGroupNotification(Adc_GroupType Group);

使能硬件触发void Adc_EnableHardwareTrigger(Adc_GroupType Group);

失能硬件触发void Adc_DisableHardwareTrigger(Adc_GroupType Group);

启动ADC通道组的所有通道的转换void Adc_StartGroupConversion(Adc_GroupType Group);

停止ADC通道组的所有通道转换void Adc_StopGroupConversion(Adc_GroupType Group);

获取ADC通道组的转换状态Adc_StatusType Adc_GetGroupStatus(Adc_GroupType Group);

返回存储在结果缓冲区中的每个通道的有效样本数,获取ADC通道组里面最后一轮转换完成的所有组通道的结果,这时候就要结合有效样本数来从结果当中提取出有效数据。

Adc_StreamNumSampleType Adc_GetStreamLastPointer(Adc_GroupType Group,
Adc_ValueGroupType **PtrToSamplePtr);
获取ADC版本号 void Adc_GetVersionInfo(Std_VersionInfoType *versionInfo);

ADC校准void Adc_Calibrate(Adc_HwUnitType Unit, Adc_CalibrationStatusType *pStatus);

函数设置ADC时钟预分频

Std_ReturnType Adc_SetClockMode(Adc_DualClockModeType ClockMode);

动态处理ADC通道组里面的通道

void Adc_SetChannel(const Adc_GroupType Group,
const Adc_GroupDefType *pChannel,
const uint16 *pDelays,
const uint32 u32Mask,
const Adc_ChannelIndexType NumberOfChannel);

读取通道组转换结果

Std_ReturnType Adc_ReadGroup(Adc_GroupType Group,
Adc_ValueGroupType *DataBufferPtr);

General配置

AdcGeneral

Adc_DeInit API生成Adc_DeInit()接口

Adc Development Error Detection 开发错误探测

Adc Enable Limit Check驱动程序中的限制的检查

Adc Queue 启用队列,需要将AdcPriorityImplementation优先级设置为ADC_PRIORITY_HW_SW

Adc Max Queue Depth最大队列深度,最小1,最大1024

Adc_StartStopGroup API生成Adc_StartGroupConversion()开始组转换和Adc_StopGroupConversion()停止组转换接口。

Adc Notification Capability启用组通知机制,也就是转换到一半或者完成的时候调用回调函数。

Adc Hw Trigger API生成Adc_EnableHardwareTrigger()使能硬件触发和Adc_DisableHardwareTrigger()失能硬件触发接口

Adc Priority Mechanism优先级机制,有ADC_PRIORITY_HW、ADC_PRIORITY_HW_SW、ADC_PRIORITY_NONE。

Adc_ReadGroup API生成Adc_ReadGroup() 接口

Adc Result Alignment ADC结果缓冲区中ADC原始结果的对齐,ADC_ALIGN_LEFT或者ADC_ALIGN_RIGHT。

Adc_VersionInfo API 生成Adc_GetVersionInfo()获取版本信息接口

Adc Timeout等待“ADC硬件被禁用到在校准功能中转换完成”过程当中如果超时了,生成错误并且跳过其他步骤。

Adc Low Power States Support硬件提供低功耗状态管理,生成Adc_SetPowerState设置电源状态接口、Adc_GetCurrentPowerState获取当前电源状态接口、Adc_GetTargetPowerState获取目标电源状态接口、Adc_PreparePowerState获取之前的电源状态接口、Adc_Main_PowerTransitionManager电源状态转换管理接口。

Adc Power State Asynch Transition Mode支持异步电源状态转换。

AdcPublishedInformation

只是一些发布信息
Adc Channel Value Signed ADC驱动的结果值是否有符号信息
Adc Group First Channel Fixed ADC通道组的第一个通道是否可以配置,这个是由ADC硬件决定的,得看看规格书。
Adc Max Channel Resolution最大通道分辨率,也就是这么多个通道里面允许最大的精度,1-63。

NonAutosar

Adc Channel Indexes Symbolic Names 生成ADC符号名称,取决于每个ADC通道映射到的ADC组
Adc Enable Calibration API生成Adc_Calibrate()校准接口
Adc Initial Notification Capability使能每个Adc组转换调用通知,在调用 Adc_SetChannel的时候,执行通知回调函数。
Adc Conversion Time Once转换时间寄存器只能在 Adc_Init() 里面一次性设置
Adc Enable Double Buffering Optimization使能双buffer机制优化
Adc Set Clock Mode API 生成接口Adc_SetClockMode ()设置时钟模式
Adc Set Channel API 生成接口 Adc_SetChannel()设置通道
Adc Disable Production Error Reporting失能错误报告给DEM模块
Adc Optimize OneShot HwTrigger Conversions使能硬件触发优化
Adc Global Enable DMA Transfer使能DMA转换功能
Enable Adc User Mode Support 支持用户模式,就会从用户模式开始运行,驱动代码可以在任何时候从管理员模式或者用户模式运行。
Adc Continuous Without Interrupt Uses连续无中断
Double Buffering Config More Than One Channel 允许组与双缓冲启用配置多个通道
Adc Use Hardware Normal Groups 在任何硬件单元或任何变体中使用硬件正常组
Adc Bypass Consistency Loop不用保证一致性的时候后,勾选这个可以提高性能

AdcDemEventParameterRefs

在发生相应的错误的时候,调用dem_reportterrorstatus接口就能够访问到DemEventParameter结构体数组里面的相关信息,根据EventId事件号在DemEventParameter里面查询到DemEventId值。

Adc Timeout Dem Error引用已配置的DEM事件报告“超时失败”,一般用不上。

PublishedInformation配置

CommonPublishedInformation

包含有关供应商和版本的已发布信息,SIP包决定的,不能更改。
ArReleaseMajorVersion发布主版本号
ArReleaseMinorVersion发布次版本号
ArReleaseRevisionVersion修订版本号
ModuleId模块号
SwMajorVersion软件主版本号
SwMinorVersion软件次版本号
SwPatchVersion补丁版本号
VendorApiInfix当一个ECU里面有多个供应商的实例,使用这个来区分不同供应商提供的接口。
VendorId供应商号

AdcInterrupt配置

其实就是一个中断列表

选择每个ADC单元的中断是否将被启用。对于每个Adc硬件单元,有2个中断可以启用:转换结束中断和监视中断。这些设置用于通过删除不需要的中断的中断处理代码来优化代码大小。

Adc Interrupt Name就是中断源,来源于ADC硬件设备,只能根据芯片选择。
Adc Interrupt Enable决定了在不在驱动代码当中加入相关ADC硬件设备的中断相关代码。

AdcHwUnit配置

General

这也是根据ADC硬件来配置的一个列表,多少个ADC硬件就最多有多少行。

Adc Transfer Type数据传输方式,可以选择ADC_DMA或者ADC_INTERRUPT 如果使用DMA,用户不能运行SW和HW组同时在同一个HW单元上,因为两个 AdcHwUnit将使用相同的DMA通道。
Adc Source Clock时钟源,在MCU驱动程序中已经选择了,在这里是只读的。
Adc Hardware Unit指定这个ADC硬件单元关联到哪个ADC硬件上面,ADC0、ADC1……。
Adc Logical Unit Id只是在AdcHwUnit配置列表里面的一个序号,从0开始。
Adc Voltage Reference Selection参考电压源,可以选择VREFH_VREFL根据参考电压引脚输入的电压进行转换或者VALTH_VREFL根据硬件电压进行转换。
Adc Prescaler Value ADC硬件分频值,在时钟里面配置的,在这里是只读。
Adc Resolution采集精度,可以选择BITS_8八位、BITS_10十位或者BITS_12十二位。
Adc Offset Correction Value 偏移值,拿来校正的,写入ADC_OFS寄存器里面,跟转换后的结果值相加,生成加载到ADC_Rn中的最终结果。

AdcChannel

就是一个ADC硬件下的通道列表,根据用途自己起名字。
Adc Logical Channel ID在通道列表的序号
Adc Hardware Channel Id 定义了通道对物理ADC硬件通道的分配
Adc Channel Limit Check使能ADC通道的限制检查
Adc Channel High Limit通道高限值
Adc Channel Low Limit通道低限值
Adc Channel Range Select根据高限值和低限值限制的方法,可以选择ADC_RANGE_ALWAYS独立于通道限制设置、ADC_RANGE_BETWEEN在两个限值之间、ADC_RANGE_NOT_BETWEEN在两个限值之外、ADC_RANGE_NOT_OVER_HIGH不高于高限值、ADC_RANGE_NOT_UNDER_LOW不低于低限值、ADC_RANGE_OVER_HIGH高于高限值或者ADC_RANGE_UNDER_LOW低于低限值。
Adc Channel Conversion Time通道转换时间,时钟周期为单位,这个得硬件支持才有的配置。
Adc High Reference Voltage通道的参考电压源高值,这个得硬件支持才有的配置。
Adc Low Reference Voltage通道的参考电压源低值,这个得硬件支持才有的配置。
Adc Channel Resolution以转换值为单位的通道分辨率,固定为12位,这个不是采集精度,注意区分。
Adc Channel Sampling time 采样时间,对每个通道的值进行采样的时间(以时钟周期为单位),这个得硬件支持才有的配置。

AdcGroup

Adc Group Access Mode ADC组转换结果访问方法,可以选择ADC_ACCESS_MODE_SINGLE单次访问或者ADC_ACCESS_MODE_STREAMING流转换。

Adc Group Conversion Mode组的转换模式,可以选择ADC_CONV_MODE_CONTINUOUS连续转换或者ADC_CONV_MODE_ONESHOT单次转换。

Adc Group Conversion Type组转换类型,可以选择ADC_CONV_TYPE_NORMAL普通类型或者ADC_CONV_TYPE_INJECTED注入类型。

Adc Group Id组号,按照顺序从0开始填写就行

Adc Group Priority组优先级,数字越小优先级越高.

Adc Group Replacement在切换组过程当中被更高级的事情中断,恢复的时候处理方式。可以选择ADC_GROUP_REPL_ABORT_RESTART重启或者ADC_GROUP_REPL_SUSPEND_RESUME从中断的地方继续运行。

Adc Group Trigger Source触发源,ADC_TRIGG_SRC_HW硬件或者ADC_TRIGG_SRC_SW软件

Adc Group Trigger Signal触发信号,ADC_HW_TRIG_FALLING_EDGE上升沿触发或者ADC_HW_TRIG_RISING_EDGE下降沿触发。

Adc Group Trigger Timer触发时间,很少用到,这个得硬件支持才有的配置。

Adc Group Notification转换完成之后的回调函数

Adc Group Extra Notification组的额外回调函数,这个函数将在中断开始时被调用。

Adc Group Streaming Buffer Mode 选择流缓冲区是线性 ADC_STREAM_BUFFER_LINEAR (buffer满后立即停止转换)还是 ADC_STREAM_BUFFER_CIRCULAR环形(到达buffer的末端则环绕)。
Adc Group Enable Double Buffering 使能Adc组转换的双buffer功能​​​​​​​
Adc Group Enable Hafl Interrupt 使能半采样中断功能,也就是采样到一半进行一次中断,要先使能双buffer功能​​​​​​​。
Adc Group Streaming Number Samples 访问模式为流模式的时候,每个通道要获取的ADC值的数量。
Adc Group Without Interrupts失能ADC中断。如果失能中断,转换将在没有软件干预的情况下运行并且不再产生中断,程序只能通过调用Adc_ReadGroup()接口来读取结果,结果缓冲区不再用于读取结果,因为结果将直接从硬件寄存器读取,并且不能使用DMA方式进行数据传输。
Adc Group In Back to Back Mode 使能在Back to Back模式下发生的通道转换,也就是一组ADC里面的各个通道转换按照顺序一个一个执行,如果不勾选,就是一起执行。
Adc Group Uses Channel Delays 通道延时,这个得硬件支持才有的配置。​​​​​​​
下面这两个东西比较难,需要跟其他模块配合使用,后面的文章会提到。
Adc Delay Next PDB
Adc Pdb Period For Continous Mode

AdcGroupNormalConversionTimings

Adc Hardware Average Enable 使能ADC的硬件平均功能
Adc Hardware Average Select ADC平均功能选择,可以选择平均多少次采样结果SAMPLES_4四次、SAMPLES_8八次、SAMPLES_16十六次或者SAMPLES_32三十二次。
Adc Sample Time Duration 选择期望采样时间,范围是2 ~ 256个ADCK时钟周期,写入该寄存器的值是期望采样时间减去1。
Adc Clock Divide Select 时钟分频选择,DIV_NONE不分频、DIV_2二分频、DIV_4四分频或者DIV_8八分频。

AdcGroupDefinition

将硬件ADC下面的各个通道引用过来,重新分组,形成AdcGroup。

​​​​​​​AdcChannelDelay ​​​​​​​

也就是按照通道来延迟,需要硬件支持。

AdcPdbSettings

Adc Pdb Prescaler Divider Select 选择PDB分频,可以选择0-7,分别对应不分频道128分频。
Adc Pdb Multiplication Factor Select for Prescaler选择乘法因子,可以选择0/1/2/3,分别对应1/10/20/40.
PDB Sequence Error Interrupt Enable 使能队列错误中断
PDB Sequence Error Notification使能队列错误通知
  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值