1. imx6ul PWM子系统概述
i.MX6UL处理器内置了8个独立的PWM控制器模块,每个模块都能生成精确的脉冲宽度调制信号。在Linux系统中,这些硬件资源通过PWM子系统进行统一管理。PWM子系统采用分层架构设计,底层由芯片厂商提供的驱动直接操作硬件寄存器,上层则提供标准化的API接口供开发者调用。
PWM子系统在嵌入式领域应用广泛,典型的应用场景包括:
- 电机转速控制(如直流电机、步进电机)
- LED亮度调节(背光控制、呼吸灯效果)
- 无源蜂鸣器驱动
- 电源管理(DC-DC转换)
- 伺服舵机控制
在i.MX6UL上,每个PWM控制器都具有以下特性:
- 16位计数器提供高分辨率
- 可编程时钟分频器
- 独立的正向和反向输出
- 支持中心对齐和边沿对齐模式
- 自动重装载功能
2. 设备树配置详解
2.1 基础节点结构
i.MX6UL的PWM控制器在设备树中的定义位于imx6ull.dtsi文件中,开发者不应直接修改这个文件,而是通过设备树覆盖(overlay)或在自定义板级dts文件中进行配置扩展。以下是PWM3的典型配置示例:
dts复制pwm3: pwm@2088000 {
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
reg = <0x02088000 0x4000>;
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6UL_CLK_PWM3>,
<&clks IMX6UL_CLK_PWM3>;
clock-names = "ipg", "per";
#pwm-cells = <2>;
};
关键参数说明:
reg: 指定PWM控制器的寄存器基地址和范围interrupts: 配置中断号及触发方式clocks: 关联的时钟源(IPG总线和PWM专用时钟)#pwm-cells: 必须设置为2,表示引用该PWM时需要两个参数
2.2 引脚复用配置
PWM输出引脚需要通过IOMUX控制器进行功能复用。以GPIO1_IO04复用为PWM3_OUT为例:
dts复制pinctrl_pwm3: pwm3grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO04__PWM3_OUT 0x1b0b0
>;
};
引脚配置参数解析:
MX6UL_PAD_GPIO1_IO04__PWM3_OUT: 宏定义指定引脚复用功能0x1b0b0: 引脚电气特性配置,包含:- 驱动强度
- 压摆率
- 上拉/下拉电阻
- 开漏配置
- 施密特触发器使能
2.3 设备节点定义
实际使用PWM的设备需要在设备树中声明其依赖关系。以下是LED设备使用PWM3的典型配置:
dts复制led_pwm {
compatible = "pwm-leds";
pinctrl-names = "default";
pinctrl-0 = <&pin
