【Autosar】MCAL - MCU(NXP - S32K14x)

2023-11-11 06:42
文章标签 autosar mcu nxp mcal s32k14x

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

文章目录

  • MCAL - MCU(NXP - S32K14x)
    • 1. 概述
      • 1.1 时钟介绍
      • 1.2 运行模式
      • 1.3 时钟频率计算
      • 1.4 复位源
      • 1.5 复位
    • 2. API
    • 3. 配置介绍
      • 3.1 General
        • 3.1.1 McuGeneralConfiguration
      • 3.2 McuClockSettingConfig
        • 3.2.1 General
        • 3.2.2 Mcu(Run / Vlpr / Hsrun)ClockConfig
        • 3.2.3 Mcu(SOSC / SIRC / FIRC)ClockSetting
        • 3.2.4 McuSystemPLL
        • 3.2.5 McuPeripheralClockConfig
        • 3.2.6 McuClockReferencePoint
      • 3.3 McuResetReasonConf
      • 3.4 McuModeSettingCong

MCAL - MCU(NXP - S32K14x)

MCAL - 汇总

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

1. 概述

MCU模块提供了访问内核相关功能的API,例如配置时钟、初始化RAM、设置低功耗模式、提供复位接口等。

1.1 时钟介绍

在这里插入图片描述
从上图可以看到最左边为输入时钟源,右边为输出时钟,为了让系统运行在合适的时钟频率环境下,我们需要选择合适的时钟源并通过倍频、分频来得到我们想要的时钟频率。

S32K14x时钟源:

输入时钟源描述频率
FIRC内部高速时钟源48MHz
SIRC内部低速时钟源8MHz
SOSC外部晶振8MHz~40MHz
LPO内部低功耗时钟源128KHz

SOSC可以通过PLL倍频成SPLL_CLK

S32K14x系统时钟信号:

输出时钟源描述
CORE_CLK内核时钟
SYS_CLK系统时钟
BUS_CLK总线时钟
FLASH_CLKFLASH时钟

1.2 运行模式

运行模式描述
HSRUN高速运行模式
RUN普通运行模式
VLPR低速运行模式

S32K146在每个工作模式下的最高运行时钟频率如下表所示:

在这里插入图片描述

1.3 时钟频率计算

通过一个例子来说明:

配置项目标
CORE_CLK80MHz
SYS_CLK80MHz
BUS_CLK40MHz
FLASH_CLK20MHz

为了达到上述的配置目标,可以看到我这里选择CORE_CLKSYS_CLK为80MHZ,可以发现通过内部时钟源根本无法达到该频率,因此使用外部晶振(SOSC)8MHz,通过PLL倍频得高速频率,再通过分频达到我们想要的80MHz。

计算方式:

SPLL_CLK = SOSC(8MHz)* 40(PLL倍频)/ 2(PLL分频)= 160MHz.

CORE_CLK \ SYS_BUS = SPLL_CLK / 2(DIVCORE分频)= 80MHz.

BUS_CLK = SPLL_CLK / 2(DIVCORE分频)/ 2 (DIVBUS分频)= 40MHz.

FLASH_CLK = SPLL_CLK / 2(DIVCORE分频)/ 4(DIVFLASH分频)= 20MHz.

通过上面的公式可以看到我们通过PLL倍频后,时钟频率达到了160MHz。后续再通过分频达到我们想要的频率。从上面公式可以得到配置参数

配置相参数
PLL 倍频40
DIVCORE2
DIVBUS2
DIVFLASH4

1.4 复位源

S32K-RM 里面可以看到复位信息是存放在SSRS寄存器中,软件读取该寄存器值来获取复位源。
在这里插入图片描述

1.5 复位

通过设置M4内核的系统控制寄存器AIRCRSYSRESETREQ来对MCU进行复位:
在这里插入图片描述

