【Autosar】MCAL - ICU(NXP - S32K14x)

2023-11-11 06:41
文章标签 autosar nxp icu mcal s32k14x

本文主要是介绍【Autosar】MCAL - ICU(NXP - S32K14x),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • MCAL - ICU(NXP - S32K14x)
    • 1. 概述
      • 1.1 FlexTimer模块ICU介绍
        • 1.1.1 输入捕获工作原理
        • 1.1.2 过滤器
        • 1.1.3 双边沿捕获工作原理
    • 2. API
    • 3. 配置介绍
      • 3.1 IcuChannel
        • 3.1.1 General
        • 3.1.2 IcuSignalEdgeDetection
        • 3.1.3 IcuSignalMeasurement
        • 3.1.4 IcuTimestampMeasurement
      • 3.2 IcuFtm
        • 3.2.1 Ftm Modules
        • 3.2.2 IcuFtmChannels
      • 3.3 IcuHwInterruptConfigList
      • 3.4 捕获模式介绍
        • 3.4.1 时间戳
        • 3.4.2 信号测量(ICU_DUTY_CYCLE)
      • 3.5 遗留问题

MCAL - ICU(NXP - S32K14x)

MCAL - 汇总

  • 配置工具:EB Tresos Studio
  • 芯片类型:S32K146

1. 概述

ICU(Input Capture Unit)输入捕获的作用是监测输入信号的边沿跳变,以此来测量输入信号的频率、占空比、高/低电平持续时间。

1.1 FlexTimer模块ICU介绍

1.1.1 输入捕获工作原理

输入捕获模块监测输入信号(channel input),通过边沿监测模块将捕获到的信号与设定的监测边沿(上升沿/下降沿)比较,如果匹配则将当前的FTM Counter值存到Cnv中并且触发中断,此时用户可以读取并记录Cnv值。

例如我设置的是上升沿捕获,FTM时钟频率为1MHz,第一次触发时程序记录Cnv值为1000,第二次触发时记录Cnv值为2000,此时可以计算信号周期period = (2000-1000) * 1000 / 1000000 = 1ms = 1KHz

在这里插入图片描述

捕获边沿可以设置为上边沿/下边沿/双边沿,通过设置ELSB/ELSA来设定。双边沿是触发任意一个都会记录并触发中断,这种情况下可以计算输入信号的占空比。

在这里插入图片描述

1.1.2 过滤器

输入捕获模块配有滤波器(用户开启),输入信号的稳定时间需要满足规定采样时间,才会将信号传给边缘边沿,否则信号将被过滤。过滤器的采样时间如下图所示:

在这里插入图片描述

过滤器的采样时间参考下图:

在这里插入图片描述

1.1.3 双边沿捕获工作原理

Dual Edge Capture Mode - 双边沿捕获 。在这种模式下,只有一路输入,但是有2路通道进行捕获,多了一路通道用于记录数据,可以很方便的监测信号的占空比和周期。例如将通道0配置为上升沿捕获、通道1配置为下降沿捕获,当监测到上升沿时数据记录到C0V中,捕获到下降沿时数据记录到C1V中,我们可以使能通道1的 中断,当通道1中断触发后,可以通过C1V-C0V得到占空比,当再次触发后,利用当前值和历史值去计算周期(NXP处理方式))。
注意此模式只能用于偶数通道:0、2、4、6

在这里插入图片描述

S32K-RM中对配置有一个说明:在双边沿监捕获模式下,通道需要配置为上升沿或下降沿捕获(在此处我并没有看到允许配置为1:1)。当两个通道配置不同,一个上升沿,一个下降沿时,可以监测占空比。当两个通道配置相同时,可以监测周期。

在这里插入图片描述

对于CnV和C(n+1)V的读取,S32K参考手册的Read coherency mechanism中有介绍:注意数据读取的时候要先读取C(n)V再去读取C(n+1)V

在这里插入图片描述

2. API

函数描述
Icu_InitICU模块初始化
Icu_DeInitICU模块恢复至默认状态
Icu_SetActivationCondition设置触发边沿
Icu_EnableNotification使能中断回调
Icu_DisableNotification禁用中断回调
Icu_StartTimestamp开始时间戳模式
Icu_StopTimestamp停止时间戳模式
Icu_GetTimestampIndex获当前时间戳序号
Icu_StartSignalMeasurement开始信号测量
Icu_StopSignalMeasurement停止信号测量
Icu_GetDutyCycleValues获取占空比、周期值

3. 配置介绍

3.1 IcuChannel

3.1.1 General

在这里插入图片描述

IcuHwIP:硬件模块选择

IcuFtmChannelRef:硬件模块选择了FTM,此处就要打开并且选择对应的FTM通道(LPIT/PORT/LPTMR 同理)

IcuDefaultStartEdge:默认开始捕获边沿(例如选择上边沿,那么只有监测到上边沿才会开始测量,配置的是ELSB/ELSA寄存器)

IcuMeasurementMode:测量模式

IcuOverflowNotification:溢出中断回调

3.1.2 IcuSignalEdgeDetection

