AUTOSAR_SWS_MCUDriver

AUTOSAR_SWS_MCUDriver


简介和功能概述


本规范描述了 MCU [微控制器单元] 驱动程序的功能和 APIMCU 驱动程序提供基本微控制器初始化、断电功能、复位和其他 MCAL 软件模块所需的微控制器特定功能。除了启动代码外,初始化服务还允许灵活且与应用相关的 MCU 初始化(见下图)。启动代码非常特定于 MCU。本文档中提供的启动代码描述仅供参考,并暗示了在标准化 MCU 初始化能够启动之前必须考虑的功能。


MCU 驱动程序直接访问微控制器硬件,位于微控制器抽象层 (MCAL)。

MCU 驱动程序功能:
  • 初始化 MCU 时钟、PLL、时钟预分频器和 MCU 时钟分配
  • 初始化 RAM 部分
  • 激活微控制器低功耗模式
  • 激活微控制器复位
  • 提供从硬件获取复位原因的服务

首字母缩略词和缩写



约束和假设


约束

一般来说,在 AUTOSAR 标准化中,MCU 低功耗模式的激活和配置不是强制性的。
ECU 或微控制器电源的启用/禁用不是 MCU 驱动程序的任务。这由上层处理。

对其他模块的依赖


启动代码

在初始化 MCU 驱动程序之前,必须执行 MCU 的基本初始化。此 MCU 特定初始化通常在启动代码中执行。

MCU 的启动代码应在通电和任何类型的微控制器复位后执行。它应执行非常基本的和微控制器特定的启动初始化,并且应保持简短,因为 MCU 时钟和 PLL 尚未初始化。启动代码应涵盖 MCU 特定的初始化,这些初始化不属于其他 MCU 服务或其他 MCAL 驱动程序。以下描述总结了启动代码中应包含的基本功能。列出它是为了提供指导,因为某些功能可能不受所有 MCU 支持。

启动代码应初始化中断和崩溃向量表的基地址。这些基地址将作为配置参数或链接器/定位器的设置提供。

如果 MCU 支持中断堆栈,启动代码应初始化中断堆栈指针。中断堆栈指针基址和堆栈大小将作为配置参数或链接器/定位器的设置提供。

启动代码应初始化用户堆栈指针。用户堆栈指针基址和堆栈大小作为配置参数或链接器/定位器的设置提供。

如果 MCU 支持上下文保存操作,则启动代码应初始化用于上下文保存操作的内存。连续上下文保存操作的最大数量由配置参数或链接器/定位器的设置提供。

启动代码应确保 MCU 内部看门狗MCAL 看门狗驱动程序初始化看门狗之前不会起作用。例如,可以通过增加看门狗服务时间来实现。

如果 MCU 支持数据和/或代码的缓存存储器,则应在启动代码中初始化并启用它。

启动代码应初始化与内部存储器相关的 MCU 特定功能,例如内存保护。

如果使用部存储器,则应在启动代码中初始化存储器。应准备启动代码以支持因不同代码位置而不同的存储器配置。应考虑从外部/内部存储器执行代码的不同配置选项。

不同存储器的设置应作为配置参数提供给启动代码。

启动代码中,应执行 MCU 时钟系统的默认初始化,包括全局时钟预分频器。

如果 MCU 支持,启动代码应启用特殊功能寄存器 (SFR) 的保护机制。

启动代码应初始化所有必要的次性写入寄存器或几个驱动程序共用的寄存器,这些寄存器需要或非常希望对寄存器进行次性写入,而是重复写入。

启动代码应初始化少量的 RAM,以便允许 MCU 驱动程序服务和这些服务的调用者正确执行。

注:启动代码取决于 ECU MCU。具体规范应在 MCU 的设计规范中描述。

需求可追溯性



功能规格


背景和理由

MCU 驱动程序提供 MCU 时钟和 RAM 初始化服务。在 MCU 配置集中,应配置 MCU 特定的时钟设置(即 PLL 设置)和 RAM 设置(即段基址和大小)。


重置

[SWS_Mcu_00055]

[ ]
  • MCU 模块应提供软件触发硬件复位的服务。

注意:只有授权用户才能调用此复位服务功能。

[SWS_Mcu_00052]

[ ]
  • 如果硬件支持此功能,MCU 模块应提供获取上次复位原因的服务。

注意:在 ECU 中,有多种原因可能导致复位。根据复位原因,在重新初始化 MCU 后可能需要多种应用场景。