FUNC(void, MCU_CODE) Mcu_CM4_SystemReset(void)
{ASM_KEYWORD(" dsb");               /* All memory accesses have to be completed before reset *//** @violates @ref Mcu_CortexM4_c_REF_4 Required Rule 11.1, Conversion from integer to pointer *//** @violates @ref Mcu_CortexM4_c_REF_5 The cast is used to access memory mapped registers.*/REG_WRITE32( CM4_AIRCR_BASEADDR, (uint32)(CM4_AIRCR_VECTKEY(0x5FAU) | (REG_READ32(CM4_AIRCR_BASEADDR) & CM4_AIRCR_PRIGROUP_MASK) | CM4_AIRCR_SYSRESETREQ_MASK ));ASM_KEYWORD(" dsb");               /* All memory accesses have to be completed */
}

2. API

函数功能
Mcu_InitMCU初始化
Mcu_InitRamSectionRAM初始化
Mcu_InitClock时钟初始化
Mcu_DistributePllClock使能PLL
Mcu_GetPllStatus获取PLL状态
Mcu_GetResetReason获取复位源(SSRS寄存器原始值处理过后得到的复位信息)
Mcu_GetResetRawValue获取复位源(SSRS寄存器原始值)
Mcu_SetMode运行模式设置
Mcu_GetVersionInfo获取版本信息
Mcu_GetRamState获取RAM状态

3. 配置介绍

3.1 General

3.1.1 McuGeneralConfiguration

在这里插入图片描述
Mcu Init Clock API:MCU初始化API

Mcu No PLL:禁用PLL,从下面代码看出MCU配置PLL需要关闭Mcu No PLL并且勾选SPLL UNDER MCU CONTROL

#if (MCU_NO_PLL == STD_OFF)/* Configure SPLL */if (MCU_IPW_SPLL_UNDER_MCU_CONTROL == (Mcu_pClockConfig->u8ClockSourcesControl & MCU_IPW_SPLL_UNDER_MCU_CONTROL)){/** @violates @ref Mcu_IPW_c_REF_5 The comma operator shall not be used. *//** @violates @ref Mcu_IPW_c_REF_7 MISRA 2004 Rule 16.9, function identifier *//** @violates @ref Mcu_IPW_c_REF_9 MISRA 2004 Rule 8.3, For each function parameter */Call_Mcu_SCG_SpllInit(Mcu_pClockConfig->SCG_pClockConfig);}
#endif  /* MCU_NO_PLL */

Mcu Enter Low-Power Mode:允许MCU进入低功耗模式

3.2 McuClockSettingConfig

3.2.1 General

在这里插入图片描述

System clock under MCU control:是能了以后MCU模块才能配置SCG

/* Configure SIRC and then select it as system clock by default. This is needed to apply new configuration for Pllin case of the Pll selected as system clock previously. This is possible only when sys clock is under Mcu control.
*/
if(SCG_SYS_CLK_NOT_UNDER_MCU_CONTROL != Mcu_pClockConfigPtr->SCG_pClockConfig->u32RunClockControlConfiguration)
{/** @violates @ref Mcu_IPW_c_REF_5 The comma operator shall not be used. *//** @violates @ref Mcu_IPW_c_REF_7 MISRA 2004 Rule 16.9, function identifier *//** @violates @ref Mcu_IPW_c_REF_8 MISRA 2004 Rule 8.1, Functions shall have prototype */Call_Mcu_SCG_DropSystemClockToTrustedClock();
}

SCG ClkOut Select:系统时钟选择

3.2.2 Mcu(Run / Vlpr / Hsrun)ClockConfig

各模式下的时钟配置

在这里插入图片描述
Run System Clock Select:系统运行时钟源选择

Run Core Clock Divider:DIVCORE分频

Run Bus Clock Divider:DIVBUS分频

Run Slow Clock Divider:DIVSLOW分频

其他配置项使用自动计算按钮计算即可。
在这里插入图片描述

3.2.3 Mcu(SOSC / SIRC / FIRC)ClockSetting

时钟源配置
在这里插入图片描述
SOSC under MCU Control:勾选了之后MCU模块才能够配置SOSC,如下代码所示

 /* Configure SOSC */
if (MCU_IPW_SOSC_UNDER_MCU_CONTROL == (Mcu_pClockConfig->u8ClockSourcesControl & MCU_IPW_SOSC_UNDER_MCU_CONTROL))
{/** @violates @ref Mcu_IPW_c_REF_5 The comma operator shall not be used. *//** @violates @ref Mcu_IPW_c_REF_7 MISRA 2004 Rule 16.9, function identifier *//** @violates @ref Mcu_IPW_c_REF_9 MISRA 2004 Rule 8.3, For each function parameter */Call_Mcu_SCG_SoscInit(Mcu_pClockConfig->SCG_pClockConfig);
}   

