AUTOSAR MCAL解析: ADC

14 篇文章 290 订阅

作者:Stephen Du

免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性。

所有文字均是自己码出来的,所有图片均为自己勾画(除部分来源于原始标准)。

复制/转发请注明来源/作者。

欢迎添加微信交流学习。

在这里插入图片描述

AUTOSAR MCAL解析: ADC

1. 知识点概览

可能很多人认为ADC很简单。是的,ADC的工作原理很多人大概了解 ,但再简单的模块在AUTOSAR里面就没听说过简单的。先看看一张图吧,以下是我大概总结的一些ADC模块里面的概念,该图也只是尽量囊括主要概念,并非所有东西都能体现。下图只是列举的知识点,各个知识点之间有牵连,总之并没有你想的那么简单。本文也不会涉及到下图中的所有知识点,但会尽量将重要的知识点给大家讲解清楚。

请添加图片描述

2. Group/Channel/Hardware关系

首先来看看最常见的Group, Channel与硬件实例(HW Instance)/硬件通道之间的关系。

请添加图片描述

如上图所示,Group及Channel是软件层面抽象出来的概念,这里的Channel可以说是逻辑通道,其与硬件通道相对应。但是注意这里的对应并非那么绝对,逻辑通道的0并非只能与硬件的通道0关联,而是可以任意映射,但是每个逻辑通道只能与一个物理通道映射。并且逻辑通道的编号是连续编码的。而硬件通道则不同,不同的芯片上面可能有多个物理单元,每个物理单元下面又有多个通道,这些通道的编号在芯片手册里面通常是以每个物理单元里面重新独立编号的。如上图所示,ADC0和ADC1就是两个物理单元,而他们下面分别由3个通道,其编号都是从0开始编码。下文提到的Channel默认指软件层面的逻辑通道。

  • 任何Channel都必须挂靠到Group下面,上层/API都是操作Group的,不能直接去操作Channel。
  • 每个Group下面可以挂一个或多个Channel,但至少有一个Channel,如上图Group5是空的则不允许。
  • 如果挂了多个Channel,则这些Channel必须属于同一硬件单元。不能跨多个物理单元。如上图Group3是不允许的。
  • 一个Channel可以同时属于多个Group,如上CH0,CH1。但这种情况需要用户自己合理管控转换顺序。否则可能会出现冲突。

部分厂商支持Group里面的Channel可以通过API去部分开启或关闭(但注意该功能为扩展功能,并非标准功能)。

3. 转换及触发模式

AUTOSAR里面,ADC驱动模块支持两种转换模式两种触发模式

首先来看转换模式:一种是One-shot(一次性的),另一种是Continuous(连续性的)。两者有什么区别呢?顾名思义,One-shot在触发后只转换一次,转换结束后就停止,然后将转换结果写入缓冲区中。而Continuous则不同,当用户调用启动转换函数(Adc_StartGroupConversion)后开始采样转换,转换完成后由硬件自动启动下一次转换,一直这样循环,直到你主动调用Adc_StopGroupConversion函数让其停止。前面这两句话看似简单,但其包含的信息却不少。在深入展开讲解前,我们先来看看另一个概念:触发方式。

对应于转换模式的还有触发方式,触发方式大体上分为两类,分别是硬件触发和软件触发。不同厂家的芯片,具体细分的硬件触发方式可能不同。比如NXP的S32K系列芯片,其硬件触发可以是PDB,也可能是BCTU,或者是外部信号触发等。而软件触发实际上就是我们程序里面去调用启动转换函数(Adc_StartGroupConversion)就叫软件触发。

接下来我们深入讲解一下上面所包含的意思。为了便于理解,我总结为下图。

请添加图片描述