当测量模式选择ICU_MODE_SIGNAL_EDGE_DETECT的时候需要打开。

在这里插入图片描述

IcuSignalNotification:中断回调

3.1.3 IcuSignalMeasurement

当测量模式选择ICU_MODE_SIGNAL_MEASUREMENT的时候需要打开。

在这里插入图片描述

IcuSignalMeasurementProperty:信号测量方式(占空比、周期、高电平时间、低电平时间)

3.1.4 IcuTimestampMeasurement

当测量模式选择ICU_MODE_TIMESTAMP的时候需要打开。

在这里插入图片描述

IcuTimestampMeasurementProperty:时间戳测量方式(回环、线性)

IcuTimestampNotification:中断回调

3.2 IcuFtm

3.2.1 Ftm Modules

在这里插入图片描述

Ftm Hardware Module:FTM模块选择

ICU FlexTimer Prescaler:FTM时钟分频系数

IcuFlexTimer Clock source:时钟源选择

3.2.2 IcuFtmChannels

在这里插入图片描述

Ftm Channel:FTM通道选择

3.3 IcuHwInterruptConfigList

中断使能配置,根据对应的通道配置选择对应的中断。

在这里插入图片描述

3.4 捕获模式介绍

3.4.1 时间戳

时间戳测量方式:

  1. ICU_CIRCULAR_BUFFER:回环,数据存满后从0开始继续存储
  2. ICU_LINEAR_BUFFER:线性,数据存满后测量停止。
    在这里插入图片描述

时间戳模式下可以设置NotifuInterval参数。此参数的意义在于存储了指定个数的数据后再通知用户,例如我设置NotifuInterval为2,当触发了2次中断 存储了两个数据后,会触发一次回调通知,此时通过Icu_GetTimestampIndex函数可以获取到当前存储位置为2(此处大家可能会有疑问,存储了两个数据后,当前的序号不应该是1吗,由于存储完数据后,Index会先增加1,再去调用回调函数,所以是2),所以每次触发后,获取的index-1才是当前的存储位置。因此这里会存在一个问题,例如上图当第三次触发回调的时候,此时缓存位置是5,但是获取的index由于超出最大缓存范围了,获取到的是0,所以这里需要做过零点处理。

void icu_test_init(void)
{Icu_Init(&Icu_Config);INT_SYS_EnableIRQ(FTM0_Ch0_Ch1_IRQn);Icu_EnableNotification(0);Icu_StartTimestamp(0, icu_buffer, sizeof(icu_buffer) / sizeof(icu_buffer[0]), 2);
}void Icu_channel0_notify(void)
{uint16_t index = 0;index = Icu_GetTimestampIndex(0);if(index == 0 ){index = sizeof(icu_buffer) / sizeof(icu_buffer[0]);return;}index -= 1;if(icu_buffer[index] > icu_buffer[index - 1]){printf("%d%\r\n", (icu_buffer[index] - icu_buffer[index - 1]) * 100 / 10000);}else{printf("%d%\r\n", (65535 - icu_buffer[index - 1]  + icu_buffer[index]) * 100 / 10000);}
}

3.4.2 信号测量(ICU_DUTY_CYCLE)

该模式是通过FTM双边沿捕获模式实现。

NXP对于该测量方式的实现逻辑如下图所示,开始测量时,使能通道n,触发中断保存CnV的值①(注意假设此时捕获的是上升沿),此时重新配置通道(通道n设置为下降沿捕获,通道n+1设置为上升沿捕获)并且关闭通道n中断,打开通道n+1的中断,当通道n+1中断触发后,同时获取Cnv的值②和C(n+1)V的值③,然后通过②-①得到占空比的值,通过③-①得到周期值,然后将③的值更新到历史值中。当通道n+1再次触发的时候是在⑤的位置,重复上述操作。

在这里插入图片描述

void icu_test_init(void)
{Icu_Init(&Icu_Config);INT_SYS_EnableIRQ(FTM0_Ch0_Ch1_IRQn);Icu_EnableNotification(0);Icu_StartSignalMeasurement(0);
}// 此函数在周期任务中调用
void Icu_get_duty_period(void)
{float duty = 0;Icu_DutyCycleType data = {0};Icu_GetDutyCycleValues(0, &data);printf("duty:%f%%  period:%f(ms)\r\n", ((float)data.ActiveTime * 100 / data.PeriodTime),((float)data.PeriodTime * 1000 / 1000000));
}

3.5 遗留问题

从手册中可以看到,在双边沿模式下,两个通道配置的触发边沿应该是相反的,所以在EB中配置为IcuSignalMeasurement模式下,边沿触发应该选择上升沿或下降沿,不应该选择双边沿(个人理解),但是当我选择为双边沿的时候,两个通道的触发方式都是(ELSA:ELSB = 1:1),它还是能够正常工作,且工作现象与(通道n:上升沿触发 / 通道n+1:下降沿触发)相同,所以这里我没有弄明白,在双边沿捕获模式下,双通道都配置为(ELSA:ELSB = 1:1)的情况下,内部是如何工作的?两者对于输入信号的捕获难道不会冲突吗?

在这里插入图片描述