SOSC Frequency:SOSC外部晶振频率

SOSC Enable:使能SOSC时钟源

SOSC Divider2:DIV2分频系数

SOSC Divider1:DIV1分频系数

SOSC Range Select:MEDIUM_FREQ_RANGE(4MHz - 8MHz)/ HIGH_FREQ_RANGE(8MHz - 40MHz)

其他配置项自动计算即可。

在这里插入图片描述

3.2.4 McuSystemPLL

PLL配置

在这里插入图片描述
System PLL under MCU control:勾选了之后MCU才能配置PLL

System PLL Enable:使能PLL

System PLL Divider2:DIV2分频系数

System PLL Divider1:DIV1分频系数

System PLL Multiplier:PLL倍频系数

Mcu SPLL source clock :PLL的输入时钟源(是能选择SOSC)

在这里插入图片描述

3.2.5 McuPeripheralClockConfig

外设时钟配置,所有的外设时钟都在此处配置,除了WDG。

在这里插入图片描述

3.2.6 McuClockReferencePoint

时钟参考点,其他模块引用时钟参考点进行时钟频率值的计算。

在这里插入图片描述

3.3 McuResetReasonConf

复位源

在这里插入图片描述

通过查看Mcu_Cfg.h可以看到定义的枚举

/**
* @brief            The type Mcu_ResetType, represents the different reset that a specified MCU can have.
* @details          The MCU module shall provide at least the values MCU_POWER_ON_RESET and MCU_RESET_UNDEFINED for the enumeration Mcu_ResetType.
*
* @implements Mcu_ResetType_enumeration
*/
typedef enum
{MCU_STOP_ACKNOWLEDGE_ERROR_RESET = McuConf_McuResetReasonConf_MCU_STOP_ACKNOWLEDGE_ERROR_RESET,          /**< @brief Stop Acknowledge Error reset . RCM_SRS[SACKERR]. */MCU_MDM_AP_SYSTEM_RESET = McuConf_McuResetReasonConf_MCU_MDM_AP_SYSTEM_RESET,                            /**< @brief MDM-AP System Reset Request . RCM_SRS[MDM_AP]. */MCU_SW_RESET = McuConf_McuResetReasonConf_MCU_SW_RESET,                                                  /**< @brief Software reset . RCM_SRS[SW]. */MCU_CORE_LOCKUP_RESET = McuConf_McuResetReasonConf_MCU_CORE_LOCKUP_RESET,                                /**< @brief Core Lockup reset . RCM_SRS[LOCKUP]. */MCU_JTAG_RESET = McuConf_McuResetReasonConf_MCU_JTAG_RESET,                                              /**< @brief JTAG generated reset . RCM_SRS[JTAG]. */MCU_POWER_ON_RESET = McuConf_McuResetReasonConf_MCU_POWER_ON_RESET,                                      /**< @brief Power-on reset. RCM_SRS[POR]. */MCU_EXTERNAL_PIN_RESET = McuConf_McuResetReasonConf_MCU_EXTERNAL_PIN_RESET,                              /**< @brief External Reset Pin. RCM_SRS[PIN]. */MCU_WATCHDOG_RESET = McuConf_McuResetReasonConf_MCU_WATCHDOG_RESET,                                      /**< @brief Watchdog reset. RCM_SRS[Watchdog]. */MCU_CMU_LOSS_OF_CLOCK_RESET = McuConf_McuResetReasonConf_MCU_CMU_LOSS_OF_CLOCK_RESET,                    /**< @brief CMU Loss-of-Clock Reset. RCM_SRS[CMU_LOC]. */MCU_LOSS_OF_LOCK_RESET = McuConf_McuResetReasonConf_MCU_LOSS_OF_LOCK_RESET,                              /**< @brief Loss-of-Lock Reset. RCM_SRS[LOL]. */MCU_LOSS_OF_CLOCK_RESET = McuConf_McuResetReasonConf_MCU_LOSS_OF_CLOCK_RESET,                            /**< @brief Loss-of-Clock Reset. RCM_SRS[LOC]. */MCU_LOW_OR_HIGH_VOLTAGE_DETECT_RESET = McuConf_McuResetReasonConf_MCU_LOW_OR_HIGH_VOLTAGE_DETECT_RESET,  /**< @brief Low-Voltage Detect Reset or High-Voltage Detect Reset. RCM_SRS[LVD]. */MCU_NO_RESET_REASON = McuConf_McuResetReasonConf_MCU_NO_RESET_REASON,                                    /**< @brief No reset reason found */MCU_MULTIPLE_RESET_REASON = McuConf_McuResetReasonConf_MCU_MULTIPLE_RESET_REASON,                        /**< @brief More than one reset events are logged except "Power on event" */MCU_RESET_UNDEFINED = McuConf_McuResetReasonConf_MCU_RESET_UNDEFINED                                     /**< @brief Undefined reset source. */} Mcu_ResetType;