如上图所示,软件触发对于两种转换模式都是适用的,而硬件触发只适用于One-shot模式。软件触发这个比较好理解,因为是程序里面去调用一个API。而硬件触发之所以只适用于One-shot模式,这里可以分两个方面来看。首先它并不代表真的只能实现一次采样转换这种需求,如果你想实现连续采样转换也是可以的,硬件触发模式下实现Continuous这样的效果,可以通过对应的触发源来实现。比如前面提到的PDB,很多时候它本身就是和Timer配合使用或者说大部分都是与类似于Timer这样与时间相关的场景下使用,那么这些触发源本身实现周期触发这种功能是很容易的。

换个角度来说,假如硬件触发支持Continuous模式,那么我们想想会发生什么呢?当第一触发后,由于其运行在Continuous模式,其转换完成后会自动启动下一次转换,然后中途你又来硬件触发,岂不是他们会冲突。所以现在你知道为何硬件触发不支持Continuous模式了吧。硬件触发模式,对于ADC硬件来说,它完全听从于这个触发信号,你触发一次就采样转换一次,你什么时候触发我就什么时候开始采样转换,这样就不会冲突,不会乱。这里其实不是很严谨,但为了说明这个功能,我想你应该能明白。不严谨是因为很多芯片可以配置硬件过滤,触发一次,硬件会多次采样(根据你配置)然后进行过滤,最后得到一个过滤后的结果,这完全是硬件层面的,相比软件过滤其性能要高很多,但也由弊端,就是其过滤机制单一。所以这里我们以转换结果为准就可以了,以拿到转换结果为一次,而不管具体采样的过程)。

我们再换个角度来描述上面这几者的关系,One-shot模式同时支持软件触发和硬件触发两种。而Continuous模式只支持软件触发。上面提到了为何不支持另外一种,聪明的你一定会问,那Continuous模式下,如果我频繁调用Adc_StartGroupConversion函数不是一样会冲突么。是的,理论上的确存在这个问题,所以在软件层面,我们由状态机管理,当第一次启动转换还没完成时,你再次调用这个函数,软件层面会忽略,只有当第一次的触发完成转换后,你再调用这个函数软件才会继续响应。

软件触发及硬件触发其对应的API也是不一样。都有相应的函数,这些函数通常都是一对一对的。如下所示,他们的功能也很明确,如函数名所示。就不深入讲解了,参数也很简单。

触发方式启动/使能API停止/关闭API
软件触发Adc_StartGroupConversionAdc_StopGroupConversion
硬件触发Adc_EnableHardwareTriggerAdc_DisableHardwareTrigger

4.Buffer访问模式及类型

你以为上面这些就完了么?如果这样,那也不像我描述那么复杂了。接下来我们继续添加新的功能属性,看完后我相信你不会觉得ADC就是采样转换那么简单了。当然本文的目的就是让你看完后也觉得,ADC也不过如此,都清楚了,那就达到目的了。🐶

除了上面提到的转换模式以及触发方式,其buffer也对应不同的访问方式,并且这几者是紧密相连的。如下图所示:

请添加图片描述

Buffer的访问方式分为Streaming和Single两种。Stream模式又分为Linear(线性模式)和Circular(循环模式)。Single模式相对简单。而Stream模式下的两种访问模式与前文提到的转换模式相匹配又会得到不同的效果。

与Stream模式相关的另一个参数我们不得不提及,那就是采样数(Adc Group Streaming Numbers Samples),这个参数也扮演重要角色。先说简单的Single模式,该模式下采样数只能为1,并且不管你是One-shot模式还是Continuous模式,都转换一次之后就停止,这种配置搭配下两种转换模式没啥区别。

如果你问我,到底他们谁才是老大,到底是转换模式说了算还是Buffer的访问模式说了算,那我只能告诉你,他们不搞霸权,他们讲民主,分不同组合,谁都有话语权。

再来看Streaming下的Linear模式,该情况下,如果采样数配置为1,那么效果和Single是一样的,转换一次就停止。如果采样数大于1,则转换次数等于采样数,当设置的采样数的次数完成后自动停止。

