当前位置:网站首页>【AutoSAR 十 IO架构】
【AutoSAR 十 IO架构】
2022-07-29 19:04:00 【民谣唱给爱人听丶】
并非原创!!! 仅仅介绍自己学习的一些知识点,
如有想学习的请移步:AutoSAR入门到精通系列讲解
1 分层
1.1 应用层级
我们一般将Sensor/Actuator SWC单独的划分出来,形成下面这种形式。
使得若是以后硬件上有什么修改,可以很方便的修改我们的代码。
硬件上的传感器和执行器都得到了SWC的抽象,仅仅将应用算法单独列出来封装好,即使之后硬件变更,也只需要修改对应Sensor/ActuatorSWC即可
1.2 传感器信号流
1.3 执行器信号流
1.4 抽象层
2 PORT
配置项:
• IO口的模式选择:GPIO / 功能复用
• IO口的方向:输入 / 输出
• IO口是否允许在运行过程中改变方向:是 / 否
• IO口的初始化电平:高 / 低
• IO口的转换速率
• IO口的是否上拉:是 / 否
• IO口的输入阈值
• IO口的驱动模式:推挽 / 开漏
• IO口的回读支持类型:电平 ,输出寄存器值
3 DIO(数字输入输出)
配置项:
• 用DIO给IO口改名,方便我们后续使用。
• 给Channels分组,将一些功能相近的通道分到一个组中进行统一管理。
4 PWM
配置项:
• 访问的硬件通道
• PWM周期
• PWM占空比
• PWM极性:高 / 低
• PWM空闲状态:高 / 低
• 相移量(Phase Shift)
边缘计数(Edge Count)
• Icu_Init: ICU的初始化函数,这里初始化成了边缘计数模式和双边缘检测
• Icu_EnableEdgeCount: 使能ICU边缘计数,这里之后就开始计数了
• Icu_DisableEdgeCount: 禁止ICU边缘计数,数据不会清零会一直保持
• Icu_GetEdgeNumbers: 获取当前ICU的边缘计数值
• Icu_ResetEdgeCount: 重置ICU计数值
边缘检测(Signal Edge Detection)
• Icu_EnableNotification: 使能通知功能(这里由于没有配置通知函数所以无效)
• Icu_GetInputState: 获取输入状态,获取后状态重置为IDLE
• Icu_SetActivationCondition: 变更激活条件,图中由下边缘变为上边缘
• Icu_DisableNotification: 禁止通知
信号测量(Signal Measurement)
• Icu_StartSignalMeasurement: 开始信号测量函数
• Icu_GetTimeElapsed: 获取时间长度
• Icu_GetDutyCycleValues: 过去pwm的周期和占空比
- 测量信号时长,
- 这里是测量低电平的时长,也可以测量高电平,注意要完整的一个可测量低电平才有效(也就是要满足下降沿和上升沿两个条件)
- 测量周期时长
- 测量pwm占空比
时间戳(Timestamping)
• NotifyInterval(通知间隔)是根据设置的间隔大小进行触发通知,
• Icu_SetActivationCondition: 设置触发条件
• Icu_GetTimestampIndex: 过去当前的时间戳目录,也就是每当周期循环一遍(这里循环一遍是从0x0000->0xFFFF),这里的Index加一
• Icu_StartTimestamp: 激活时间戳功能,在线性Buffer模式下,一旦Buffer满了,就会停止时间戳的记录,需要手动再次激活
线性buffer
循环buffer
我们如果设置了循环Buffer,那么就可以不用在Icu_TimestampNotification_Ch1中调用Icu_StartTimestamp这个函数,那么时间戳功能依然会一直进行下去。相反,如果是线性Buffer,如果不调用的话,就会停止该功能
5 ICU(输入捕获单元)
ICU:Input Capture Unit,输入捕获单元。主要有以下功能:
• 边缘计数
• 边缘检测和通知
• 时间戳
• 信号测量
• 作为唤醒源使用
API
• Icu_Init: ICU的初始化函数,这里初始化成了边缘计数模式和双边缘检测
• Icu_EnableEdgeCount: 使能ICU边缘计数,这里之后就开始计数了
• Icu_DisableEdgeCount: 禁止ICU边缘计数,数据不会清零会一直保持
• Icu_GetEdgeNumbers: 获取当前ICU的边缘计数值
• Icu_ResetEdgeCount: 重置ICU计数值
6 OCU(输出比较单元)
Output Compare Unit,输出比较单元. 使用的较少。
• 开始或停止一个比较过程
• 设置比较阈值
• 使能或禁止通知机制
• 获取计数值
• 改变输出引脚状态
• 触发硬件资源(比如ADC,PWM等)
7 ADC
功能如下:
• 将模拟信号转换为数字信号
• 封装转换信号的访问接口
• 配置不同的模式
• 对转换的一个通知机制
ADC转换组:
- 和IO组一样,ADC也可以分组(ADC Groups),
- 主要就是将某些功能相近ADC channnels划分到某一个组里面(每组包含至少一个通道)。
- 需要注意的是一个组必须是在一个ADC硬件单元内,不能跨硬件单元组成ADC组
转换模式:
- 循环转换: 就是一个组里的通道按顺序进行ADC转换,转换完一遍后接着进行下一遍,除非用户停止该转换,否则会一直循环下去
- 单次转换: 同样一个组里的通道按顺序进行ADC转换,但是转换完该组的所有通道后就直接停止,除非用户再次使能转换
触发模式:
- 硬件触发: 就是经用户的配置,可以通过其他外设来触发ADC开始转换。比如可以设置一个周期定时器,通过定时器的中断触发ADC,或者通过IO口的上升沿触发ADC。
- 软件触发:一般我们使用的话,都是用的软件触发API函数,直接写上这句话就触发了。
Buffer初始化:
流模式:
我们的ADC可以存放多个时刻的采样值,并且能共存。
相当于为每个通道申请了一个数组,这个数组能存放多个ADC的采样值
- 循环模式: **当FIFO满了,就从头开始再记录。**比如这里的深度为2,ADC0_0_Ch0第一次就记录进我们的ADC_SW_GRP_RES[0]中,ADC0_0_Ch0第二次就进ADC_SW_GRP_RES[1]里面,然后又是ADC_SW_GRP_RES[0],依次循环
- 线性模式: **当FIFO满了,就不再记录了。**也就是ADC0_0_Ch0记录满了ADC_SW_GRP_RES[0]和ADC_SW_GRP_RES[1]之后就不再记录了
边栏推荐
猜你喜欢
随机推荐
记录一个相当坑爹的WSL局域网访问问题
updatexml, extractvalue and floor error injection principle
【win10系统安装deepin双系统重启进不了win系统解决办法】
树上启发式合并小结
Canal实现Mysql数据增量同步更新至Mysql/Redis
What should I do if the Win11 network is unstable?The solution to frequent disconnection of wifi connection in Win11
答对这3个面试问题,薪资直涨20K
关于高考选志愿
"Additional price" can not exchange for safety, the death of Lexus LM, whose fault is it?
Apifox免费吗?完全免费,不限团队人数,不限功能
Realize the size of an adjustable Switch Switch
MySQL 中的反斜杠 \\,怎么能这么坑?
PromptBERT: Improving BERT Sentence Embeddings with Prompts
嵌入式开发:嵌入式基础——软件错误分类
不堆概念、换个角度聊多线程并发编程
JS实现倒计时代码实例「建议收藏」
小程序使用npm包
欧盟计划斥资百亿欧元补贴,吸引台积电、英特尔、三星等赴欧盟建厂
FPGA设计8位十进制计数器异步/同步模块以及m序列码产生器模块
【PyCharm 常用快捷键】