






















Application SWC、Sensor SWC、Actuator SWC是什么关系?它们如何利用硬件读取数据、处理数据、执行动作?
下图展示了它们的关系:

from ref. [1]
Application SWC、Sensor SWC、Actuator SWC都是位于应用层,它们通过Port通信,利用RTE层接口访问硬件.
IoHwAb 可在Davinci中申请一个SWC为“I/O - Hardware Abstraction(application layer)”,来作为一个c文件,在其中添加c代码. 也就是当成SWC使用.
MCAL Drivers 是芯片原厂提供的MCU驱动.
AUTOSAR中,I/O ≠ GPIO,而是指DIO(数字输入输出)、PORT、PWM、ICU(Input Compare Unit)、OCU(Output Compoare Unit)、ADC.
EB中配置MCAL,类似于CubeMX中配置MCU、ProcessorExpert中配置MCU,用图形工具配置底层,自动生成C代码.
PORT驱动主要能配置以下功能:
DIO常用于
1)给IO口重命名,如pin33 ➡ LED_RED
2)将一些功能相近的通道分到一个组统一管理
提供常用PWM操作,如:
下图展示了PWM使用方法:

from ref. [2]
ICU(Input Compare Unit,输入比较单元),主要功能:
捕获输入的脉冲信号的边沿.
支持以下API:
下面例子,配置为边沿计数模式,对双边沿都进行计数:

from ref.[2]
检测到对应类型边沿(上升沿、下降沿),会产生一个硬件中断,然后通知上层.
示例1:配置为检测下降沿,但通知函数设为NULL,因此即使能通知EnableNotification,也不会调用上层通知函数

from ref. [2]
示例2:启用通知功能,初始配置为检测下降沿,但在通知函数中修改为检测上升沿

from ref. [2]
示例3:信号测量(signal measurement),测量信号的时间长度,支持低电平时长、高电平时长、周期时长、占空比

from ref. [2]
示例4:时间戳(Timestamping)
1)线性buffer模式
在Bsw层,设置一个数组作为缓存buffer,记录一定连续数量的边沿时间戳
BufferSize,buffer元素个数. 设置BufferPtr size=4,对应4个黄色方块(buffer 4个元素),后面4个是指随着时间变化后的buffer
NotifyInterval,通知间隔. 根据设置的间隔大小进行触发通知,如设置为4,那么bufferPtr[3]存入数据时触发通知
Icu_SetActivationCondition,设置触发条件,如下降沿,即下降沿到来时,写一个时间戳到buffer中
Icu_GetTimestampIndex,当前时间戳目录,每当周期循环一遍(从0x0000->0xFFFF),index+1. 注意不是每写一个时间戳,index加1
Icu_StartTimestamp,激活时间戳功能. 线性buffer模式下,记录的buffer满了,就会停止时间戳的记录,需要手动再次激活

2)循环buffer模式
线性buffer写满后,会停止记录时间戳,需要调用Icu_StartTimestamp重新激活. 而循环buffer则会一直自动记录
注:目前还不确定buffer满后,从头开始记录,还是丢弃最开始记录的时间戳(个人推测是后者)
OCU(Output Compare Unit,输出比较单元),类似于PWM的生成机制,计数器值达到设定阈值时,比较成功,就执行某个指定动作. OCU主要功能:
功能:
分组(ADC Groups):
将某些功能相近ADC Channels划分到某个组里(每组至少1个通道). 一个组必须在一个ADC硬件单元内,不能跨硬件单元组成ADC组
转换模式:
触发模式:
Buffer初始化:
ADC结果最终需要存放到一个buffer数组(用户定义)中,供用户使用. 但如何将设定好的buffer自动存入ADC数据?
可以通过MCAL中的Adc_SetupResultBuffer注册数组
/*
如果我们的ADC0的一个ADC_Group_0 包含5个通道,我们要将结果存入ADC_SW_GRP_RES[5]数组
*/
// 申请数组存放ADC数据
Adc_ValueGroupType ADC_SW_GRP_RES[5];
// 注册指针到ADC0的group 0(AdcGroup0_0)
Adc_SetupResultBuffer(AdcConf_AdcGroup_AdcGroup0_0, ADC_SW_GRP_RES);
Stream模式:
ADC可以存放多个时刻的采样值. 相当于为每个通道申请一个数组,该数组能存放多个ADC值.
例如,假设ADC0包含ADC_Group_0组,其中5个通道,每个通道开启Stream模式,且深度为2. 那么存放结果的ADC_SW_GRP_RES数组需要存放5x2=10个元素
这10个数据的存放如下:

每个通道有个FIFO,每个FIFO深度2. 有2种模式:循环模式、线性模式,都是针对每个FIFO刷新数据的.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。