通过查看Reg_eSys_RCM.h能够看到复位状态的掩码,在下面的计算器截图中我们可以看到,总的复位状态掩码0x00002FFEU的二进制位与上面手册中一一对应。

/****************************************************/
/***              RCM_SSRS                        ***/
/****************************************************/
#define RCM_SSRS_RWBITS_MASK32              ((uint32)0x00002FFEU)

因此我们这边在配置的时候,应该根据芯片支持的复位源,并且设置对应的编号,MCU模块在对复位源做初始化的时候才使能对应的复位源。序号是根据寄存器中的有效位,按照从高位到低位的顺序来设置的(例如SSACKERR在最高位,那序号为0,可以从后续的查询代码介绍部分,看出这么排序的原因)。芯片复位源一般由芯片厂商规定好了,不需要用户修改,例如下面的复位源都是不可更改不可删除的

3.4 McuModeSettingCong

McuModeSettingConf界面中可以增加模式,注意Mode ID,在程序中切换模式调用的Mcu_SetMode函数需要传入此参数切换到对应的模式上。

在这里插入图片描述

低功耗模式使能配置,Mcu Enter Low-Power Mode:✔才可以切换到低功耗模式。

Mcu_SMC_ModeConfig函数中可以看到,MCU_ENTER_LOW_POWER_MODE控制低功耗模式的切换。

在这里插入图片描述


参考资料:

S32K-RM.pdf - NXP

AUTOSAR_MCAL_MCU_UM[1].pdf - NXP

Cortex M3/M4 权威指南.pdf

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



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

相关文章

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

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

PC/MCU/SoC使用的计算机架构(Architecture)

1. 冯·诺依曼结构 冯·诺依曼结构(Von Neumann Architecture)是计算机系统的经典架构,由数学家约翰·冯·诺依曼在1945年提出。它的核心思想是程序存储器和数据存储器共享同一存储设备,程序和数据以相同的方式存储和访问。冯·诺依曼架构的主要特点包括: 单一存储器:存储程序指令和数据在同一个存储器中。控制单元:通过程序计数器顺序执行指令。数据路径:通过一个共享的总线,将数据

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

北京君正低功耗MCU芯片应用在柯氏音法电子血压计

汉王科技,作为一家在中关村有着30年品牌历史的人工智能企业,始终致力于利用先进技术提升人们的生活品质。近日,继血压计KSY-FF660上市掀起血压测量新标准后,汉王科技再次突破行业创新,推出一体式柯氏音法电子血压计FY730,为人们的健康管理带来了更为精准便携的全新体验。   一体式设计精准便携 带着健康出发   汉王柯氏音法电子血压计FY7

GD - EmbeddedBuilder - 给已有工程换MCU

文章目录 GD - EmbeddedBuilder - 给已有工程换MCU概述不行的重现 笔记工程的.gdc文件内容中有MCU型号可以改 给已有工程换MCU的使用场景END GD - EmbeddedBuilder - 给已有工程换MCU 概述 一个现存的EmbeddedBuilder的工程,想换个MCU配置做实验,又不想从头搭建实验工程。 想找找是否可以通过Embedded

Autosar OS基础知识导图

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