时钟

[SWS_Mcu_00248]

[ ]
  • MCU 应提供服务来启用和设置 MCU 时钟。(即,必须在 MCU 中配置 CPU 时钟外设时钟、预分频器、乘法器。)

注意:所有可用的外设时钟都必须通过 McuClockReferencePoint 容器提供给其他 BSW 模块。

MCU 模式服务

[SWS_Mcu_00164]

[ ]
  • MCU 模块应提供激活 MCU 低功耗模式的服务。

激活低功耗模式的服务应允许访问微控制器硬件中可用的电源模式。

[SWS_Mcu_00165]

[ ]
  • 模式数量和配置取决于 MCU,并应在 MCU 模块的配置集中进行配置。

注意:激活 MCU 低功耗模式可能会影响 PLL、内部晶振、CPU 时钟、微控制器外设时钟以及内核和外设的电源。

在典型操作中,MCU 低功耗模式将在 ECU 运行期间频繁进入和退出。在这种情况下,当其中一个 MCAL 模块激活时,将执行唤醒

上层负责激活 MCU 正常运行模式(执行 MCU 电源模式之前的条件)或关闭微控制器电源。

对于某些 MCU 模式配置,MCU 只能通过硬件复位来唤醒

错误分类

文档“基础软件模块通用规范”的7.x节“错误处理”详细描述了基础软件的错误处理。首先,它构成了 BSW 模块中可能出现的五种错误类型的分类方案。

在此基础上,下一节将详细说明排列在各个小节中的具体错误。

[SWS_Mcu_00051]

[ ]
  • MCU 驱动程序遵循标准化 AUTOSAR 概念来报告生产错误。提供的回调例程在诊断事件管理器 (DEM) 规范中指定(见 6)。

[SWS_Mcu_00226]

[ ]
  • 生产错误不得作为被调用函数的返回值。

开发错误

[SWS_Mcu_00012]

[SRS_BSW_00327]
[SRS_BSW_00337]

扩展生产错误


[SWS_Mcu_00053]

[ ]
  • 如果在配置集中启用了时钟故障通知,并且发生时钟源故障错误,则应报告错误代码 MCU_E_CLOCK_FAILURE。(另请参阅 [SWS_Mcu_00051])。

如果通过其他硬件机制(例如生成陷阱)检测到时钟故障,则应禁用此通知,并且应在 MCU 驱动程序之外进行故障报告。

MCU_E_CLOCK_FAILURE


[SWS_Mcu_00257]

[ ]
  • MCU_E_CLOCK_FAILURE 的失败标准:发生时钟源故障。

[SWS_Mcu_00258]

[ ]
  • MCU_E_CLOCK_FAILURE 的通过标准:没有发生时钟源故障。

API 规范


导入的类型

[SWS_Mcu_00152]
[ ]

类型定义

Mcu_ConfigType

[SWS_Mcu_00249]

[ ]

Mcu_PllStatusType

[SWS_Mcu_00250]

[ ]

[SWS_Mcu_00230]

[ ]
  • Mcu_PllStatusType 类型是函数 Mcu_GetPllStatus 的返回值的类型。

[SWS_Mcu_00231]

[ ]
  • Mcu_PllStatusType 的类型是枚举,其值包括以下几个:
    • MCU_PLL_LOCKED
    • MCU_PLL_UNLOCKED
    • MCU_PLL_STATUS_UNDEFINED

Mcu_ClockType

[SWS_Mcu_00251]

[ ]

[SWS_Mcu_00232]

[ ]
  • Mcu_ClockType 类型定义了通过配置结构配置的时钟设置的标识符 (ID)。

[SWS_Mcu_00233]

[ ]
  • 类型应为 uint8、uint16 或 uint32,具体取决于微控制器平台。

Mcu_ResetType

[SWS_Mcu_00252]

[ ]

[SWS_Mcu_00234]

[ ]
  • 类型 Mcu_ResetType 代表指定 MCU 可以具有的不同复位情况。

[SWS_Mcu_00134]

[ ]
  • MCU 模块应至少为枚举 Mcu_ResetType 提供值:
    • MCU_POWER_ON_RESET
    • MCU_RESET_UNDEFINED

注意:根据 MCU,可能会添加额外的 Mcu_ResetType 复位类型。

Mcu_RawResetType

[SWS_Mcu_00253]

[ ]

[SWS_Mcu_00235]