我这里设置的占空比为30%,实际试验现象与上升沿触发一致

在这里插入图片描述


参考资料:

S32K-RM.pdf - NXP

AUTOSAR_MCAL_ICU_UM[1].pdf - NXP

这篇关于【Autosar】MCAL - ICU(NXP - S32K14x)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/388233

相关文章

基于Hypervisor智能驾舱的AUTOSAR解决方案

MENTOR嵌入式管理程序 目前,通常使用两种类型的管理程序(图6): Type 1本机管理程序:一种在硬件上本机运行的管理程序,因为它充当核心中的操作系统。Type 2托管虚拟机监控程序:此类型的虚拟机监控程序必须由另一个操作系统托管,并且仅负责使用主机操作系统可用的资源来虚拟化客户操作系统。 图6:虚拟机管理程序 虚拟化的工作原理是从硬件上运行的应用程序中抽象出物理硬件和设备。虚拟化流程管理

Autosar(Davinci) --- 创建一个S/R类型的port(下)

前言:         前面章节我们讲解了S/R类型的Port如何创建,这一章节,我们着重讲一下生成的代码,以及我们如何添加代码让这些门与灯之间的关系产生连接。 一、CtSaDoor.c 在【Rte.c】的【IO_TASK】中我们可以看到,反复的判断Rte_Ev_Cyclic_IO_Task_0_200ms这个条件是否成立,当200ms到达时,调用RCtSaDoorReadDoor函数,去读

NXP,S32K1XX汽车通用微控制器开发笔记

文章目录 1. 概述2. 开发环境配置2.1 S32 Design Studio2.2 安装SDK2.3 新建demo工程2.4 字体配置2.5 按需求修改demo2.5.1 修改pin脚定义2.5.2 增加串口打印功能 2.6 编译代码2.7 debuger 配置 参考 1. 概述 S32K1系列32位微控制器(MCU)提供基于Arm® Cortex®-M的MCU,以及基

NXP S32DS IDE设置背景护眼色

NXP的S32DS是基于eclipse开发的,因此可以搜eclipse的一些配置,基本上可以设置。

AUTOSAR Adaptive与智能汽车E/E架构发展趋势

AUTOSAR Adaptive是一个面向现代汽车应用需求的标准,特别适用于那些需要高计算能力和灵活性的应用。以下是AUTOSAR Adaptive的典型特性: 高计算能力:AUTOSAR Adaptive支持使用MPU(微处理器),这些处理器的性能与PC或智能手机中的处理器相当。这样的高计算能力是实现半自动驾驶和其他复杂功能所必需的。动态更新和管理:AUTOSAR Adaptive的架构允

LIN协议栈 AUTOSAR架构下 状态管理

一、LIN State Manager 概述 功能 :负责控制 LIN 总线的通信状态,包括切换调度表(仅 LIN 主节点)、处理睡眠和唤醒操作、通知上层新状态等。约束 :每个 ECU 中最多有一个实例;所有关于调度表的操作仅适用于 LIN 主节点;适用于所有使用 LIN 的汽车领域。依赖关系 :依赖于 Communication Manager(ComM)和 LIN Interface(Lin

Autosar OS基础知识导图

Autosar OS基础 概述 Autosar简介 定义 Autosar(汽车开放系统架构)是由汽车制造商,软件供应商及其他相关厂商专为汽车软件合作指定的规范、标准、架构。 目标 建立一个独立于硬件的分层软件架构‌:‌实现高内聚、‌低耦合,‌提高软件的可重用性、‌可扩展性和互操作性。为应用实施提供一套方法论‌:‌包括制定无缝的软件架构堆叠流程,‌并将应用软件无缝整合至ECU中。制定统一的车

AUTOSAR开源OS——Trampoline的编译与使用(一)

环境准备 本人环境 CentOS7 代码下载 GitHub上去clone对应的代码到本地 git clone https://github.com/TrampolineRTOS/trampoline.git 编译goil 进入到如下目录/trampoline/goil/makefile-unix cd /trampoline/goil/makefile-unix 使用如下命令

【MCAL】TC397+EB-tresos之SPI配置实战 - (同步/异步)

本篇文章首先从理论讲起,从AUTOSAR规范以及MCAL手册两个不同角度(前者偏理论,后者偏实践)介绍了SPI模块的背景概念与理论,帮助读者在实际配置之前能有个理论的框架。然后详细的介绍了在TC397平台使用EB tresos对SPI驱动模块进行配置与调试的实战过程,帮助第一次接触这个模块的读者能够更快的上手来实现符合自己项目要求的开发工作,完成SPI通信。文章分别从同步和异步两种方式介绍了配置

AUTOSAR_EXP_ARAComAPI的5章笔记(1)

5.1 High Level API Structure ara::com提供了一个支持AUTOSAR服务模型的API。服务有Method、Event、Filed和Trigger。 Method:在服务应用程序中执行一个可以返回值的函数(如校准方法)。 Event:当特定条件发生时(例如制动事件),服务应用程序发送一个事件(也可能包括一个值)。客户端应用程序可以订阅事件。 Filed:在