最后一种Circular则是一直循环,不会自动停止,直到你主动调用停止函数。

以上所有情况都需要注意Buffer的大小,如果设置错误,则很容易溢出导致程序异常。如果模式为Streaming(注意包含两种类型),用户需要保证提供的Buffer大小足够容纳所有Channel的大小。Buffer的大小与Channel数量及Streaming的sample数有关。计算方法为。Channel * StreamSampleNum,类型为SizePerChannel允许的最小类型。假如你的ADC转换精度是12Bit的,那么每个通道需要uint16类型的变量存储,也就是SizePerChannel为2Bytes,StreamSampleNum设置为2,某个Group里面你配置了3个Channel,则你定义的Buffer大小为:3*2=6,类型为位宽大于uint16类型的。比如uint16 TestBuffer[6]。

如上所述,Streaming的Buffer可以选择线性的或循环的。每次转换完成后,Buffer会从头覆盖。Buffer的初始化可通过调用Adc_SetupResultBuffer函数实现,每个Group仅需提供一个Buffer即可,注意其大小。

Adc_GetStreamLastPointer参数返回第一个Channel的buffer位置,由于每个Channel的Buffer是按照顺序线性排布的(先放第一个Channel,再挨着放第二个Channel,依次排放),所以用户可以通过前面提到的采样数(Sample number)来计算其他Channel的位置信息。函数返回值代表当前完成了多少次组转换。如果为0,则参数返回对应为NULL。如果等于设置的Sample number,则代表buffer里面的所有值都有效。只有在转换完成后才会返回有效值,如果ADC处于busy或者idle状态,则返回0。

Adc_ReadGroup,第一个参数是你想读取的组的索引号,第二个参数是缓存的指针。

ADC驱动不提供直接去访问硬件转换结果寄存器的API,只提供访问中转Buffer的API(部分厂商会进行扩展)。

5. 其他重要机制

转换类型SW APIHW Event Trigger
One-shotNormal ConversionInjected Conversion(255)
ContinuousNormal ConversionX

Group可以设置优先级,数字越大优先级越高。Injected Conversion 类型优先级需要设置到最高,255。

AUTOSAR: 标准规定可以针对每路Channel配置单独的触发源。但某些厂家的MCAL里面是每个Group配置触发源,需要和芯片功能确认。

  • 47
    点赞
  • 190
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
AUTOSARAutomotive Open System Architecture)是一种用于汽车电子系统开发的开放式系统架构。MCAL(Microcontroller Abstraction Layer)是AUTOSAR架构中的一部分,用于抽象底层微控制器硬件的接口和功能。MCAL提供了一组标准化的API(Application Programming Interface),使上层应用程序可以与不同的微控制器硬件进行交互,而不需要关注底层硬件的细节。 在AUTOSAR MCAL中,Fls_Erase函数用于擦除一个或多个Sectors。它的参数包括起始地址和长度,根据这些信息,函数会计算出需要擦除的Sectors,并一次性擦除它们。需要注意的是,起始地址和长度的计算需要避免误擦,确保擦除的范围正确。 另外,AUTOSAR MCAL中的异步请求任务(如读、写、擦除、比较)是由主函数来执行的。主函数需要周期性地被调用,如果有任务需要处理,则执行相应的任务。而获取任务结果的函数用于获取最近一次任务的结果状态,但只能获取最后一个读任务的结果,无法获取之前的写任务的结果。 总之,AUTOSAR MCAL是一种用于汽车电子系统开发的开放式系统架构,其中的MCAL模块提供了对底层微控制器硬件的抽象和标准化接口。Fls_Erase函数用于擦除Sectors,而异步请求任务的执行和结果获取则由主函数来处理。 #### 引用[.reference_title] - *1* *2* *3* [AUTOSAR MCAL详解:FLS](https://blog.csdn.net/jsls135/article/details/115231597)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值