[ ]
  • Mcu_RawResetType 类型以原始寄存器格式指定复位原因,从复位状态寄存器读取。

[SWS_Mcu_00236]

[ ]
  • 根据最佳性能,类型应为 uint8、uint16 或 uint32。

Mcu_ModeType

[SWS_Mcu_00254]

[ ]

[SWS_Mcu_00237]

[ ]
  • Mcu_ModeType 指定 MCU 模式的标识 (ID),通过配置结构配置。

[SWS_Mcu_00238]

[ ]
  • 类型应为 uint8、uint16 或 uint32。

Mcu_RamSectionType

[SWS_Mcu_00255]

[ ]

[SWS_Mcu_00239]

[ ]
  • Mcu_RamSectionType 指定通过配置结构配置的 RAM 部分的标识 (ID)。

[SWS_Mcu_00240]

[ ]
  • 类型应为 uint8、uint16 或 uint32,以最佳性能为准。

Mcu_RamStateType

[SWS_Mcu_00256]

[ ]

函数定义

Mcu_Init

[SWS_Mcu_00153]

[ ]

[SWS_Mcu_00026]

[SRS_BSW_00101]
[SRS_BSW_00406]
  • 函数 Mcu_Init 将初始化 MCU 模块,因此,断电、时钟和 RAM 部分的配置设置在 MCU 模块内可见。

注意:执行函数 Mcu_Init 之后,配置数据可供 MCU 模块函数访问并可使用,例如 Mcu_InitRamSection

MCU 模块的实现者应在函数 Mcu_Init 中实现有关控制器寄存器初始化的以下规则:

[SWS_Mcu_00116]

[ ]
  • 如果硬件仅允许使用寄存器一次,则实现该功能的驱动模块负责初始化寄存器。

[SWS_Mcu_00244]

[ ]
  • 如果该寄存器可以影响多个硬件模块,并且它是一个 I/O 寄存器,则它应由 Port 驱动程序初始化。

[SWS_Mcu_00245]

[ ]
  • 如果该寄存器可以影响多个硬件模块,并且它不是 I/O 寄存器,则应由该 MCU 驱动程序初始化它。

[SWS_Mcu_00246]

[ ]
  • 复位后需要直接初始化的次性可写寄存器应由启动代码初始化。

[SWS_Mcu_00247]

[ ]
  • 所有之前未提及的其他寄存器均须由启动代码初始化。

注意:术语“硬件模块”指的是 MCU 的内部模块,而不是 BSW 模块。

Mcu_InitRamSection

[SWS_Mcu_00154]

[ ]

[SWS_Mcu_00011]

[ ]
  • 函数 Mcu_InitRamSection 将使用 McuRamDefaultValue 中包含的字节值来填充从地址 
    • McuRamSectionBaseAddress 
        到地址 
    • McuRamSectionBaseAddress + McuRamSectionSize - 1 
        的内存,写入的字节数由 McuRamSectionWriteSize 定义,写入方式为一次性写入。
  • 其中 
    • McuRamSectionBaseAddress
    • McuRamSectionSize
    • McuRamDefaultValue
    • McuRamSectionWriteSize 
        是每个 RamSection 的配置参数的值。

[SWS_Mcu_00136]

[ ]
  • 只有在使用函数 Mcu_Init 初始化 MCU 模块后,MCU 模块的环境才应调用函数Mcu_InitRamSection

Mcu_InitClock

[SWS_Mcu_00155]

[ ]

[SWS_Mcu_00137]

[ ]
  • 函数 Mcu_InitClock 将初始化 PLL 和其他 MCU 特定时钟选项。时钟配置参数通过配置结构提供。

[SWS_Mcu_00138]

[ ]
  • 函数 Mcu_InitClock 将启动 PLL 锁定程序(如果 PLL 需要初始化)并且无需等到 PLL 锁定便可返回。

[SWS_Mcu_00139]

[ ]
  • 只有在使用函数 Mcu_Init 初始化 MCU 模块后,MCU 模块环境才会调用函数 Mcu_InitClock

[SWS_Mcu_00210]

[ ]
  • 如果参数 McuInitClock 设置为 FALSE,则应禁用 Mcu_InitClock 函数。相反,如果前一个参数设置为 TRUE,则可以使用该函数(另请参阅 [ECUC_Mcu_00118])。

Mcu_DistributePllClock

[SWS_Mcu_00156]

[ ]

[SWS_Mcu_00140]

