7.5.6 PWM 使用指南
硬件支持
- 每个通道都是独立的,支持 irq requset 和 dma requset
- 支持配置两种工作模式,通用工作模式(PWM 脉冲输出),输入捕获模式。
- 每个通道有自己独立的时钟分频寄存器
- 每个 IP 所有通道共享一个中断
- 当目标边沿或者脉冲类型到来的时候,会触发中断或者 dma req
- 支持 DMA 更新 period 和 duty
- 支持周期边沿对齐方式设置,可以设置为边沿对齐或者中心对齐
- 支持针对每个 PWM 通道配置其周期和占空比,需要满足如下限制:
- 周期配置粒度为 clk_PWM,即 PWM 外设时钟,最大时钟计数值为:4294967295。
S600和 S100的 IP 配置如下:
| 平台 | PWM IP 数量 | 每个 IP 的通道数 | 总通道数 |
|---|---|---|---|
| S600 | 3个 | 12个 Channel | 36个 Channel |
| S100 | 1个 | 12个 Channel | 12个 Channel |
软件驱动
- 支持 CPU 更新 PWM 通道的周期和占空比
- 支持 DMA 更新 PWM 通道的周期和占空比
- 支持设置开启和关闭 PWM 中断,设置 PWM 通道的中断函数,支持中断类型:上升沿,下降沿,双边沿
- 读取 PWM 输出信号的内部状态并将其返回
- 支持多通道同步输出
代码路径
PWM 模块相关文件说明
Config/McalCdd/gen_xxx/Pwm/src/Pwm_PBCfg.c:正常模式下 PWM 的预编译配置源文件,包含通道和实例的具 体配置参数(如周期、占空比、极性等)。Config/McalCdd/gen_xxx/Pwm/inc:预编译配置头文件,定义宏开关。McalCdd/Pwm/src/Pwm_Lld.c:底层驱动实现文件,直接操作硬件寄存器,提供底层接口。McalCdd/Pwm/src/Pwm.c:上层驱动逻辑实现,封装 API 接口,并处理错误检测、状态管理等控制逻辑。McalCdd/Pwm/inc/Pwm_Lld.h:底层驱动头文件,声明底层函数原型、结构体和枚举类型。McalCdd/Pwm/inc/Pwm_Types.h:定义通用数据类型、结构体和回调函数指针类型,供上下层共享使用。McalCdd/Pwm/inc/Pwm.h:主头文件,声明高层 API 和核心结构体。samples/Pwm/inc/Pwm_PBCfg.h:Pwm 测试 sample 头文件samples/Pwm/src/Pwm_test.c:Pwm 测试 sample 源文件。
重要配置说明
PWM 驱动中的配置源文件是Pwm_PBCfg.c,支持对每个 channel 单独配置,S600和 S100的驱动和配置兼容,以下以 S600为例。
Pwm_HwChannelConfig_PB包含 PWM 的具体硬件配置,部分配置在 pwm 初始化时就会立即生效
static Pwm_Lld_ChannelConfigType Pwm_HwChannelConfig_PB[PWM_HW_CONF_MODS_PB][12] = {
{
{
/**< pwm hardware channel PwmHwChId4 */
.HwChannelId = PwmHwChId4,
/**< pwm hardware ip id 0 */
.HwIpId = 0,
/**< pwm clear mode */
.ClearMode = FALSE,
/**< pwm channel clock ratio*/
.ClockRatio = 0,
/**< pwm period*/
.Period = 9900000,
/**< pwm polarity*/
.Polarity = PWM_HIGH,
/**< pwm duty cycle*/
.DutyCycle = 4950000,
/**< pwm edge align mode */
.EdgeAlign = PWM_LLD_GEN_ALIGN_EDGE,
/**< pwm edge mode */
.EdgeMode = PWM_LLD_EDGEMODE_RISING,
/**< hardware triger mask */
.HwTrigMask = TRUE,
/**< pwm hardware triger width*/
.HwTrigWidth = 0,
/**< the switch of isr notification*/
.NotificationEnable = FALSE,
/**< the callback of isr notification */
.Notification = NULL_PTR,
/**< the switch of dma complete notification*/
.DmaCpltCallbackEnable = FALSE,
/**< the callback of dma complete notification */
.DmaCpltCallback = NULL_PTR,
},
.......
Pwm_Channels_PB结构体数组定义了逻辑 PWM 通道与底层硬件通道之间的映射关系;Pwm_HwChannelConfig_PB结构体数组定义了每个 PWM 通道的默认硬件参数,如周期、占空比、极性、中断使能等。
#define PWM_CONF_CHANNELS_PB 2
/** @brief Array of configured Pwm channels */
static Pwm_ChannelConfigType Pwm_Channels_PB[PWM_CONF_CHANNELS_PB] = {
{
/* @brief Pwm Channel id */
.ChannelId = 0,
/* @brief Pwm Channel Class */
.PwmChannelClass = PWM_VARIABLE_PERIOD,
/** @brief Pointer to channel pwm hw channel: pwm 0 - ch 4 */
.LldChannelCfg = &Pwm_HwChannelConfig_PB[0][0],
},
{
/* @brief Pwm Channel id */
.ChannelId = 1,
/* @brief Pwm Channel Class */
.PwmChannelClass = PWM_VARIABLE_PERIOD,
/** @brief Pointer to channel pwm hw channel: pwm 0 - ch 5 */
.LldChannelCfg = &Pwm_HwChannelConfig_PB[0][1],
},
};
/** @brief Array of configured Pwm channels */
const Pwm_ConfigType Pwm_Config = {
/** @brief Number of configured Pwm ips */
.NumInstances = PWM_HW_CONF_MODS_PB,
/** @brief Number of configured Pwm channels */
.NumChannels = PWM_CONF_CHANNELS_PB,
/** @brief Number of configured Pwm channels */
.PwmChannelsConfig = Pwm_Channels_PB,
/** @brief Pointer to array of Pwm channels */
.PwmLldIpConfig = Pwm_Lld_IpConfig_PB,
};