【Autosar】MCAL - MCU(NXP - S32K14x)

这篇具有很好参考价值的文章主要介绍了【Autosar】MCAL - MCU(NXP - S32K14x)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MCAL - MCU(NXP - S32K14x)

MCAL - 汇总

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

1. 概述

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

1.1 时钟介绍

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件
从上图可以看到最左边为输入时钟源,右边为输出时钟,为了让系统运行在合适的时钟频率环境下,我们需要选择合适的时钟源并通过倍频、分频来得到我们想要的时钟频率。

S32K14x时钟源:

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

SOSC可以通过PLL倍频成SPLL_CLK

S32K14x系统时钟信号:

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

1.2 运行模式

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

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

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件
各个模式下允许使用的时钟源以及切换如下图所示:
scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

1.3 时钟频率计算

通过一个例子来说明:

配置项 目标
CORE_CLK 80MHz
SYS_CLK 80MHz
BUS_CLK 40MHz
FLASH_CLK 20MHz

为了达到上述的配置目标,可以看到我这里选择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
DIVCORE 2
DIVBUS 2
DIVFLASH 4

1.4 复位源

S32K-RM 里面可以看到复位信息是存放在SSRS寄存器中,软件读取该寄存器值来获取复位源。
scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

1.5 复位

通过设置M4内核的系统控制寄存器AIRCRSYSRESETREQ来对MCU进行复位:
scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

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_Init MCU初始化
Mcu_InitRamSection RAM初始化
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

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件
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

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

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 Pll
   in 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

各模式下的时钟配置

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件
Run System Clock Select:系统运行时钟源选择

Run Core Clock Divider:DIVCORE分频

Run Bus Clock Divider:DIVBUS分频

Run Slow Clock Divider:DIVSLOW分频

其他配置项使用自动计算按钮计算即可。
scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

3.2.3 Mcu(SOSC / SIRC / FIRC)ClockSetting

时钟源配置

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件
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 Clock Monitor Enable:使能SOSC时钟监控

SOSC Clock Monitor Reset Enable:时钟异常复位

时钟监控文章传送门

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

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

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

3.2.4 McuSystemPLL

PLL配置

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件
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)

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

3.2.5 McuPeripheralClockConfig

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

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

3.2.6 McuClockReferencePoint

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

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

3.3 McuResetReasonConf

复位源

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

通过查看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函数需要传入此参数切换到对应的模式上。

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件

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

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

scg clkout select,【Autosar】MCAL - 从零开始【干货分享】,单片机,fpga开发,嵌入式硬件


参考资料:

S32K-RM.pdf - NXP

AUTOSAR_MCAL_MCU_UM[1].pdf - NXP

Cortex M3/M4 权威指南.pdf文章来源地址https://www.toymoban.com/news/detail-760811.html

到了这里,关于【Autosar】MCAL - MCU(NXP - S32K14x)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • S32K3 MCAL配置之GPT 基于EBtresos

    GPT GPT可以为系统配置定时器通道给需要定时功能的模块,比如OS需要一个时间刻度来周期执行TASK; 计时器按照用户设置进行计时,达到预定的时间通过中断通知系统,系统可在通知函数内进行服务调度; 涉及模块:GPT MCU Platform 在GptChannelConfiguration添加GPT通道 双击GPT通道进

    2024年02月02日
    浏览(27)
  • NXP S32K144学习系列2----S32DS基本操作

    如果不知道如何安装S32DS,请参考NXP S32K144学习系列1----开发环境的安装_EasyMoney77的博客-CSDN博客 导入工程后,首先要做的是调整好界面,将一些常用的界面合理的布局。我常使用的有project explorer(导入的工程),Outline(打开文件的包含的变量和函数),Components(包含导入的

    2023年04月08日
    浏览(41)
  • S32K3系列 --- 硬件I2C Mcal配置

    网上看到很多I2C的教程,基本都是模拟I2C,现在S32K3的芯片支持硬件I2C,我想着就配一个硬件的出来吧,这边记录一下,供大家学习。 这里主要教大家如何去配置,去使用。 原理的话可以参考这篇文章: 一文搞懂I2C通信总线_i2c通信的详细讲解-CSDN博客 I2C时序 这里我们用I2C与

    2024年01月18日
    浏览(30)
  • nxp s32k144芯片使用J-LINK程序刷写

    1.nxp s32k144 (1)打开软件:J-Flash V6.30j (2)新建工程:file-new project (3)选择芯片型号和 target interface (4)可以保存芯片和接口配置 (5)打开程序:File-open data file (6)程序刷写:Target-Production Programming (7)连接不成功的话,可以检测下Jlink的排线有无接反。 检查下Jlink盒子内部的供电

    2024年01月16日
    浏览(41)
  • S32K3学习笔记_01_MCAL的使用和环境搭建

    S32K3学习笔记_01_MCAL的使用和环境搭建 最近PDU项目中用到了NXP的S32K312芯片,把学习笔记记录下来,欢迎纠错,主要参考小猫爪的博客、芯片手册S32K3xxDS.pdf、参考手册S32K3XXRM.pdf。 S31K312可以使用S32DS进行SDK方式的开发,EB tresos进行MCAL开发 EB tresos可以为MCAL开发提供图形化配置界

    2024年01月23日
    浏览(37)
  • S32K系列MCU学习介绍

    最近因为工作需要,在学习恩智浦的S32K312,开发一款汽车PDU。 S32K系列是恩智浦公司于2017年推出的面向汽车电子的微控制器。S32K3 系列包括基于 Arm Cortex-M7 的 MCU,采用单步、双步和锁步内核配置,支持 ASIL B/D 安全应用。功能包括具有恩智浦固件的硬件安全引擎,支持固件无

    2023年04月25日
    浏览(24)
  • 关于导入、编译、烧录S32K144 MCAL样例工程的相关问题

    问题来自于实践。 在学习了EB关于相关模块的配置之后,尝试导入S32K144 MCAL的样例到EB中,并配置相关的工具链进行编译,再使用S32DS进行执行文件的烧录,在这期间遇到了不少问题,记录一下。 进入官网大家可以看到有很多的版本,1.0.4、1.0.3、1.0.2…… 很遗憾的告诉大家,

    2024年02月14日
    浏览(28)
  • S32K3系列MCAL配置详解之 UART(串口)基于EB tresos

    UART 串口通讯(Serial Communication)是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。严格意义上来讲串口通讯并不属于AUTOSAR MCAL 模块依赖:UART PORT MCU 串口配置相对比较简单,首先在uartchannel选项卡下新增一个配置项,双击进入 时钟参考等会儿

    2024年02月13日
    浏览(32)
  • S32K系列MCU介绍和资料搜集

    S32K系列微控制器,是NXP推出的专门面向汽车电子和工业应用场合的微控制器。基于Arm®Cortex®-M系列的可扩展、低功耗微控制器,获得了AEC-Q100认证,具有高级功能安全、信息安全和软件支持,适用于工业和汽车ASIL B/D车身、区域控制和电气化应用。 S32K系列MCU有多个系列型号,

    2024年02月15日
    浏览(39)
  • S32K142 MCU锁死解锁

    本文主要介绍S32K142 MCU锁死(Jlink报错:0x400-0x40F indicate that readout p’rotection is set)的原因简介以及如何使用 J-Link Commander 工具解🔒。 一、故障现象 二、原因分析 基于S32K144的芯片锁死,一般有如下几种可能:   1. 时钟配置异常 ,MCU被倍频以及不配置时钟,都有可能造成

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包