[ ]
  • 函数 Mcu_DistributePllClock 将激活从 PLL 时钟到 MCU 时钟分配。

[SWS_Mcu_00141]

[ ]
  • 函数 Mcu_DistributePllClock 将从 MCU 时钟分配中移除当前时钟源(例如内部晶振时钟)。

只有在函数 Mcu_GetPllStatus 检测到 PLL 的状态为锁定状态后,MCU 模块环境才会调用函数 Mcu_DistributePllClock

[SWS_Mcu_00056]

[ ]
  • 如果 PLL 时钟已由 MCU 硬件自动激活,则函数 Mcu_DistributePllClock 应返回,而不会影响 MCU 硬件。

[SWS_Mcu_00142]

[ ]
  • 如果在 PLL 锁定之前调用函数 Mcu_DistributePllClock,则该函数应立即返回 E_NOT_OK,而无需采取任何进一步行动。

[SWS_Mcu_00205]

[ ]
  • 如果预编译参数 McuNoPll 设置为 FALSE,则 Mcu_DistributePllClock 函数应可用。否则,必须禁用此 API(另请参阅 [ECUC_Mcu_00180])。

Mcu_GetPllStatus

[SWS_Mcu_00157]

[ ]

[SWS_Mcu_00008]

[ ]
  • 函数 Mcu_GetPllStatus 将返回 PLL 的锁定状态。

[SWS_Mcu_00132]

[ ]
  • 如果在调用函数 Mcu_Init 之前调用该函数,则函数 Mcu_GetPllStatus 将返回 MCU_PLL_STATUS_UNDEFINED

[SWS_Mcu_00206]

[ ]
  • 如果预编译参数 McuNoPll 设置为 TRUE,则函数 Mcu_GetPllStatus 也应返回 MCU_PLL_STATUS_UNDEFINED(另请参阅 [ECUC_Mcu_00180])。

Mcu_GetResetReason

[SWS_Mcu_00158]

[ ]

[SWS_Mcu_00005]

[ ]
  • Mcu_GetResetReason 函数应从硬件读取复位原因,如果硬件支持,则返回该原因。如果硬件不支持硬件检测复位原因,则 Mcu_GetResetReason 函数的返回值应始终为 MCU_POWER_ON_RESET

[SWS_Mcu_00133]

[ ]
  • 如果在调用函数 Mcu_Init 之前调用该函数,并且硬件支持该函数,则函数 Mcu_GetResetReason 将返回 MCU_RESET_UNDEFINED

用户应确保读出复位原因后立即清除,以避免出现多重复位原因。

注意:如果并发调用此函数,返回值应该始终相同。

Mcu_GetResetRawValue

[SWS_Mcu_00159]

[ ]

[SWS_Mcu_00135]

[ ]
  • 如果在调用函数 Mcu_Init 之前调用此函数,并且如果硬件支持,则函数 Mcu_GetResetRawValue 将返回一个与复位状态寄存器的有效值不对应且不等于 0 的特定实现值。

[SWS_Mcu_00006]

[ ]
  • 如果硬件支持,Mcu_GetResetRawValue 函数将从硬件寄存器读取复位原始值。如果硬件没有复位状态寄存器,则返回值为 0x0

用户应确保读出复位原因后立即清除,以避免出现多重复位原因。

注意:如果多次调用此函数,返回值应该始终相同。

Mcu_PerformReset

[SWS_Mcu_00160]

[ ]

[SWS_Mcu_00143]

[ ]
  • 函数 Mcu_PerformReset 将利用微控制器的硬件功能执行微控制器复位

[SWS_Mcu_00144]

[ ]
  • 函数 Mcu_PerformReset 应执行配置集中配置的复位类型。

[SWS_Mcu_00145]

[ ]
  • MCU 模块环境需要调用函数 Mcu_PerformReset 时,应确保 MCU 模块已通过函数 Mcu_Init 进行了初始化。

[SWS_Mcu_00146]

[ ]
  • Mcu_PerformReset 函数仅在预编译参数 McuPerformResetApi 设置为 TRUE 时可用。如果设置为 FALSE,则 Mcu_PerformReset 函数不适用。(参见第 10.2.2 节)。

Mcu_SetMode

[SWS_Mcu_00161]

[ ]

[SWS_Mcu_00147]

[ ]
  • 函数 Mcu_SetMode 应设置 MCU 电源模式。在 CPU 断电模式下,函数 Mcu_SetMode 在执行唤醒后返回。

