# PWM 驱动规范(Specification of PWM Driver) > **AUTOSAR CP Release 4.4.0** ## 文档元信息 | 字段 | 内容 | |---|---| | **文档标题** | PWM 驱动规范(Specification of PWM Driver) | | **文档所有者** | AUTOSAR | | **文档责任方** | AUTOSAR | | **文档标识号** | 037 | | **文档状态** | Final(最终版) | | **所属 AUTOSAR 标准** | Classic Platform(经典平台) | | **所属标准版本** | 4.4.0 | ## 文档变更历史(Document Change History) | 日期 | 版本 | 变更人 | 变更描述 | |---|---|---|---| | 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 引入 MCAL 多核分发(Draft)概念;移除过时元素;头文件清理;修正自动化文档处理的文档结构 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 添加运行时错误分类;移除 SWS_Pwm_20069、SWS_Pwm_10120 和 SWS_Pwm_20120 | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 更新 Pwm_GetOutputState 返回值需求 SWS_Pwm_30051 及其引用;更新 PwmChannelID 的配置类;移除配置变体定义;移除 BSW 需求的未解析引用;更新头文件结构图 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 移除关于 NULL_PTR 检查的需求;DET 已重命名 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 更新代码文件结构需求的追踪引用 | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 引入 McuClockReferencePoint;编辑性变更 | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 更新与 PwmPowerStateAsynchTransitionMode 相关的需求;更新计划函数章节;编辑性变更;移除变更文档章节 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 新增 ECU 降级概念;适配新的 SWS BSW General;拆分内存映射头 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | 重新阐述 SWS_Pwm_00045 | | 2010-09-30 | 3.1.5 | AUTOSAR Administration | 新错误符号 PWM_E_PARAM_POINTER:在 API Pwm_GetVersionInfo 以 NULL 参数调用时报告;更新版本检查章节;措辞和维护性改进 | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 解释 Pwm_SetPeriodAndDuty 函数在零周期输入值时的行为;新增调试支持章节;拆分某些需求使每个 ID 唯一;法律声明修订 | | 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律声明修订 | | 2007-12-21 | 3.0.1 | AUTOSAR Administration | 从 UML 模型生成的表和链接到 UML 模型的 UML 图;通用需求的改进以为 CT 开发做准备;IDLE PWM 通道的重新激活概念适配;已初始化模块的开发错误添加;文档元信息扩展;小幅布局调整 | | 2007-01-24 | 2.1.15 | AUTOSAR Administration | 更新文件包含结构;为 PWM API 添加 ON/OFF 配置宏;将配置参数 PWM_PERIOD_UPDATED_ENDPERIOD 重命名为 PwmPeriodUpdatedEndperiod;更新 PWM 信号描述图;法律声明修订;"用户建议"修订;"修订信息"新增 | | 2006-05-16 | 2.0 | AUTOSAR Administration | 文档结构适配通用 Release 2.0 SWS 模板;修改 PWM 通道的抽象级别;通知可配置;更新模块的配置 | | 2005-05-31 | 1.0 | AUTOSAR Administration | 初始发布 | --- ## 目录(Table of Contents) 1. [引言与功能概述(Introduction and functional overview)](#1-引言与功能概述) 2. [缩略语与缩写(Acronyms and abbreviations)](#2-缩略语与缩写) 3. [相关文档(Related documentation)](#3-相关文档) - 3.1 [输入文档(Input documents)](#31-输入文档) - 3.2 [相关规范(Related specification)](#32-相关规范) 4. [约束与假设(Constraints and assumptions)](#4-约束与假设) - 4.1 [限制(Limitations)](#41-限制) - 4.2 [对汽车领域的适用性(Applicability to car domains)](#42-对汽车领域的适用性) 5. [对其他模块的依赖(Dependencies to other modules)](#5-对其他模块的依赖) - 5.1 [文件结构(File structure)](#51-文件结构) 6. [需求可追溯性(Requirements traceability)](#6-需求可追溯性) 7. [功能规范(Functional specification)](#7-功能规范) 8. [API 规范(API specification)](#8-api-规范) 9. [序列图(Sequence diagrams)](#9-序列图) 10. [配置规范(Configuration specification)](#10-配置规范) 11. [不适用需求(Not applicable requirements)](#11-不适用需求) --- ## 1 引言与功能概述(Introduction and functional overview) 本规范规定了 AUTOSAR 基础软件模块 PWM 驱动的功能、API 和配置。 每个 PWM 通道链接到属于微控制器的硬件 PWM。PWM 信号的类型(例如中心对齐、左对齐等)不在本规范中定义,留给实现。 驱动提供用于初始化和控制微控制器内部 PWM 级(脉宽调制)的功能。PWM 模块生成具有可变脉冲宽度的脉冲。它允许选择占空比和信号周期时间。 **图 1:PWM 信号描述** --- ## 2 缩略语与缩写(Acronyms and abbreviations) | 缩略语 | 描述 | |---|---| | PWM Channel | 链接到硬件 PWM 的数字标识符 | | PWM Output State | 定义 PWM 信号的输出状态。可以是:
- High(高)
- Low(低) | | PWM Idle State | 空闲状态表示在调用 Pwm_SetOutputToIdle 或 Pwm_DeInit 之后 PWM 通道的输出状态 | | PWM Polarity | 定义每个 PWM 通道的起始输出状态 | | PWM Duty cycle | 定义相对于周期的起始电平(高或低)的百分比 | | PWM period | 定义 PWM 信号的周期 | | 缩写 | 描述 | |---|---| | PWM | 脉宽调制(Pulse Width Modulation) | | DEM | 诊断事件管理器(Diagnostic Event Manager) | | DET | 默认错误跟踪器(Default Error Tracer) | | MCU | 微控制器单元(Microcontroller Unit) | | PLL | 锁相环(Phase Locked Loop) | | ISR | 中断服务例程(Interrupt Service Routine) | --- ## 3 相关文档(Related documentation) ### 3.1 输入文档(Input documents) - **[1]** 分层软件架构,AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf - **[2]** SPAL 的一般需求,AUTOSAR_SRS_SPALGeneral.pdf - **[3]** 基础软件模块的一般需求,AUTOSAR_SRS_BSWGeneral.pdf - **[4]** 默认错误跟踪器规范,AUTOSAR_SWS_DefaultErrorTracer.pdf - **[5]** MCU 驱动规范,AUTOSAR_SWS_MCUDriver.pdf - **[6]** ECU 配置规范,AUTOSAR_TPS_ECUConfiguration.pdf - **[7]** 基础软件模块描述模板,AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf - **[8]** 基础软件模块列表,AUTOSAR_TR_BSWModuleList - **[9]** 基础软件模块通用规范,AUTOSAR_SWS_BSWGeneral.pdf ### 3.2 相关规范(Related specification) AUTOSAR 提供了基础软件模块的通用规范 [9](SWS BSW General),这也适用于 PWM 驱动。 因此,SWS BSW General 规范应被视为 PWM 驱动的附加和必需规范。 --- ## 4 约束与假设(Constraints and assumptions) ### 4.1 限制(Limitations) **[SWS_Pwm_00001]** ⌈PWM SWS 不涵盖通用 I/O 上的 PWM 仿真。⌋ (SRS_Pwm_12386) - 电源状态控制 API 仅在 MCAL 驱动拥有完整的底层 HW 外设(即 HW 外设未被其他 MCAL 模块访问)时可实现。 ### 4.2 对汽车领域的适用性(Applicability to car domains) 无限制。 --- ## 5 对其他模块的依赖(Dependencies to other modules) PWM 依赖于系统时钟。因此,系统时钟的更改(例如 PLL on → PLL off)也会影响 PWM 硬件的时钟设置。 PWM 驱动依赖于以下模块: - **PORT 驱动**:用于设置端口引脚功能(PWM141) - **MCU 驱动**:用于设置预分频器、系统时钟和 PLL(PWM142) - **DET**:开发模式下的默认错误跟踪器(PWM143) 文档 087_AUTOSAR_ECU_Configuration 包含章节 4.6 - 时钟树配置,详细说明了向外设提供参考时钟信号的机制。 ### 5.1 文件结构(File structure) #### 5.1.1 代码文件结构(Code file structure) **[SWS_Pwm_00065]** ⌈PWM SWS 不应定义代码文件结构。⌋ (SRS_BSW_00346, SRS_BSW_00158, SRS_BSW_00314) #### 5.1.2 头文件结构(Header file structure) - **[SWS_Pwm_50075]** ⌈Pwm.c 应包含 Pwm.h、Det.h 和 ... ⌋ () - **[SWS_Pwm_70075]** ⌈Pwm_Irq.c 应包含 Pwm.h。⌋ () --- ## 6 需求可追溯性(Requirements traceability) > **摘要说明:** 本节列出 BSW 和 SPAL 通用需求与 PWM 驱动特定需求(SWS_Pwm_xxxxx)的对应关系。完整的可追溯性表见原文 PDF,主要包括以下类别: > > - **通用 BSW 需求**(SRS_BSW_xxxxx):模块版本、初始化、配置、命名约定、错误处理、内存映射等 > - **SPAL 特定需求**(SRS_SPAL_xxxxx):初始化接口、通知机制、模式选择、ISR、休眠源等 > - **PWM 特定 SRS 需求**(SRS_Pwm_xxxxx):占空比设置、周期设置、通知开关、参数配置等 > > 关键映射: > - SWS_Pwm_00007(Init 函数)← SRS_BSW_00101, SRS_SPAL_12057 > - SWS_Pwm_00010(DeInit 函数)← SRS_BSW_00336, SRS_SPAL_12163, SRS_Pwm_12381 > - SWS_Pwm_00013(SetDutyCycle 函数)← SRS_Pwm_12295 > - SWS_Pwm_00019(SetPeriodAndDuty 函数)← SRS_Pwm_12297 > - SWS_Pwm_00021(SetOutputToIdle)← SRS_Pwm_12358 > - SWS_Pwm_00022(GetOutputState)← SRS_Pwm_12385 > - SWS_Pwm_00023/00024(Disable/EnableNotification)← SRS_Pwm_12378, SRS_Pwm_12299 > - SWS_Pwm_00041(仅允许 variable period 类型的通道更改周期)← SRS_Pwm_12389 > - SWS_Pwm_00058(16 位占空比宽度)← SRS_Pwm_12383 > - SWS_Pwm_00059(占空比缩放方案)← SRS_Pwm_12459 > - SWS_Pwm_00070(时间单位为 ticks)← SRS_BSW_00343 > - SWS_Pwm_00093、00116、00118、00121(Init 时序约束与错误检测) > - SWS_Pwm_00117、00047、10051、20051(API 参数验证) > - SWS_Pwm_00150(周期为 0 时的行为) > - SWS_Pwm_00153(模块文档/标识) > - SWS_Pwm_00165(PowerStateRequestResultType 定义) > - SWS_Pwm_00197(Pwm_PowerStateType 定义 + PWM 通道属性配置) > - SWS_Pwm_10080/20080(DeInit 可配置 On/Off) > - SWS_Pwm_10082/20082(SetDutyCycle 可配置 On/Off) > - SWS_Pwm_10083/20083(SetPeriodAndDuty 可配置 On/Off) > - SWS_Pwm_10084/20084(SetOutputToIdle 可配置 On/Off) > - SWS_Pwm_10085/20085(GetOutputState 可配置 On/Off) > - SWS_Pwm_10086/20086/00119(SetOutputToIdle 后重新激活) > - SWS_Pwm_10112/20112(DisableNotification 可配置) > - SWS_Pwm_20002/30002/40002/50002(开发错误分类) > - SWS_Pwm_30051(GetOutputState 错误返回) > > *完整可追溯性表见原文 PDF(第 12-18 页)。* --- ## 7 功能规范(Functional specification) ### 7.1 一般行为(General behavior) **[SWS_Pwm_00088]** ⌈PWM 模块除 Pwm_Init、Pwm_DeInit 和 Pwm_GetVersionInfo 外的所有函数应对不同 PWM 通道号可重入。 为保持模块实现的简单性,模块不应执行 SWS_Pwm_00088 的检查。⌋ () **[SWS_Pwm_00089]** ⌈PWM 模块的用户应确保在运行时不同任务或 ISR 中对同一 PWM 通道进行多次函数调用时的完整性。⌋ () ### 7.2 时间单位 Ticks(Time Unit Ticks) #### 7.2.1 背景与原理(Background & Rationale) 要从寄存器值中获取时间,必须知道振荡器频率、预分频器等。由于这些设置是在 MCU 和/或其他模块中进行的,因此无法计算此类时间。 因此,时间与 ticks 之间的转换应属于上层。 #### 7.2.2 需求(Requirements) **[SWS_Pwm_00070]** ⌈PWM 模块 API 服务中使用的所有时间单位应为 ticks 单位。⌋ (SRS_BSW_00343) ### 7.3 支持和管理 HW 低功耗状态(Support and management of HW low power states) 某些 PWM HW 模块允许被设置为某些降低功耗的操作模式,代价可能是较慢的反应时间、较低的性能或完全不可用。每个 PWM 模块可以支持一个或多个低功耗操作模式,将全功率模式视为始终存在并在启动时默认设置。 #### 7.3.1 背景(Background) PWM 驱动提供电源状态控制 API 和后台处理机制来处理异步电源状态更改过程(即电源状态更改不会在请求时立即完成,而是需要一些更长的操作)。 #### 7.3.2 需求(Requirements) > **摘要:** PWM 驱动实现以下电源状态管理 API: > - `Pwm_SetPowerState`:请求电源状态转换 > - `Pwm_GetCurrentPowerState`:读取当前电源状态 > - `Pwm_GetTargetPowerState`:读取目标电源状态 > - `Pwm_PreparePowerState`:准备电源状态转换 > - `Pwm_Main_PowerTransitionManager`:主电源转换管理函数(计划函数) > > 详细需求 SWS_Pwm_xxxxx 见原文 PDF(第 19-21 页)。 ### 7.4 错误分类(Error classification) #### 7.4.1 开发错误(Development Errors) **[SWS_Pwm_20002]** ⌈开发错误类型:PWM_E_PARAM_CONFIG(API Pwm_Init 在已初始化的状态下调用时报告)。⌋ (SRS_BSW_00337, SRS_BSW_00385) **[SWS_Pwm_30002]** ⌈开发错误类型:PWM_E_UNINIT(API 服务在 PWM 驱动未初始化时被调用时报告)。⌋ (SRS_BSW_00337, SRS_BSW_00385) **[SWS_Pwm_40002]** ⌈开发错误类型:PWM_E_PARAM_CHANNEL(API 服务使用无效的通道 ID 调用时报告)。⌋ (SRS_BSW_00337, SRS_BSW_00385) **[SWS_Pwm_50002]** ⌈开发错误类型:PWM_E_PARAM_POINTER(API Pwm_GetVersionInfo 使用 NULL 参数调用时报告)。⌋ (SRS_BSW_00337, SRS_BSW_00385) **[SWS_Pwm_00045]** ⌈如果 Pwm_SetPeriodAndDuty 的输入参数 Period 等于零,则输出应为 0%(零占空比)。⌋ (SRS_BSW_00386, SRS_BSW_00323) **[SWS_Pwm_00047]** ⌈Pwm 模块应验证 API 参数的可用性并报告相应的开发错误。⌋ (SRS_BSW_00323, SRS_BSW_00386) #### 7.4.2 运行时错误(Runtime Errors) **[SWS_Pwm_00117]** ⌈静态状态变量,表示 BSW 模块已初始化。⌋ (SRS_BSW_00406, SRS_BSW_00386, SRS_BSW_00323) #### 7.4.3 瞬态故障(Transient Faults) 无。 #### 7.4.4 生产错误(Production Errors) 无。 ### 7.5 错误检测(Error Detection) **[SWS_Pwm_10051]** ⌈如果启用了开发错误检测,Pwm 模块应在以下情况下报告开发错误: - PWM_E_UNINIT:在调用任何 API 时 PWM 驱动未初始化 - PWM_E_PARAM_CHANNEL:使用无效的通道 ID 调用 API - PWM_E_ALREADY_INITIALIZED:在 Pwm_Init 期间 PWM 驱动和硬件已初始化 - PWM_E_PARAM_POINTER:使用 NULL 参数调用 Pwm_GetVersionInfo ⌋ (SRS_BSW_00386, SRS_BSW_00323) **[SWS_Pwm_20051]** ⌈如果启用了开发错误检测,开发错误的配置参数开关定义如下: - PWM_DE_INIT_API - PWM_SET_DUTY_CYCLE_API - PWM_SET_PERIOD_AND_DUTY_API - PWM_SET_OUTPUT_TO_IDLE_API - PWM_GET_OUTPUT_STATE_API - PWM_NOTIFICATION_SUPPORTED - PWM_VERSION_INFO_API ⌋ (SRS_BSW_00386, SRS_BSW_00323) ### 7.6 错误通知(Error Notification) 有关详细信息,请参阅 SWS_BSWGeneral 中的第 7.2"错误分类"和 7.3"错误检测"章节。 ### 7.7 占空比分辨率与缩放(Duty Cycle Resolution and scaling) **[SWS_Pwm_00058]** ⌈占空比参数的宽度为 16 位。⌋ (SRS_Pwm_12383) **[SWS_Pwm_00059]** ⌈Pwm 模块应遵循占空比的以下缩放方案: - `0x0000` 表示 0%。 - `0x8000` 表示 100%。0x8000 提供最高分辨率,同时允许使用 16 位值表示 100% 占空比。 作为实现指南,给出以下源代码示例: ```c AbsoluteDutyCycle = ((uint32)AbsolutePeriodTime * RelativeDutyCycle) >> 15; ``` ⌋ (SRS_Pwm_12459) ### 7.8 版本检查(Version check) 有关详细信息,请参阅 SWS_BSWGeneral 中的第 5.1.8"版本检查"章节。 --- ## 8 API 规范(API specification) ### 8.1 导入类型(Imported types) **[SWS_Pwm_00094]** ⌈ | 模块 | 头文件 | 导入类型 | |---|---|---| | Std_Types | StandardTypes.h | Std_ReturnType, Std_VersionInfoType | ⌋ () ### 8.2 类型定义(Type definitions) #### 8.2.1 Pwm_ChannelType **[SWS_Pwm_00106]** ⌈ | 字段 | 内容 | |---|---| | Name | Pwm_ChannelType | | Type | uint | | Range | 8..32 位(实现特定) | | Description | PWM 通道的数字标识符。 | | Available via | Pwm.h | ⌋ () #### 8.2.2 Pwm_PeriodType **[SWS_Pwm_00107]** ⌈ | 字段 | 内容 | |---|---| | Name | Pwm_PeriodType | | Type | uint | | Range | 8..32 位(实现特定) | | Description | PWM 通道的周期定义。 | | Available via | Pwm.h | ⌋ () #### 8.2.3 Pwm_OutputStateType **[SWS_Pwm_00108]** ⌈ | 字段 | 内容 | |---|---| | Name | Pwm_OutputStateType | | Type | Enumeration | | Range | PWM_HIGH(PWM 通道处于高状态)
PWM_LOW(PWM 通道处于低状态) | | Description | PWM 通道的输出状态。 | | Available via | Pwm.h | ⌋ () #### 8.2.4 Pwm_EdgeNotificationType **[SWS_Pwm_00109]** ⌈ | 字段 | 内容 | |---|---| | Name | Pwm_EdgeNotificationType | | Type | Enumeration | | Range | PWM_RISING_EDGE(PWM 输出信号发生上升沿时调用通知)
PWM_FALLING_EDGE(PWM 输出信号发生下降沿时调用通知)
PWM_BOTH_EDGES(PWM 输出信号发生上升沿或下降沿时调用通知) | | Description | PWM 通道边沿通知类型的定义。 | | Available via | Pwm.h | ⌋ () #### 8.2.5 Pwm_ChannelClassType **[SWS_Pwm_00110]** ⌈ | 字段 | 内容 | |---|---| | Name | Pwm_ChannelClassType | | Type | Enumeration | | Range | PWM_VARIABLE_PERIOD(PWM 通道具有可变周期,可以更改占空比和周期)
PWM_FIXED_PERIOD(PWM 通道具有固定周期,仅可以更改占空比)
PWM_FIXED_PERIOD_SHIFTED(PWM 通道具有固定的移相周期,无法更改,仅当硬件支持时) | | Description | 定义 PWM 通道的类别。 | | Available via | Pwm.h | ⌋ () #### 8.2.6 Pwm_ConfigType **[SWS_Pwm_00111]** ⌈ | 字段 | 内容 | |---|---| | Name | Pwm_ConfigType | | Type | Structure(硬件相关的初始化数据结构) | | Description | 包含 PWM 驱动初始化数据的数据结构类型。 | | Available via | Pwm.h | ⌋ () **[SWS_Pwm_00061]** ⌈Pwm_ConfigType 是包含 PWM 驱动初始化数据的数据结构类型。⌋ () #### 8.2.7 Pwm_PowerStateRequestResultType **[SWS_Pwm_00165]** ⌈ | 字段 | 内容 | |---|---| | Name | Pwm_PowerStateRequestResultType | | Type | Enumeration | | Range | PWM_SERVICE_ACCEPTED 0x00(电源状态更改已执行)
PWM_NOT_INIT 0x01(PWM 模块未初始化)
PWM_SEQUENCE_ERROR 0x02(错误的 API 调用序列)
PWM_HW_FAILURE 0x03(HW 模块有故障,无法进入所需的电源状态)
PWM_POWER_STATE_NOT_SUPP 0x04(PWM 模块不支持请求的电源状态)
PWM_TRANS_NOT_POSSIBLE 0x05(PWM 模块无法直接从当前电源状态转换到请求的电源状态,或者 HW 外设仍忙) | | Description | 与电源状态转换相关的请求结果。 | | Available via | Pwm.h | ⌋ () #### 8.2.8 Pwm_PowerStateType **[SWS_Pwm_00197]** ⌈ | 字段 | 内容 | |---|---| | Name | Pwm_PowerStateType | | Type | Enumeration | | Range | 1..255(功耗递减的电源模式)
PWM_FULL_POWER 0x00 全功率 | | Description | 当前活动的电源状态或设置为目标电源状态。 | | Available via | Pwm.h | ⌋ (SRS_Pwm_12293, SRS_Pwm_12378) **强制参数:** - 已分配的 HW 通道 - 周期的默认值 - 占空比的默认值 - 极性(高或低) - 空闲状态高或低 - 通道类别: - 固定周期 - 固定周期、移相(如果硬件支持) - 可变周期 **可选参数(如果硬件支持):** - 通道相位偏移 - 相位偏移的参考通道 - 微控制器特定通道属性 ### 8.3 函数定义(Function definitions) #### 8.3.1 Pwm_Init **[SWS_Pwm_00095]** ⌈ | 字段 | 内容 | |---|---| | Service name | Pwm_Init | | Syntax | `void Pwm_Init(const Pwm_ConfigType* ConfigPtr)` | | Service ID[hex] | 0x00 | | Sync/Async | Synchronous | | Reentrancy | Non Reentrant | | Parameters (in) | ConfigPtr - 指向配置集的指针 | | Parameters (inout) | None | | Parameters (out) | None | | Return value | None | | Description | PWM 初始化服务。 | | Available via | Pwm.h | ⌋ () **[SWS_Pwm_00007]** ⌈Pwm_Init 函数应根据 ConfigPtr 中指定的参数初始化所有内部变量和微控制器的已使用 PWM 结构。⌋ (SRS_BSW_00101, SRS_SPAL_12057) **[SWS_Pwm_00062]** ⌈Pwm_Init 函数应仅初始化已配置的资源,并且不应触及配置文件中未配置的资源。⌋ (SRS_SPAL_12057, SRS_SPAL_12125) **[SWS_Pwm_10009]** ⌈Pwm_Init 函数应使用配置的默认值启动所有 PWM 通道。⌋ (SRS_SPAL_12057) - **[SWS_Pwm_20009]** ⌈如果占空比参数等于 0% 或 100%:则 PWM 输出信号应处于根据配置的极性参数的状态。⌋ (SRS_SPAL_12057) - **[SWS_Pwm_30009]** ⌈如果占空比参数大于 0% 且小于 100%:则 PWM 输出信号应根据周期、占空比和配置的极性参数进行调制。⌋ (SRS_SPAL_12057) **[SWS_Pwm_00052]** ⌈Pwm_Init 函数应禁用所有通知。⌋ (SRS_SPAL_12057) **[SWS_Pwm_00093]** ⌈Pwm 模块的用户不应在运行操作期间调用 Pwm_Init 函数。⌋ () **[SWS_Pwm_00116]** ⌈Pwm 模块的环境在调用 Pwm_Init 之前不应调用 Pwm 模块的任何函数。⌋ () **[SWS_Pwm_00118]** ⌈如果启用了开发错误检测,在 PWM 驱动和硬件已初始化时调用 Pwm_Init 将导致开发错误 PWM_E_ALREADY_INITIALIZED。所需的功能应在不执行任何操作的情况下离开。⌋ () **[SWS_Pwm_00121]** ⌈通过执行 Pwm_Init() 函数重新初始化 Pwm 驱动需要先通过执行 Pwm_DeInit() 进行反初始化。⌋ () #### 8.3.2 Pwm_DeInit **[SWS_Pwm_00096]** ⌈ | 字段 | 内容 | |---|---| | Service name | Pwm_DeInit | | Syntax | `void Pwm_DeInit(void)` | | Service ID[hex] | 0x01 | | Sync/Async | Synchronous | | Reentrancy | Non Reentrant | | Description | PWM 反初始化服务。 | | Available via | Pwm.h | ⌋ () **[SWS_Pwm_00010]** ⌈Pwm_DeInit 函数应反初始化 PWM 模块。⌋ (SRS_BSW_00336, SRS_SPAL_12163, SRS_Pwm_12381) **[SWS_Pwm_00011]** ⌈Pwm_DeInit 函数应将 PWM 输出信号的状态设置为空闲状态。⌋ (SRS_SPAL_12163) **[SWS_Pwm_00012]** ⌈Pwm_DeInit 函数应禁用 PWM 中断和 PWM 信号边沿通知。⌋ (SRS_SPAL_12163) **[SWS_Pwm_10080]** ⌈Pwm_DeInit 函数应通过配置参数 PwmDeInitApi 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171) **[SWS_Pwm_20080]** ⌈Pwm_DeInit 函数应通过配置参数 PwmDeInitApi {PWM_DE_INIT_API} 进行 On/Off 配置。⌋ (SRS_BSW_00171) #### 8.3.3 Pwm_SetDutyCycle **[SWS_Pwm_91000]** ⌈(draft) | 字段 | 内容 | |---|---| | Service name | Pwm_SetDutyCycle | | Syntax | `void Pwm_SetDutyCycle(Pwm_ChannelType ChannelNumber, uint16 DutyCycle)` | | Service ID[hex] | 0x02 | | Sync/Async | Asynchronous | | Reentrancy | Reentrant for different channel numbers | | Parameters (in) | ChannelNumber - PWM 的数字标识符
DutyCycle - Min=0x0000 Max=0x8000 | | Description | 服务设置 PWM 通道的占空比。 | ⌋ () **[SWS_Pwm_00013]** ⌈Pwm_SetDutyCycle 函数应设置 PWM 通道的占空比。⌋ (SRS_Pwm_12295) **[SWS_Pwm_00014]** ⌈当请求的占空比为 0% 或 100% 时,Pwm_SetDutyCycle 函数应将 PWM 输出状态设置为 PWM_HIGH 或 PWM_LOW,同时考虑配置的极性参数和请求的占空比。因此对于 0% 请求的占空比,输出将是配置的极性参数的反相,对于 100% 占空比,输出将等于配置的极性参数。⌋ () **[SWS_Pwm_00016]** ⌈当占空比 > 0% 且 < 100% 时,Pwm_SetDutyCycle 函数应根据周期、占空比和配置的极性参数调制 PWM 输出信号。⌋ () **[SWS_Pwm_00017]** ⌈Pwm_SetDutyCycle 函数应在实现支持且通过 PwmDutycycleUpdatedEndperiod 配置的情况下始终在周期结束时更新占空比。⌋ (SRS_Pwm_12382) **[SWS_Pwm_00018]** ⌈驱动应禁止 PWM 输出信号上的尖峰。⌋ () **[SWS_Pwm_10082]** ⌈Pwm_SetDutyCycle 函数应通过配置参数 PwmSetDutyCycle 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171) **[SWS_Pwm_20082]** ⌈Pwm_SetDutyCycle 函数应通过配置参数 PwmSetDutyCycle {PWM_SET_DUTY_CYCLE_API} 进行 On/Off 配置。⌋ (SRS_BSW_00171) #### 8.3.4 Pwm_SetPeriodAndDuty **[SWS_Pwm_91001]** ⌈(draft) | 字段 | 内容 | |---|---| | Service name | Pwm_SetPeriodAndDuty | | Syntax | `void Pwm_SetPeriodAndDuty(Pwm_ChannelType ChannelNumber, Pwm_PeriodType Period, uint16 DutyCycle)` | | Service ID[hex] | 0x03 | | Sync/Async | Asynchronous | | Reentrancy | Reentrant for different channel numbers | | Parameters (in) | ChannelNumber - PWM 的数字标识符
Period - PWM 信号的周期
DutyCycle - Min=0x0000 Max=0x8000 | | Description | 服务设置 PWM 通道的周期和占空比。 | ⌋ () **[SWS_Pwm_00019]** ⌈Pwm_SetPeriodAndDuty 函数应设置 PWM 通道的周期和占空比。⌋ (SRS_Pwm_12297) **[SWS_Pwm_00076]** ⌈Pwm_SetPeriodAndDuty 函数应在实现支持且通过 PwmPeriodUpdatedEndperiod 配置的情况下始终在当前周期结束时更新周期。⌋ () **[SWS_Pwm_00020]** ⌈更新 PWM 周期和占空比时,驱动应抑制 PWM 输出信号上的任何尖峰。⌋ () **[SWS_Pwm_00041]** ⌈Pwm_SetPeriodAndDuty 函数应仅允许更改被声明为可变周期类型的 PWM 通道的周期。⌋ (SRS_Pwm_12389) **[SWS_Pwm_10083]** ⌈Pwm_SetPeriodAndDuty 函数应通过配置参数 PwmSetPeriodAndDuty 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171) **[SWS_Pwm_20083]** ⌈Pwm_SetPeriodAndDuty 函数应通过配置参数 PwmSetPeriodAndDuty {PWM_SET_PERIOD_AND_DUTY_API} 进行 On/Off 配置。⌋ (SRS_BSW_00171) **[SWS_Pwm_00150]** ⌈如果周期设置为零,则占空比的设置不相关。在这种情况下,输出应为零(零占空比)。⌋ () #### 8.3.5 Pwm_SetOutputToIdle **[SWS_Pwm_91002]** ⌈(draft) | 字段 | 内容 | |---|---| | Service name | Pwm_SetOutputToIdle | | Syntax | `void Pwm_SetOutputToIdle(Pwm_ChannelType ChannelNumber)` | | Service ID[hex] | 0x04 | | Sync/Async | Asynchronous | | Reentrancy | Reentrant for different channel numbers | | Parameters (in) | ChannelNumber - PWM 的数字标识符 | | Description | 服务将 PWM 输出设置为配置的空闲状态。 | ⌋ () **[SWS_Pwm_00021]** ⌈Pwm_SetOutputToIdle 函数应立即将 PWM 输出设置为配置的空闲状态。⌋ (SRS_Pwm_12358) **[SWS_Pwm_10084]** ⌈Pwm_SetOutputToIdle 函数应通过配置参数 PwmSetOutputToIdle 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171) **[SWS_Pwm_20084]** ⌈Pwm_SetOutputToIdle 函数应通过配置参数 PwmSetOutputToIdle {PWM_SET_OUTPUT_TO_IDLE_API} 进行 On/Off 配置。⌋ (SRS_BSW_00171) **[SWS_Pwm_10086]** ⌈调用 Pwm_SetOutputToIdle 函数后,可变周期类型的通道应使用 API Pwm_SetPeriodAndDuty() 重新激活,以使用新传入的周期激活 PWM 通道。⌋ () **[SWS_Pwm_20086]** ⌈调用 Pwm_SetOutputToIdle 函数后,通道应使用 API Pwm_SetDutyCycle() 重新激活,以使用旧周期激活 PWM 通道。⌋ () **[SWS_Pwm_00119]** ⌈调用 Pwm_SetOutputToIdle 函数后,固定周期类型的通道应仅使用 API Pwm_SetDutyCycle() 重新激活,以使用旧周期激活 PWM 通道。⌋ () #### 8.3.6 Pwm_GetOutputState **[SWS_Pwm_00100]** ⌈ | 字段 | 内容 | |---|---| | Service name | Pwm_GetOutputState | | Syntax | `Pwm_OutputStateType Pwm_GetOutputState(Pwm_ChannelType ChannelNumber)` | | Service ID[hex] | 0x05 | | Sync/Async | Synchronous | | Reentrancy | Reentrant for different channel numbers | | Parameters (in) | ChannelNumber - PWM 的数字标识符 | | Return value | PWM_HIGH(PWM 输出状态为高)
PWM_LOW(PWM 输出状态为低) | | Description | 服务读取 PWM 输出信号的内部状态。 | | Available via | Pwm.h | ⌋ () **[SWS_Pwm_00022]** ⌈Pwm_GetOutputState 函数应读取 PWM 输出信号的内部状态并按以下图所示返回:值从 PWM 单元读取,经过端口逻辑后作为端口引脚输出。⌋ (SRS_Pwm_12385) **[SWS_Pwm_10085]** ⌈Pwm_GetOutputState 函数应通过配置参数 PwmGetOutputState 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171) **[SWS_Pwm_20085]** ⌈Pwm_GetOutputState 函数应通过配置参数 PwmGetOutputState {PWM_GET_OUTPUT_STATE_API} 进行 On/Off 配置。 由于实时约束和 PWM 通道的设置(项目相关),输出状态可以在调用服务 Pwm_GetOutputState 后立即修改。⌋ (SRS_BSW_00171) **[SWS_Pwm_30051]** ⌈如果在模块初始化之前调用 Pwm_GetOutputState,或使用无效通道调用,则应返回 PWM_LOW。⌋ (SRS_BSW_00323, SRS_BSW_00386) #### 8.3.7 Pwm_DisableNotification **[SWS_Pwm_91003]** ⌈(draft) | 字段 | 内容 | |---|---| | Service name | Pwm_DisableNotification | | Syntax | `void Pwm_DisableNotification(Pwm_ChannelType ChannelNumber)` | | Service ID[hex] | 0x06 | | Sync/Async | Asynchronous | | Reentrancy | Reentrant for different channel numbers | | Parameters (in) | ChannelNumber - PWM 的数字标识符 | | Description | 服务禁用 PWM 信号边沿通知。 | ⌋ () **[SWS_Pwm_00023]** ⌈Pwm_DisableNotification 函数应禁用 PWM 信号边沿通知。⌋ (SRS_Pwm_12378, SRS_Pwm_12299) **[SWS_Pwm_10112]** ⌈Pwm_DisableNotification 函数应通过配置参数 PwmNotificationSupported 进行预编译时间 On/Off 配置。⌋ () **[SWS_Pwm_20112]** ⌈Pwm_DisableNotification 函数应通过配置参数 PwmNotificationSupported {PWM_NOTIFICATION_SUPPORTED} 进行 On/Off 配置。⌋ () #### 8.3.8 Pwm_EnableNotification **[SWS_Pwm_91004]** ⌈(draft) | 字段 | 内容 | |---|---| | Service name | Pwm_EnableNotification | | Syntax | `void Pwm_EnableNotification(Pwm_ChannelType ChannelNumber, Pwm_EdgeNotificationType Notification)` | | Service ID[hex] | 0x07 | | Sync/Async | Asynchronous | | Reentrancy | Reentrant for different channel numbers | | Description | 服务启用 PWM 信号边沿通知。 | ⌋ () **[SWS_Pwm_00024]** ⌈Pwm_EnableNotification 函数应启用 PWM 信号边沿通知。⌋ (SRS_Pwm_12378, SRS_Pwm_12299) #### 8.3.9 - 8.3.13 电源状态管理与版本 API > **摘要说明:** 以下 API 函数与电源状态管理和版本信息相关: > > | 函数 | 描述 | > |---|---| > | `Pwm_SetPowerState` | 请求电源状态转换,返回 Pwm_PowerStateRequestResultType | > | `Pwm_GetCurrentPowerState` | 读取当前电源状态 | > | `Pwm_GetTargetPowerState` | 读取目标电源状态 | > | `Pwm_PreparePowerState` | 准备电源状态转换(用于异步电源状态切换) | > | `Pwm_GetVersionInfo` | 返回驱动版本信息(通过 Std_VersionInfoType 指针) | > > 详细函数签名与需求见原文 PDF(第 38-42 页)。 ### 8.4 回调通知(Callback notifications) 无。 ### 8.5 计划函数(Scheduled functions) #### 8.5.1 Pwm_Main_PowerTransitionManager **[SWS_Pwm_00167]** ⌈ | 字段 | 内容 | |---|---| | Service name | Pwm_Main_PowerTransitionManager | | Syntax | `void Pwm_Main_PowerTransitionManager(void)` | | Description | 计划函数,处理 PWM 模块的异步电源状态转换。 | ⌋ () ### 8.6 预期接口(Expected Interfaces) #### 8.6.1 强制接口(Mandatory Interfaces) - `Dem_SetEventStatus`(来自 Dem) - `Det_ReportError`(来自 Det) #### 8.6.2 可选接口(Optional Interfaces) - `Pwm_GetVersionInfo` - `Pwm_GetOutputState` #### 8.6.3 可配置接口(Configurable interfaces) - `Pwm_DeInit` - `Pwm_SetDutyCycle` - `Pwm_SetPeriodAndDuty` - `Pwm_SetOutputToIdle` - `Pwm_DisableNotification` - `Pwm_EnableNotification` ### 8.7 API 参数检查(API parameter checking) > **摘要说明:** API 参数检查的需求已通过 SWS_Pwm_10051、SWS_Pwm_20051 集中定义。这些开关通过配置参数(PWM_DE_INIT_API 等)控制开发错误检测的启用和禁用。详细的检查规则请参阅 7.5 错误检测和 8.3 函数定义部分。 --- ## 9 序列图(Sequence diagrams) > **摘要说明:** 本节包含以下序列图,描述了主要操作场景: > > 1. **初始化**(Pwm_Init 调用流程) > 2. **反初始化**(Pwm_DeInit 调用流程) > 3. **设置占空比**(Pwm_SetDutyCycle 调用流程) > 4. **设置周期和占空比**(Pwm_SetPeriodAndDuty 调用流程) > 5. **将 PWM 输出设置为空闲**(Pwm_SetOutputToIdle 调用流程) > 6. **获取 PWM 输出状态**(Pwm_GetOutputState 调用流程) > 7. **使用 PWM 通知**(启用/禁用通知流程) > > *完整序列图见原文 PDF(第 47-53 页)。* --- ## 10 配置规范(Configuration specification) ### 10.1 如何阅读本章(How to read this chapter) 容器和参数定义遵循 AUTOSAR 配置规范。 ### 10.2 容器和配置参数(Containers and configuration parameters) #### 10.2.1 Pwm > Pwm 是顶层容器,包含所有 PWM 驱动配置。 #### 10.2.2 PwmGeneral > **摘要:** PwmGeneral 包含全局 PWM 配置: > - `PwmChannelId` 配置类 > - `PwmDeInitApi` - 启用/禁用 DeInit API > - `PwmSetDutyCycle` - 启用/禁用 SetDutyCycle API > - `PwmSetPeriodAndDuty` - 启用/禁用 SetPeriodAndDuty API > - `PwmSetOutputToIdle` - 启用/禁用 SetOutputToIdle API > - `PwmGetOutputState` - 启用/禁用 GetOutputState API > - `PwmNotificationSupported` - 启用/禁用通知 > - `PwmVersionInfoApi` - 启用/禁用版本信息 API > - `PwmDutycycleUpdatedEndperiod` - 占空比周期结束更新 > - `PwmPeriodUpdatedEndperiod` - 周期结束更新 > > *完整参数定义见原文 PDF(第 54-58 页)。* #### 10.2.3 PwmPowerStateConfig > **摘要:** PwmPowerStateConfig 包含电源状态相关配置: > - `PwmPowerStateAsynchTransitionMode` - 异步电源状态转换模式 > - `PwmPowerStateConfigSet` - 电源状态配置集 > > *完整参数定义见原文 PDF(第 58-59 页)。* #### 10.2.4 PwmChannel > **摘要:** PwmChannel 包含每个 PWM 通道的配置: > - `PwmChannelId` - 通道 ID > - `PwmChannelClass` - 通道类别(Variable Period、Fixed Period、Fixed Period Shifted) > - `PwmPolarity` - 极性 > - `PwmIdleState` - 空闲状态 > - `PwmPeriodDefault` - 默认周期 > - `PwmDutycycleDefault` - 默认占空比 > - `PwmNotification` - 通知配置 > - `PwmHwChannel` - 已分配的 HW 通道 > - `PwmChannelPhaseShift` - 通道相位偏移(可选) > - `PwmReferenceChannel` - 相位偏移参考通道(可选) > - `PwmMcuClockReferencePoint` - MCU 时钟参考点 > > *完整参数定义见原文 PDF(第 59-62 页)。* #### 10.2.5 PwmChannelConfigSet PwmChannelConfigSet 容器包含一组 PwmChannel 配置。 #### 10.2.6 PwmConfigurationOfOptApiServices > **摘要:** 包含每个可选 API 的配置: > - `PwmSetDutyCycle` > - `PwmSetPeriodAndDuty` > - `PwmSetOutputToIdle` > - `PwmGetOutputState` > - `PwmNotificationSupported` > - `PwmVersionInfo` > - `PwmDeInitApi` > > *完整参数定义见原文 PDF(第 62-64 页)。* ### 10.3 发布信息(Published Information) > **摘要说明:** 发布信息参数定义了由 PWM 驱动模块发布给其他模块的信息,例如版本号、供应商 ID 等。 --- ## 11 不适用需求(Not applicable requirements) > **摘要说明:** 本节列出了不适用于 PWM 驱动的需求,包括: > - 与特定 BSW 通用规范条目相关的限制 > - 多核分发相关需求的适用性说明 --- ## 翻译说明 本文档为 AUTOSAR 4.4.0 版本 PWM 驱动软件规范的中文翻译。保留了所有需求 ID(SWS_Pwm_xxxxx)、参考标识符及模块缩写。原始文档共 65 页,本翻译涵盖了全部主要章节,并对大型可追溯性表、序列图和详细配置参数表采用了"重点翻译+摘要"策略,标注"完整表见原文 PDF"的位置以便用户查阅原文。