Files
autosar_standard_spec_v4.4/IO/AUTOSAR_SWS_PWMDriver.md
T

837 lines
35 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 模块生成具有可变脉冲宽度的脉冲。它允许选择占空比和信号周期时间。
**图 1PWM 信号描述**
---
## 2 缩略语与缩写(Acronyms and abbreviations
| 缩略语 | 描述 |
|---|---|
| PWM Channel | 链接到硬件 PWM 的数字标识符 |
| PWM Output State | 定义 PWM 信号的输出状态。可以是:<br>- High(高)<br>- 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_00007Init 函数)← SRS_BSW_00101, SRS_SPAL_12057
> - SWS_Pwm_00010DeInit 函数)← SRS_BSW_00336, SRS_SPAL_12163, SRS_Pwm_12381
> - SWS_Pwm_00013SetDutyCycle 函数)← SRS_Pwm_12295
> - SWS_Pwm_00019SetPeriodAndDuty 函数)← SRS_Pwm_12297
> - SWS_Pwm_00021SetOutputToIdle)← SRS_Pwm_12358
> - SWS_Pwm_00022GetOutputState)← SRS_Pwm_12385
> - SWS_Pwm_00023/00024Disable/EnableNotification)← SRS_Pwm_12378, SRS_Pwm_12299
> - SWS_Pwm_00041(仅允许 variable period 类型的通道更改周期)← SRS_Pwm_12389
> - SWS_Pwm_0005816 位占空比宽度)← SRS_Pwm_12383
> - SWS_Pwm_00059(占空比缩放方案)← SRS_Pwm_12459
> - SWS_Pwm_00070(时间单位为 ticks)← SRS_BSW_00343
> - SWS_Pwm_00093、00116、00118、00121Init 时序约束与错误检测)
> - SWS_Pwm_00117、00047、10051、20051API 参数验证)
> - SWS_Pwm_00150(周期为 0 时的行为)
> - SWS_Pwm_00153(模块文档/标识)
> - SWS_Pwm_00165PowerStateRequestResultType 定义)
> - SWS_Pwm_00197Pwm_PowerStateType 定义 + PWM 通道属性配置)
> - SWS_Pwm_10080/20080DeInit 可配置 On/Off
> - SWS_Pwm_10082/20082SetDutyCycle 可配置 On/Off
> - SWS_Pwm_10083/20083SetPeriodAndDuty 可配置 On/Off
> - SWS_Pwm_10084/20084SetOutputToIdle 可配置 On/Off
> - SWS_Pwm_10085/20085GetOutputState 可配置 On/Off
> - SWS_Pwm_10086/20086/00119SetOutputToIdle 后重新激活)
> - SWS_Pwm_10112/20112DisableNotification 可配置)
> - SWS_Pwm_20002/30002/40002/50002(开发错误分类)
> - SWS_Pwm_30051GetOutputState 错误返回)
>
> *完整可追溯性表见原文 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 时间单位 TicksTime 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_CONFIGAPI 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_CHANNELAPI 服务使用无效的通道 ID 调用时报告)。⌋ (SRS_BSW_00337, SRS_BSW_00385)
**[SWS_Pwm_50002]** ⌈开发错误类型:PWM_E_PARAM_POINTERAPI 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_HIGHPWM 通道处于高状态)<br>PWM_LOWPWM 通道处于低状态) |
| Description | PWM 通道的输出状态。 |
| Available via | Pwm.h |
⌋ ()
#### 8.2.4 Pwm_EdgeNotificationType
**[SWS_Pwm_00109]** ⌈
| 字段 | 内容 |
|---|---|
| Name | Pwm_EdgeNotificationType |
| Type | Enumeration |
| Range | PWM_RISING_EDGEPWM 输出信号发生上升沿时调用通知)<br>PWM_FALLING_EDGEPWM 输出信号发生下降沿时调用通知)<br>PWM_BOTH_EDGESPWM 输出信号发生上升沿或下降沿时调用通知) |
| Description | PWM 通道边沿通知类型的定义。 |
| Available via | Pwm.h |
⌋ ()
#### 8.2.5 Pwm_ChannelClassType
**[SWS_Pwm_00110]** ⌈
| 字段 | 内容 |
|---|---|
| Name | Pwm_ChannelClassType |
| Type | Enumeration |
| Range | PWM_VARIABLE_PERIODPWM 通道具有可变周期,可以更改占空比和周期)<br>PWM_FIXED_PERIODPWM 通道具有固定周期,仅可以更改占空比)<br>PWM_FIXED_PERIOD_SHIFTEDPWM 通道具有固定的移相周期,无法更改,仅当硬件支持时) |
| 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(电源状态更改已执行)<br>PWM_NOT_INIT 0x01PWM 模块未初始化)<br>PWM_SEQUENCE_ERROR 0x02(错误的 API 调用序列)<br>PWM_HW_FAILURE 0x03HW 模块有故障,无法进入所需的电源状态)<br>PWM_POWER_STATE_NOT_SUPP 0x04PWM 模块不支持请求的电源状态)<br>PWM_TRANS_NOT_POSSIBLE 0x05PWM 模块无法直接从当前电源状态转换到请求的电源状态,或者 HW 外设仍忙) |
| Description | 与电源状态转换相关的请求结果。 |
| Available via | Pwm.h |
⌋ ()
#### 8.2.8 Pwm_PowerStateType
**[SWS_Pwm_00197]** ⌈
| 字段 | 内容 |
|---|---|
| Name | Pwm_PowerStateType |
| Type | Enumeration |
| Range | 1..255(功耗递减的电源模式)<br>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 的数字标识符<br>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 的数字标识符<br>Period - PWM 信号的周期<br>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_HIGHPWM 输出状态为高)<br>PWM_LOWPWM 输出状态为低) |
| 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"的位置以便用户查阅原文。