[SWS_Mcu_00148]

[ ]
  • MCU 模块环境应在 MCU 模块通过函数 Mcu_Init 初始化后才调用函数 Mcu_SetMode

注意:Mcu_SetMode 函数的环境必须确保 ECU 已准备好激活低功耗模式。

注意:API Mcu_SetMode 假定在调用实例调用 API 之前已禁用所有中断。实现必须注意不要丢失唤醒中断事件。即使 Mcu_SetMode 尚未将控制器设置为断电模式,也可以通过检查是否已发生待处理的唤醒中断来实现这一点。

Mcu_GetVersionInfo

[SWS_Mcu_00162]

[ ]

Mcu_GetRamState

[SWS_Mcu_00207]

[SRS_BSW_13701]

注意:有些微控制器提供在复位后检查 Ram 状态是否有效的功能。为此,可以使用 Mcu_GetRamState 函数。

[SWS_Mcu_00208]

[ ]
  • 仅当 MCU 模块已使用函数 Mcu_Init 初始化时,MCU 模块的环境才会调用此函数。

[SWS_Mcu_00209]

[ ]
  • 如果预编译参数 McuGetRamStateApi 设置为 TRUE,则用户可以使用 Mcu_GetRamState 函数。相反,如果前一个参数设置为 FALSE,则应禁用该函数(例如,硬件不支持该功能)。

预期接口


强制接口

[SWS_Mcu_00166]

[ ]

可选接口

[SWS_Mcu_00163]

[ ]

API 参数检查


[SWS_Mcu_00017]

[ ]
  • 如果为 MCU 模块启用了开发错误检测,则 MCU 函数应检查以下 API 参数,将检测到的错误报告给默认错误跟踪器,并且如果函数具有标准返回类型,则以返回值 E_NOT_OK 拒绝返回该类型。

[SWS_Mcu_00019]

[ ]
  • ClockSetting 的设置范围在配置数据结构中被定义。相关错误值:MCU_E_PARAM_CLOCK

[SWS_Mcu_00020]

[ ]
  • McuMode 的模式范围在配置数据结构中被定义。相关错误值:MCU_E_PARAM_MODE

[SWS_Mcu_00021]

[ ]
  • RamSection 应位于配置数据结构中定义的部分内。相关错误值:MCU_E_PARAM_RAMSECTION

[SWS_Mcu_00122]

[ ]
  • 如果使用 Mcu_DistributePllClock() 函数检测到 PLL 状态未锁定,则应报告错误。应使用 DET 错误报告。相关错误值:MCU_E_PLL_NOT_LOCKED

[SWS_Mcu_00125]

[ ]
  • 如果启用了开发错误检测,并且在 Mcu_Init 函数之前调用了 MCU 模块的任何其他函数(Mcu_GetVersionInfo 除外),则应向 DET 报告错误代码 MCU_E_UNINIT

序列图


MCU 初始化服务的示例序列


服务顺序仅作为示例,可能因用户而异。通电后应首先执行 Mcu_Init。用户通过执行 Mcu_GetPllStatus 确保 PLL 已锁定。

Mcu_GetResetReason


Mcu_GetResetRawValue


Mcu_PerformReset


配置规范


容器和配置参数

[SWS_Mcu_00126]

[ ]
  • 此模块的初始化函数应始终将指针作为参数,即使对于 VARIANT-PRE-COMPILE 不指定配置集的情况也是如此。相反,应将 NULL 指针传递给初始化函数。

[SWS_Mcu_00259]

[ ]
  • MCU 驱动模块不应支持“实现不支持的带有分区映射属性的配置参数”。

[SWS_Mcu_CONSTR_00001]

[ ]
  • 该模块将作为每个分区中的独立实例运行,这意味着被调用的 API 将仅针对其被调用的分区。

Mcu



McuGeneralConfiguration









McuClockSettingConfig




McuModuleConfiguration







McuDemEventParameterRefs



McuModeSettingConf



McuRamSectorSettingConf






McuClockReferencePoint



McuPublishedInformation



McuResetReasonConf




评论

此博客中的热门博文

ISO 14229-1-2020

AUTOSAR_SWS_CANDriver

Linux Driver Char Device 笔记

AUTOSAR_SWS_PWMDriver

AUTOSAR_SWS_PortDriver

AUTOSAR_SWS_ECUStateManager

EB - MCAL - MCU

AUTOSAR_SWS_ICUDriver

EB - MCAL - PWM