# AUTOSAR MCU 驱动规范 > **Specification of MCU Driver** > AUTOSAR CP Release 4.4.0 ## 元信息 - **文档类别**:SWS(Software Specification,软件规范) - **模块名称**:MCU Driver(Microcontroller Unit Driver,微控制器单元驱动) - **关联层级**:MCAL(Microcontroller Abstraction Layer,微控制器抽象层) - **AUTOSAR 版本**:Classic Platform 4.4.0 - **文档标识号**:031 ## 文档标识 | 项 | 值 | | --- | --- | | Document Title | Specification of MCU Driver | | Document Owner | AUTOSAR | | Document Responsibility | AUTOSAR | | Document Identification No | 031 | | Document Status | Final | | Part of AUTOSAR Standard | Classic Platform | | Part of Standard Release | 4.4.0 | ## 文档变更历史 | 日期 | 版本 | 变更方 | 变更说明 | | --- | --- | --- | --- | | 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 删除调试支持;引入 Multicore distribution 支持 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 引入新配置参数 McuRamSectionWriteSize;将 API Mcu_SetMode 的可重入性变更为 Reentrant | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 移除 "Variants" 章节;清理可追溯性中未解析的引用 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 关于 DET 重命名与扩展的小变更;对 symbolicNameValue 参数的配置类的澄清 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 删除 NULL 指针检查相关需求(与 BSW General 冗余);为扩展生产错误指定通过/失败标准 | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 修订需求可追溯性表;修正需求标签(Mcu_00146) | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | Mcu_GetResetReason 和 Mcu_GetResetRawValue 多次调用时返回相同值;修正 RAM sector 多重性;修正 McuClockSettingId 和 McuMode 范围;编辑性修订;移除变更文档章节 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 由于 SWS General 发布,对文档进行了适配;所有配置参数(第 10 章)中的 Scope 字段已更改为 Local 或 ECU;AUTOSAR Memory mapping 抽象按 BSW 拆分;将生产错误拆分为"纯"生产错误和扩展生产错误;变更 API Mcu_DistributePllClock 的签名 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | Mcu_SetMode 假设在调用前禁用所有中断 | | 2010-09-30 | 3.1.5 | AUTOSAR Administration | 修正 SWS_Mcu_00210;移除 SWS_Mcu_00225;重新表述 SWS_Mcu_00125 和 SWS_Mcu_00011;新增第 12 章 | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 重新表述大量需求以使其原子化;插入调试概念;插入新服务(API)以在复位后读取状态;插入新配置参数以使能/禁用 PLL API;引入新容器以发布 MCU 支持的所有不同复位;修订法律免责声明 | | 2008-08-13 | 3.1.1 | AUTOSAR Administration | 修订法律免责声明 | | 2007-12-21 | 3.0.1 | AUTOSAR Administration | 表格格式修正 | | 2007-01-24 | 2.1.15 | AUTOSAR Administration | 唤醒概念澄清(导致 MCU SWS 中唤醒功能和序列图的移除);移除废弃函数 Dem_ReportErrorEvent();技术办公室改进:措辞改进;需求重新表述以更清晰;扩展文档元信息;微调版面 | | 2007-11-28 | 2.1.14 | AUTOSAR Administration | 引入新的文件结构;从 API 类型定义中移除 'const';描述细节修订;移除 MCU_POWER_ON_RESET 的默认值(0x0);引入新的 pre-processor switch McuPerformResetApi;Mcu Clock Setting Configuration 多重性更改为 1;修订法律免责声明;新增 Release Notes;修订"用户须知";新增"修订信息" | | 2006-05-16 | 2.0 | AUTOSAR Administration | 文档结构适配通用 Release 2.0 SWS Template;第 10 章重大变更;文档结构部分变更 | | 2005-05-31 | 1.0 | AUTOSAR Administration | 首次发布 | ## 免责声明 > 本节为版权与法律声明,以英文形式发布,翻译时予以保留原文。详情请参考英文原版。 --- ## 目录 1. [介绍与功能概述](#1-介绍与功能概述) 2. [缩略语与缩写](#2-缩略语与缩写) 3. [相关文档](#3-相关文档) 4. [约束与假设](#4-约束与假设) 5. [对其他模块的依赖](#5-对其他模块的依赖) 6. [需求可追溯性](#6-需求可追溯性) 7. [功能规范](#7-功能规范) 8. [API 规范](#8-api-规范) 9. [序列图](#9-序列图) 10. [配置规范](#10-配置规范) --- ## 1 介绍与功能概述 本规范描述 MCU [Microcontroller Unit] 驱动的功能和 API。MCU 驱动提供基本微控制器初始化、断电功能、复位以及其他 MCAL 软件模块所需的微控制器特定函数服务。除了启动代码之外,初始化服务允许灵活、面向应用的 MCU 初始化(见下图)。启动代码非常 MCU 特定。本文档中提供的启动代码描述仅供参考,意味着在标准化 MCU 初始化能够启动之前必须考虑的功能。 ``` Reset Not in scope of AUTOSAR STARTUP Code Bootloader Not Bootloader Needed Needed BOOTLOADER Standardized in MCU driver AUTOSAR additional initialization services power down service reset service ``` **图 1:MCU 驱动规范范围** MCU 驱动直接访问微控制器硬件,位于 Microcontroller Abstraction Layer (MCAL) 中。 **MCU 驱动特性**: - 初始化 MCU 时钟、PLL、时钟预分频器和 MCU 时钟分配 - 初始化 RAM 段 - 激活 µC 降功耗模式 - 激活 µC 复位 - 提供获取硬件复位原因的服务 --- ## 2 缩略语与缩写 | 缩写 | 描述 | | --- | --- | | uC | Microcontroller(微控制器) | | MCU | Micro Controller Unit(微控制器单元) | | SFR | Special Function Register(MCU 寄存器,专用功能寄存器) | | DEM | Diagnostic Event Manager(诊断事件管理器) | | DET | Default Error Tracer(默认错误跟踪器) | **表 1:缩略语与缩写** --- ## 3 相关文档 ### 3.1 输入文档 - [1] List of Basic Software Modules, AUTOSAR_TR_BSWModuleList.pdf - [2] Layered Software Architecture, AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf - [3] General Requirements on Basic Software Modules, AUTOSAR_SRS_BSWGeneral.pdf - [4] Specification of Default Error Tracer, AUTOSAR_SWS_DefaultErrorTracer.pdf - [5] Specification of ECU Configuration, AUTOSAR_TPS_ECUConfiguration.pdf - [6] Specification of Diagnostic Event Manager, AUTOSAR_SWS_DiagnosticEventManager.pdf - [7] Specification of ECU State Manager, AUTOSAR_SWS_ECUStateManager.pdf - [8] General Requirements on SPAL, AUTOSAR_SRS_SPALGeneral.pdf - [9] Requirements on MCU driver, AUTOSAR_SRS_MCUDriver.pdf - [10] Specification of Standard Types, AUTOSAR_SWS_StandardTypes.pdf - [11] Basic Software Module Description Template, AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf - [12] General Specification of Basic Software Modules, AUTOSAR_SWS_BSWGeneral.pdf ### 3.2 相关规范 AUTOSAR 提供了基础软件模块的通用规范[12] (SWS BSW General),该规范也适用于 MCU Driver。 因此,SWS BSW General 规范应被视为 MCU Driver 的附加且必需的规范。 --- ## 4 约束与假设 ### 4.1 限制 通常,MCU 降功耗模式的激活和配置在 AUTOSAR 标准化中不是强制性的。 ECU 或 µC 电源供应的使能/禁用不是 MCU 驱动的任务。这应由上层处理。 来自 MCAL Multicore Distribution 概念的所有需求在 SWS 和 RS 文档中均标记为 DRAFT。 ### 4.2 适用于汽车领域 无限制。 --- ## 5 对其他模块的依赖 ### 5.1 启动代码 在初始化 MCU 驱动之前,必须执行 MCU 的基本初始化。此 MCU 特定的初始化通常在启动代码中执行。 MCU 的启动代码应在上电及任何形式的微控制器复位后执行。它应执行非常基本和微控制器特定的启动初始化,并应保持简短,因为此时 MCU 时钟和 PLL 尚未初始化。启动代码应涵盖不属于其他 MCU 服务或其他 MCAL 驱动的 MCU 特定初始化。下面总结了应包含在启动代码中的基本功能。它仅作为指导列出,因为某些功能可能并非所有 MCU 都支持。 **启动代码主要任务**: 1. **中断和陷阱向量表基地址初始化**:这些基地址作为配置参数或 linker/locator 设置提供。 2. **中断栈指针初始化**:如果 MCU 支持中断栈,启动代码应初始化中断栈指针。 3. **用户栈指针初始化**:启动代码应初始化用户栈指针。 4. **上下文保存操作内存初始化**:如果 MCU 支持上下文保存操作,启动代码应初始化用于上下文保存操作的内存。 5. **看门狗保护**:启动代码应确保 MCU 内部看门狗在 MCAL 看门狗驱动初始化之前不被服务。例如可以通过增加看门狗服务时间来实现。 6. **缓存初始化**:如果 MCU 支持数据和/或代码缓存,应在启动代码中初始化并启用。 7. **内存特性初始化**:启动代码应初始化与内部内存相关的 MCU 特定特性,例如内存保护。 8. **外部内存初始化**:如果使用外部内存,应在启动代码中初始化该内存。 9. **MCU 时钟系统默认初始化**:在启动代码中应执行 MCU 时钟系统的默认初始化,包括全局时钟预分频器。 10. **SFR 保护机制使能**:如果 MCU 支持,启动代码应使能特殊功能寄存器(SFR)的保护机制。 11. **一次性可写寄存器初始化**:启动代码应初始化所有必要的写一次寄存器或对多个驱动通用的寄存器。 12. **基本 RAM 初始化**:启动代码应初始化最少量的 RAM,以允许 MCU 驱动服务及其调用者的正确执行。 **注**:启动代码是 ECU 和 MCU 相关的。规范的详细信息应在 MCU 的设计规范中描述。 ### 5.2 文件结构 #### 5.2.1 代码文件结构 注:本规范不定义代码文件结构。 --- ## 6 需求可追溯性 | 上层需求 | 描述 | 由以下需求满足 | | --- | --- | --- | | BSW13701 | - | SWS_Mcu_00207 | | SRS_BSW_00101 | 基础软件模块应能够在单独的初始化函数中初始化变量和硬件 | SWS_Mcu_00026 | | SRS_BSW_00327 | 错误值命名约定 | SWS_Mcu_00012 | | SRS_BSW_00337 | 开发错误分类 | SWS_Mcu_00012 | | SRS_BSW_00406 | 表明 BSW 模块是否已初始化的静态状态变量应在 BSW 模块的任何 API 被调用前以值 0 初始化 | SWS_Mcu_00026 | --- ## 7 功能规范 ### 7.1 通用行为 #### 7.1.1 背景与原理 MCU 驱动提供 Clock 和 RAM 初始化的 MCU 服务。在 MCU 配置集中,应配置 Clock(例如 PLL 设置)和 RAM(例如 section 基地址和大小)的 MCU 特定设置。 #### 7.1.2 需求 ##### 7.1.2.1 Reset(复位) [SWS_Mcu_00055] ⌈MCU 模块应提供一个服务以软件触发硬件复位。⌋ () 注:只有经过授权的用户才能调用此复位服务函数。 [SWS_Mcu_00052] ⌈如果硬件支持此特性,MCU 模块应提供服务以获取上次复位的原因。⌋ () 注:在一个 ECU 中,可以引起复位的源有多个。根据复位原因,在 MCU 重新初始化后可能需要多种应用场景。 ##### 7.1.2.2 Clock(时钟) [SWS_Mcu_00248] ⌈Mcu 应提供一个服务以使能和设置 MCU 时钟(即在 MCU 中必须配置 CPU clock、Peripheral Clock、Prescalers、Multipliers)。⌋ () 注:所有可用的 peripheral clocks 必须通过 McuClockReferencePoint 容器提供给其他 BSW 模块。 ##### 7.1.2.3 MCU Mode 服务 [SWS_Mcu_00164] ⌈MCU 模块应提供一个服务以激活 MCU 降功耗模式。⌋ () 激活降功耗模式的服务应允许访问 µC 硬件中可用的电源模式。 [SWS_Mcu_00165] ⌈模式数量和配置取决于 MCU,应在 MCU 模块的配置集中配置。⌋ () 注:激活 MCU 降功耗模式可能影响 PLL、内部振荡器、CPU 时钟、µC 外设时钟以及核心和外设的电源供应。 在典型操作中,ECU 运行时 MCU 降功耗模式将频繁进入和退出。在这种情况下,当在 MCAL 模块之一中激活唤醒时执行唤醒。 上层负责激活 MCU 正常操作(在执行 MCU 电源模式之前的条件)或关闭 µC 电源供应。 对于某些 MCU 模式配置,MCU 只能通过硬件复位唤醒。 ### 7.2 错误分类 #### 7.2.1 开发错误 [SWS_Mcu_00012] ⌈根据其构建版本(开发/生产模式),MCU 模块应能检测以下错误和异常: | 错误类型 | 相关性 | 相关错误代码 | 值 | | --- | --- | --- | --- | | API 服务以错误参数被调用 | Development | MCU_E_PARAM_CONFIG | 0x0A | | API 服务以错误参数被调用 | Development | MCU_E_PARAM_CLOCK | 0x0B | | API 服务以错误参数被调用 | Development | MCU_E_PARAM_MODE | 0x0C | | API 服务以错误参数被调用 | Development | MCU_E_PARAM_RAMSECTION | 0x0D | | API 服务以错误参数被调用 | Development | MCU_E_PLL_NOT_LOCKED | 0x0E | | API 服务以错误参数被调用 | Development | MCU_E_UNINIT | 0x0F | | API 服务以错误参数被调用 | Development | MCU_E_PARAM_POINTER | 0x10 | | API 服务以错误参数被调用 | Development | MCU_E_INIT_FAILED | 0x11 | **表 2:错误分类** ⌋ (SRS_BSW_00327, SRS_BSW_00337) #### 7.2.2 运行时错误 无运行时错误。 #### 7.2.3 瞬态故障 无瞬态故障。 #### 7.2.4 生产错误 本模块未指定生产错误。 #### 7.2.5 扩展生产错误(R4.1.1) | 错误类型 | 相关错误代码 | 值 | | --- | --- | --- | | 时钟源故障 | MCU_E_CLOCK_FAILURE | 由 DEM 分配 | [SWS_Mcu_00053] ⌈如果在配置集中启用了时钟故障通知且发生时钟源故障错误,应报告错误代码 MCU_E_CLOCK_FAILURE。(另见 SWS_Mcu_00051)。⌋ () ##### 7.2.5.1 MCU_E_CLOCK_FAILURE | 项 | 值 | | --- | --- | | 错误名称 | MCU_E_CLOCK_FAILURE | | 简短描述 | 时钟源故障 | | 详细描述 | 如果在配置集中启用了时钟故障通知且发生时钟源故障错误,应报告错误代码 MCU_E_CLOCK_FAILURE。 | | 检测准则 | Fail:见 SWS_Mcu_00257;Pass:见 SWS_Mcu_00258 | | 次要参数 | FAIL 或 PASS 检测激活的条件:配置集中启用了时钟故障通知 | | 时间要求 | 不适用 | | 监视频率 | 连续 | [SWS_Mcu_00257] ⌈MCU_E_CLOCK_FAILURE 的失败标准:发生时钟源故障⌋ () [SWS_Mcu_00258] ⌈MCU_E_CLOCK_FAILURE 的通过标准:未发生时钟源故障⌋ () ### 7.3 错误检测 详情请参阅 SWS_BSWGeneral 中第 7.2 章 "Error classification" 和第 7.3 章 "Error Detection"。 ### 7.4 错误通知 [SWS_Mcu_00051] ⌈MCU 驱动遵循标准化的 AUTOSAR 概念以报告生产错误。提供的回调例程在 Diagnostic Event Manager (DEM) 规范中规定(见 6)。⌋ () [SWS_Mcu_00226] ⌈生产错误不应作为被调用函数的返回值使用。⌋ () --- ## 8 API 规范 ### 8.1 导入类型 本章列出从下列模块中导入的所有类型: [SWS_Mcu_00152] ⌈ | 模块 | 头文件 | 导入类型 | | --- | --- | --- | | Dem | Rte_Dem_Type.h | Dem_EventIdType | | Dem | Rte_Dem_Type.h | Dem_EventStatusType | | Std_Types | StandardTypes.h | Std_ReturnType | | Std_Types | StandardTypes.h | Std_VersionInfoType | ⌋ () ### 8.2 类型定义 #### 8.2.1 Mcu_ConfigType [SWS_Mcu_00249] ⌈ | 项 | 值 | | --- | --- | | Name | Mcu_ConfigType | | Type | Structure | | Range | 硬件依赖的结构 - 用于保存 MCU 驱动配置的结构 | | Description | 指向此结构的指针被提供给 MCU 初始化例程以进行配置。 | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00131] ⌈结构 Mcu_ConfigType 是一个外部数据结构(即实现特定),应包含 MCU 模块的初始化数据。它应包含: - MCU 依赖属性 - 复位配置 - MCU 模式定义 - 时钟设置定义 - RAM 段定义 ⌋ () [SWS_Mcu_00054] ⌈如果 MCU 提供此类检测的中断,结构 Mcu_ConfigType 应提供可配置(使能/禁用)的时钟故障通知。⌋ () 如果时钟故障通过其他硬件机制检测(例如生成陷阱),此通知应被禁用,故障报告应在 MCU 驱动外部完成。 [SWS_Mcu_00035] ⌈结构 Mcu_ConfigType 内每个 MCU 模式的定义应包含(取决于 MCU): - MCU 特定属性 - CPU clock 变更 - Peripheral clock 变更 - PLL 设置变更 - MCU 电源供应变更⌋ () [SWS_Mcu_00031] ⌈结构 Mcu_ConfigType 内每个时钟设置的定义应包含: - MCU 特定属性,例如时钟安全特性和特殊时钟分配设置 - PLL 设置/启动锁定选项 - 内部振荡器设置⌋ () [SWS_Mcu_00030] ⌈结构 Mcu_ConfigType 内每个 RAM 段的定义应包含: - RAM 段基地址 - 段大小 - 要初始化的数据预设值 - RAM 写入大小⌋ () 允许使用 linker symbols 代替标量值。 #### 8.2.2 Mcu_PllStatusType [SWS_Mcu_00250] ⌈ | 项 | 值 | | --- | --- | | Name | Mcu_PllStatusType | | Type | Enumeration | | Range | MCU_PLL_LOCKED - PLL 已锁定
MCU_PLL_UNLOCKED - PLL 未锁定
MCU_PLL_STATUS_UNDEFINED - PLL 状态未知 | | Description | 这是 MCU 模块 Mcu_GetPllStatus 函数返回的状态值。 | | Available via | Mcu.h | ⌋ () #### 8.2.3 Mcu_ClockType [SWS_Mcu_00251] ⌈ | 项 | 值 | | --- | --- | | Name | Mcu_ClockType | | Type | uint | | Range | 0..<时钟设置数> - 1 - 范围取决于配置结构中提供的不同时钟设置数。应根据 MCU 平台选择类型以获得最佳性能。 | | Description | 指定时钟设置的标识(ID),在配置结构中配置 | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00233] ⌈类型应为 uint8、uint16 或 uint32,取决于 uC 平台。⌋ () #### 8.2.4 Mcu_ResetType [SWS_Mcu_00252] ⌈ | 项 | 值 | | --- | --- | | Name | Mcu_ResetType | | Type | Enumeration | | Range | MCU_POWER_ON_RESET - Power On Reset(默认)
MCU_WATCHDOG_RESET - 内部 Watchdog Timer Reset
MCU_SW_RESET - Software Reset
MCU_RESET_UNDEFINED - Reset 未定义 | | Description | 这是复位枚举的类型,包含复位类型的子集。并非要求所有复位类型都由硬件支持。 | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00134] ⌈MCU 模块应至少为枚举 Mcu_ResetType 提供 MCU_POWER_ON_RESET 和 MCU_RESET_UNDEFINED 值。⌋ () 注:可根据 MCU 添加 Mcu_ResetType 的其他复位类型。 #### 8.2.5 Mcu_RawResetType [SWS_Mcu_00253] ⌈ | 项 | 值 | | --- | --- | | Name | Mcu_RawResetType | | Type | uint | | Range | MCU 依赖的寄存器值 - 应根据 MCU 平台选择类型以获得最佳性能 | | Description | 此类型指定从复位状态寄存器读取的原始寄存器格式的复位原因 | | Available via | Mcu.h | ⌋ () #### 8.2.6 Mcu_ModeType [SWS_Mcu_00254] ⌈ | 项 | 值 | | --- | --- | | Name | Mcu_ModeType | | Type | uint | | Range | 0.. - 1 - 范围取决于配置结构中提供的 MCU 模式数 | | Description | 此类型指定 MCU 模式的标识(ID),在配置结构中配置 | | Available via | Mcu.h | ⌋ () #### 8.2.7 Mcu_RamSectionType [SWS_Mcu_00255] ⌈ | 项 | 值 | | --- | --- | | Name | Mcu_RamSectionType | | Type | uint | | Range | 0.. - 1 - 范围取决于配置结构中提供的 RAM 段数 | | Description | 此类型指定 RAM 段的标识(ID),在配置结构中配置 | | Available via | Mcu.h | ⌋ () #### 8.2.8 Mcu_RamStateType [SWS_Mcu_00256] ⌈ | 项 | 值 | | --- | --- | | Name | Mcu_RamStateType | | Type | Enumeration | | Range | MCU_RAMSTATE_INVALID - RAM 内容无效或未知(默认)
MCU_RAMSTATE_VALID - RAM 内容有效 | | Description | 这是 Mcu 模块 Mcu_GetRamState 函数返回的 Ram 状态数据类型。并非要求所有 RAM 状态类型都由硬件支持。 | | Available via | Mcu.h | ⌋ () ### 8.3 函数定义 这是为上层模块提供的函数列表。 #### 8.3.1 Mcu_Init [SWS_Mcu_00153] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_Init | | Syntax | `void Mcu_Init(const Mcu_ConfigType* ConfigPtr)` | | Service ID[hex] | 0x00 | | Sync/Async | Synchronous | | Reentrancy | Non Reentrant | | Parameters (in) | ConfigPtr - 指向 MCU 驱动配置集的指针 | | Description | 此服务初始化 MCU 驱动 | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00026] ⌈函数 Mcu_Init 应初始化 MCU 模块,即使断电、时钟和 RAM 段的配置设置在 MCU 模块内可见。⌋ (SRS_BSW_00101, SRS_BSW_00406) 注:执行函数 Mcu_Init 后,配置数据可访问并可被 MCU 模块函数(例如 Mcu_InitRamSection)使用。 MCU 模块的实现者在函数 Mcu_Init 中应应用以下关于控制器寄存器初始化的规则: 1. [SWS_Mcu_00116] ⌈如果硬件只允许该寄存器的一次使用,实现该功能的驱动模块负责初始化该寄存器。⌋ () 2. [SWS_Mcu_00244] ⌈如果该寄存器可影响多个硬件模块且为 I/O 寄存器,应由 PORT 驱动初始化。⌋ () 3. [SWS_Mcu_00245] ⌈如果该寄存器可影响多个硬件模块且不是 I/O 寄存器,应由此 MCU 驱动初始化。⌋ () 4. [SWS_Mcu_00246] ⌈在复位后需要立即初始化的一次性可写寄存器应由启动代码初始化。⌋ () 5. [SWS_Mcu_00247] ⌈所有未提及的其他寄存器应由启动代码初始化。⌋ () 注:术语 'Hardware Module' 指的是 MCU 的内部模块,而不是 BSW 模块。 #### 8.3.2 Mcu_InitRamSection [SWS_Mcu_00154] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_InitRamSection | | Syntax | `Std_ReturnType Mcu_InitRamSection(Mcu_RamSectionType RamSection)` | | Service ID[hex] | 0x01 | | Sync/Async | Synchronous | | Reentrancy | Non Reentrant | | Parameters (in) | RamSection - 选择配置集中提供的 RAM 内存段 | | Return value | Std_ReturnType - E_OK:命令已被接受;E_NOT_OK:命令未被接受(例如参数错误) | | Description | 此服务按段初始化 RAM | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00011] ⌈函数 Mcu_InitRamSection 应从地址 McuRamSectionBaseAddress 到地址 McuRamSectionBaseAddress + McuRamSectionSize-1 填充内存,使用 McuRamDefaultValue 中包含的字节值,一次写入由 McuRamSectionWriteSize 定义的字节数。其中 McuRamSectionBaseAddress、McuRamSectionSize、McuRamDefaultValue 和 McuRamSectionWriteSize 是每个 RamSection 的配置参数值(见 SWS_Mcu_00030)。⌋ () [SWS_Mcu_00136] ⌈MCU 模块的环境应仅在使用函数 Mcu_Init 初始化 MCU 模块后调用函数 Mcu_InitRamSection。⌋ () #### 8.3.3 Mcu_InitClock [SWS_Mcu_00155] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_InitClock | | Syntax | `Std_ReturnType Mcu_InitClock(Mcu_ClockType ClockSetting)` | | Service ID[hex] | 0x02 | | Sync/Async | Synchronous | | Reentrancy | Non Reentrant | | Parameters (in) | ClockSetting - 时钟设置 | | Return value | Std_ReturnType - E_OK:命令已被接受;E_NOT_OK:命令未被接受 | | Description | 此服务初始化 PLL 和其他 MCU 特定时钟选项 | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00137] ⌈函数 Mcu_InitClock 应初始化 PLL 和其他 MCU 特定时钟选项。时钟配置参数通过配置结构提供。⌋ () [SWS_Mcu_00138] ⌈函数 Mcu_InitClock 应启动 PLL 锁定过程(如果应初始化 PLL),并在不等待 PLL 锁定的情况下返回。⌋ () [SWS_Mcu_00210] ⌈如果参数 McuInitClock 设置为 FALSE,则函数 Mcu_InitClock 应被禁用。相反,如果前一参数设置为 TRUE,则此函数可用(另见 ECUC_Mcu_00118)。⌋ () #### 8.3.4 Mcu_DistributePllClock [SWS_Mcu_00156] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_DistributePllClock | | Syntax | `Std_ReturnType Mcu_DistributePllClock(void)` | | Service ID[hex] | 0x03 | | Sync/Async | Synchronous | | Reentrancy | Non Reentrant | | Return value | Std_ReturnType - E_OK:命令已被接受;E_NOT_OK:命令未被接受 | | Description | 此服务激活 PLL 时钟到 MCU 时钟分配 | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00140] ⌈函数 Mcu_DistributePllClock 应激活 PLL 时钟到 MCU 时钟分配。⌋ () [SWS_Mcu_00141] ⌈函数 Mcu_DistributePllClock 应从 MCU 时钟分配中移除当前时钟源(例如内部振荡器时钟)。⌋ () MCU 模块的环境应仅在 PLL 状态通过函数 Mcu_GetPllStatus 检测为锁定后,才调用函数 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)。⌋ () #### 8.3.5 Mcu_GetPllStatus [SWS_Mcu_00157] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_GetPllStatus | | Syntax | `Mcu_PllStatusType Mcu_GetPllStatus(void)` | | Service ID[hex] | 0x04 | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Return value | Mcu_PllStatusType - PLL 状态 | | Description | 此服务提供 PLL 的锁定状态 | | Available via | Mcu.h | ⌋ () [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)。⌋ () #### 8.3.6 Mcu_GetResetReason [SWS_Mcu_00158] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_GetResetReason | | Syntax | `Mcu_ResetType Mcu_GetResetReason(void)` | | Service ID[hex] | 0x05 | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Return value | Mcu_ResetType | | Description | 此服务从硬件读取复位类型(如支持) | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00005] ⌈函数 Mcu_GetResetReason 应从硬件读取复位原因并返回此原因(如硬件支持)。如果硬件不支持复位原因的硬件检测,函数 Mcu_GetResetReason 的返回值应始终为 MCU_POWER_ON_RESET。⌋ () [SWS_Mcu_00133] ⌈如果此函数在调用函数 Mcu_Init 之前被调用,且硬件支持,函数 Mcu_GetResetReason 应返回 MCU_RESET_UNDEFINED。⌋ () 用户应确保复位原因在读出后被清除,以避免多个复位原因。 注:此函数多次调用时,返回值应始终相同。 #### 8.3.7 Mcu_GetResetRawValue [SWS_Mcu_00159] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_GetResetRawValue | | Syntax | `Mcu_RawResetType Mcu_GetResetRawValue(void)` | | Service ID[hex] | 0x06 | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Return value | Mcu_RawResetType - 复位原始值 | | Description | 此服务从硬件寄存器读取复位类型(如支持) | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00135] ⌈如果此函数在调用函数 Mcu_Init 之前被调用,且硬件支持,函数 Mcu_GetResetRawValue 应返回一个不对应于复位状态寄存器有效值且不等于 0 的实现特定值。⌋ () [SWS_Mcu_00006] ⌈如果硬件支持,函数 Mcu_GetResetRawValue 应从硬件寄存器读取复位原始值。如果硬件没有复位状态寄存器,返回值应为 0x0。⌋ () #### 8.3.8 Mcu_PerformReset [SWS_Mcu_00160] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_PerformReset | | Syntax | `void Mcu_PerformReset(void)` | | Service ID[hex] | 0x07 | | Sync/Async | Synchronous | | Reentrancy | Non Reentrant | | Description | 此服务执行微控制器复位 | | Available via | Mcu.h | ⌋ () [SWS_Mcu_00143] ⌈函数 Mcu_PerformReset 应使用微控制器的硬件特性执行微控制器复位。⌋ () [SWS_Mcu_00144] ⌈函数 Mcu_PerformReset 应执行配置集中配置的复位类型。⌋ () [SWS_Mcu_00145] ⌈MCU 模块的环境应仅在 MCU 模块由函数 Mcu_Init 初始化后,调用函数 Mcu_PerformReset。⌋ () [SWS_Mcu_00146] ⌈仅当预编译参数 McuPerformResetApi 设置为 TRUE 时,函数 Mcu_PerformReset 才可用。如果设置为 FALSE,函数 Mcu_PerformReset 不适用(见 10.2.2 节)。⌋ () #### 8.3.9 Mcu_SetMode [SWS_Mcu_00161] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_SetMode | | Syntax | `void Mcu_SetMode(Mcu_ModeType McuMode)` | | Service ID[hex] | 0x08 | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Parameters (in) | McuMode - 设置配置集中配置的不同 MCU 电源模式 | | Description | 此服务激活 MCU 电源模式 | | Available via | Mcu.h | ⌋ () [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 尚未将控制器设置为断电模式)来实现。 #### 8.3.10 Mcu_GetVersionInfo [SWS_Mcu_00162] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_GetVersionInfo | | Syntax | `void Mcu_GetVersionInfo(Std_VersionInfoType* versioninfo)` | | Service ID[hex] | 0x09 | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Parameters (out) | versioninfo - 用于存储此模块版本信息的指针 | | Description | 此服务返回此模块的版本信息 | | Available via | Mcu.h | ⌋ () #### 8.3.11 Mcu_GetRamState [SWS_Mcu_00207] ⌈ | 项 | 值 | | --- | --- | | Service name | Mcu_GetRamState | | Syntax | `Mcu_RamStateType Mcu_GetRamState(void)` | | Service ID[hex] | 0x0a | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Return value | Mcu_RamStateType - Ram 内容的状态 | | Description | 此服务提供微控制器 Ram 的实际状态(如支持) | | Available via | Mcu.h | ⌋ (BSW13701) 注:某些微控制器提供检查 Ram 状态在复位后是否有效的功能。Mcu_GetRamState 函数可用于此目的。 [SWS_Mcu_00208] ⌈MCU 模块的环境应仅在使用函数 Mcu_Init 初始化 MCU 模块后调用此函数。⌋ () [SWS_Mcu_00209] ⌈如果预编译参数 McuGetRamStateApi 设置为 TRUE,函数 Mcu_GetRamState 应对用户可用。相反,如果前一参数设置为 FALSE,此函数应被禁用(例如硬件不支持此功能)。⌋ () ### 8.4 回调通知 MCU 驱动没有回调通知。回调通知在另一模块(ICU 驱动和/或 complex drivers)中实现。 ### 8.5 调度函数 MCU 驱动内无调度函数。 ### 8.6 预期接口 本章列出从其他模块所需的所有接口。 #### 8.6.1 强制接口 [SWS_Mcu_00166] ⌈ | API 函数 | 头文件 | 描述 | | --- | --- | --- | | Dem_SetEventStatus | Dem.h | 由 SW-Cs 或 BSW 模块调用以向 Dem 报告监视状态信息。调用 Dem_SetEventStatus 的 BSW 模块可以安全地忽略返回值。 | ⌋ () #### 8.6.2 可选接口 [SWS_Mcu_00163] ⌈ | API 函数 | 头文件 | 描述 | | --- | --- | --- | | Det_ReportError | Det.h | 报告开发错误的服务 | ⌋ () ### 8.7 API 参数检查 [SWS_Mcu_00017] ⌈如果为 MCU 模块启用了开发错误检测,MCU 函数应检查以下 API 参数,向 Default Error Tracer 报告检测到的错误,如果函数具有标准返回类型则以返回值 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。⌋ () --- ## 9 序列图 ### 9.1 MCU 初始化服务示例序列 典型 MCU 初始化序列如下: ``` User «module» Mcu Mcu_Init(const Mcu_ConfigType*) Mcu_Init() Mcu_InitClock(Mcu_ClockType): Std_ReturnType Mcu_InitClock() Mcu_InitRamSection(Mcu_RamSectionType): Std_ReturnType Mcu_InitRamSection() Mcu_GetPllStatus(): Mcu_PllStatusType Mcu_GetPllStatus() Mcu_DistributePllClock(): Std_ReturnType Mcu_DistributePllClock() Mcu_InitRamSection(Mcu_RamSectionType): Std_ReturnType Mcu_InitRamSection() ``` **图 3:序列图 – MCU 初始化** 服务的顺序仅作为示例,可能因用户而异。Mcu_Init 应在上电后首先执行。用户通过执行 Mcu_GetPllStatus 来确保 PLL 已锁定。 ### 9.2 Mcu_GetResetReason ``` User «module» 函数同步执行 Mcu Mcu_GetResetReason(): Mcu_ResetType Mcu_GetResetReason() ``` ### 9.3 Mcu_GetResetRawValue ``` User «module» 函数同步执行 Mcu Mcu_GetResetRawValue(): Mcu_RawResetType Mcu_GetResetRawValue() ``` ### 9.4 Mcu_PerformReset ``` User «module» 函数同步执行 Mcu Mcu_PerformReset() Hardware reset() ``` --- ## 10 配置规范 本章定义配置参数及其在容器中的聚类。 ### 10.1 如何阅读本章 详情请参阅 SWS_BSWGeneral 中第 10.1 章 "Introduction to configuration specification"。 ### 10.2 容器与配置参数 [SWS_Mcu_00126] ⌈此模块的初始化函数应始终具有一个指针作为参数,即使对于 VARIANT-PRE-COMPILE 不应提供配置集。相反,应将 NULL 指针传递给初始化函数。⌋ () [SWS_Mcu_00259] DRAFT ⌈MCU Driver 模块应拒绝具有实现不支持的分区映射的配置。⌋ () [SWS_Mcu_CONSTR_00001] DRAFT ⌈模块将作为每个分区中的独立实例运行,这意味着被调用的 API 仅针对它在其中被调用的分区。⌋ () #### 10.2.1 Mcu | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00189 | | Module Name | Mcu | | Module Description | Mcu (Microcontroller Unit) 模块的配置 | | Post-Build Variant Support | true | | Supported Config Variants | VARIANT-POST-BUILD, VARIANT-PRE-COMPILE | **包含的容器**: - **McuGeneralConfiguration** (1):此容器包含 MCU 驱动的配置(参数) - **McuModuleConfiguration** (1):此容器包含 MCU 驱动的配置(参数) - **McuPublishedInformation** (1):包含所有 MCU 特定已发布信息参数的容器 #### 10.2.2 McuGeneralConfiguration | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00118 | | Container Name | McuGeneralConfiguration | | Description | 此容器包含 MCU 驱动的配置(参数) | **主要配置参数**: - **McuDevErrorDetect** (ECUC_Mcu_00166):开关开发错误检测和通知的开/关 - true:启用检测和通知 - false:禁用检测和通知 - **McuGetRamStateApi** (ECUC_Mcu_00181):预处理器开关,用于启用/禁用 API Mcu_GetRamState(例如硬件不支持该功能时,可使用此参数禁用 API) - **McuInitClock** (ECUC_Mcu_00182):如果设置为 FALSE,时钟初始化必须从 MCU 驱动禁用。此概念适用于存在某些一次性可写时钟寄存器和 bootloader 时。如果设置为 TRUE,MCU 驱动负责时钟初始化 - **McuNoPll** (ECUC_Mcu_00180):如果硬件没有 PLL 或 PLL 电路在上电后无需软件介入即被启用,应将此参数设置为 True。在这种情况下,MCU_DistributePllClock 必须禁用且 MCU_GetPllStatus 必须返回 MCU_PLL_STATUS_UNDEFINED。否则此参数必须设置为 False - **McuPerformResetApi** (ECUC_Mcu_00167):预处理器开关,用于启用/禁用 Mcu_PerformReset() 函数的使用 - **McuVersionInfoApi** (ECUC_Mcu_00168):预处理器开关,用于启用/禁用读取模块版本信息的 API - **McuEcucPartitionRef** (ECUC_Mcu_00191):将 MCU 驱动映射到零个或多个 ECUC partition 以使驱动 API 在此分区中可用(Draft) #### 10.2.3 McuModuleConfiguration | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00119 | | Container Name | McuModuleConfiguration | | Description | 此容器包含 MCU 驱动的配置(参数) | **主要配置参数**: - **McuClockSrcFailureNotification** (ECUC_Mcu_00170):启用/禁用时钟故障通知。如果硬件不支持此特性,设置应为 disabled - DISABLED - ENABLED - **McuNumberOfMcuModes** (ECUC_Mcu_00171):此参数应表示 MCU 可用的模式数 - 计算公式 = 配置的 McuModeSettingConf 数 - **McuRamSectors** (ECUC_Mcu_00172):此参数应表示 MCU 可用的 RAM sector 数 - 计算公式 = 配置的 McuRamSectorSettingConf 数 - **McuResetSetting** (ECUC_Mcu_00173):此参数与 MCU 特定的复位配置相关。适用于使用微控制器硬件特性执行微控制器复位的 Mcu_PerformReset 函数 **包含的容器**: - **McuClockSettingConfig** (1..*):此容器包含 MCU Clock 设置的配置(参数) - **McuDemEventParameterRefs** (0..1):对 DemEventParameter 元素的引用容器,在发生相应错误时应使用 API Dem_SetEventStatus 调用 - **McuModeSettingConf** (1..*):此容器包含 MCU Mode 设置的配置(参数) - **McuRamSectorSettingConf** (0..*):此容器包含 RAM Sector 设置的配置(参数) #### 10.2.4 McuClockSettingConfig | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00124 | | Container Name | McuClockSettingConfig | | Description | 此容器包含 MCU Clock 设置的配置(参数)。MCU 时钟设置更多信息请参阅 MCU031 | **主要配置参数**: - **McuClockSettingId** (ECUC_Mcu_00183):用作 API 调用 "Mcu_InitClock" 参数的 McuClockSettingConfig 的 Id **包含的容器**: - **McuClockReferencePoint** (1..*):此容器定义 Mcu Clock 树中的参考点 #### 10.2.5 McuDemEventParameterRefs | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00187 | | Container Name | McuDemEventParameterRefs | | Description | 对 DemEventParameter 元素的引用容器,在发生相应错误时应使用 API Dem_SetEventStatus 调用 | **主要配置参数**: - **MCU_E_CLOCK_FAILURE** (ECUC_Mcu_00188):对配置的 DEM 事件的引用,以报告"时钟源故障" #### 10.2.6 McuModeSettingConf | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00123 | | Container Name | McuModeSettingConf | | Description | 此容器包含 MCU Mode 设置的配置(参数) | **主要配置参数**: - **McuMode** (ECUC_Mcu_00176):此参数表示 MCU Mode 设置 #### 10.2.7 McuRamSectorSettingConf | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00120 | | Container Name | McuRamSectorSettingConf | | Description | 此容器包含 RAM Sector 设置的配置(参数) | **主要配置参数**: - **McuRamDefaultValue** (ECUC_Mcu_00177):此参数应表示要初始化的数据预设值 - **McuRamSectionBaseAddress** (ECUC_Mcu_00178):此参数应表示 MCU RAM 段基地址 - **McuRamSectionSize** (ECUC_Mcu_00179):此参数表示 MCU RAM 段大小(以字节为单位) - **McuRamSectionWriteSize** (ECUC_Mcu_00190):此参数应定义可一次写入 RAM 的数据大小(以字节为单位),默认值为 8 #### 10.2.8 McuClockReferencePoint | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00174 | | Container Name | McuClockReferencePoint | | Description | 此容器定义 Mcu Clock 树中的参考点。它定义可被其他模块用作输入值的频率 | **主要配置参数**: - **McuClockReferencePointFrequency** (ECUC_Mcu_00175):特定 McuClockReferencePoint 容器实例的频率,应以 Hz 表示 #### 10.2.9 McuPublishedInformation | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00184 | | Container Name | McuPublishedInformation | | Description | 包含所有 MCU 特定已发布信息参数的容器 | **包含的容器**: - **McuResetReasonConf** (1..*):此容器包含可从 Mcu_GetResetReason API 检索的不同类型复位原因的配置 #### 10.2.10 McuResetReasonConf | 项 | 值 | | --- | --- | | SWS Item | ECUC_Mcu_00185 | | Container Name | McuResetReasonConf | | Description | 此容器包含可从 Mcu_GetResetReason API 检索的不同类型复位原因的配置 | **主要配置参数**: - **McuResetReason** (ECUC_Mcu_00186):此参数表示微控制器支持的不同类型的复位。此参数由 ECU 状态管理器模块中的参数 EcuMResetReason 引用 ### 10.3 已发布信息 详情请参阅 SWS_BSWGeneral 中第 10.3 章 "Published Information"。 --- ## 翻译说明 - 本文档由 AUTOSAR CP 4.4.0 英文原文翻译。 - 模块缩写(MCU、MCAL、PLL、CPU、RAM、SFR、DEM、DET、EcuM、BSW、ECU 等)保留原文。 - API 标识符(Mcu_Init、Mcu_InitClock、Mcu_SetMode 等)保留原文。 - 需求 ID(SWS_Mcu_xxxxx、SRS_BSW_xxxxx、ECUC_Mcu_xxxxx)保留原文。 - AUTOSAR 方括号符 `⌈ ⌋` 保留原貌,以保持需求结构的可追溯性。 - 版权声明保持英文原文。 - 跨文档引用以英文文件名形式保留。 - 错误代码(MCU_E_UNINIT、MCU_E_CLOCK_FAILURE 等)、复位类型(MCU_POWER_ON_RESET、MCU_WATCHDOG_RESET 等)、PLL 状态(MCU_PLL_LOCKED 等)等以英文枚举形式保留。 - 由于源文档大量使用图形和复杂表格,部分图形以简化的代码块形式展示,文字描述保持完整。