RK平台PWM开发总结 电子说
脉宽调制(PWM,Pulse Width Modulation)通过微处理器数字输出控制模拟电路,核心是调整输出波形的周期(信号重复的时间间隔)和占空比(一个周期内高电平持续时间占比),实现对电压、亮度等物理量的精准调控,广泛应用于测量、通信、功率控制等领域。
1.支持模式:共 3 种模式,不同模式用途差异显著
◦Continuous mode(连续模式):持续输出固定周期和占空比的波形,是最常用模式,主要用于背光控制、电机调速等场景
◦One-shot mode(单触发模式):仅输出一个完整波形后停止,适用于单次触发的控制场景(如单次脉冲信号触发)
◦Capture mode(捕获模式):用于捕获外部输入波形的高低电平宽度,典型应用是红外遥控解码(配合中断实现键值识别)
1.硬件配置:内置 4 通道,每个通道对应独立控制单元,支持多设备同时使用 PWM 功能
2.内核兼容性:覆盖 Linux 3.10、4.4 及以上(含 4.19)内核版本,不同版本在驱动接口、DTS 配置上存在差异
1.驱动文件路径与差异
◦统一路径:drivers/pwm/pwm-rockchip.c(所有内核版本通用)

◦内核版本差异:
Linux 3.10:使用原始接口(pwm_config()、pwm_enable()、pwm_disable()),仅支持 Continuous mode
Linux 4.4 及以上(含 4.19):将参数配置与使能 / 禁用封装为pwm_apply_state()函数,支持一次修改多个参数(周期、占空比、极性),效率更高,同样仅支持 Continuous mode
1.DTS 节点配置:需根据内核版本调整参数数量,与“pwm-cells” 值对应

backlight: backlight {compatible = "pwm-backlight";pwms = <&pwm0 0 25000 0>;brightness-levels = <0 1 ... 255>; // 256级亮度,0~255对应0%~100%占空比default-brightness-level = <200>; // 默认亮度(第200级)enable-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>; // 背光使能引脚};
◦参数说明
参数 1:index(通道索引),默认 0(RK 平台每个 PWM 芯片仅 1 个通道)
参数 2:周期(单位:ns),如 25000ns 对应 40KHz 频率
参数 3:极性(可选),PWM_POLARITY_INVERTED表示负极性,仅“pwm-cells=3” 时需配置
◦版本差异示例
Linux 3.10(pwm-cells=2):pwms = <&pwm 0 25000>;
Linux 4.4/4.19(pwm-cells=3):pwms = <&pwm 0 25000 PWM_POLARITY_INVERTED>;
◦背光场景扩展配置:需添加亮度等级、默认亮度、使能引脚等参数,示例如下
1.状态应用(Apply State):触发 PWM 参数配置流程,先判断是否需要加锁
◦需加锁:先执行 Lock 操作,避免配置过程中参数被篡改
◦无需加锁:直接进入参数配置
1.参数配置
◦必选:配置周期(Period)和占空比(Duty Cycle)
◦可选:若支持极性配置(pwm-cells=3),设置极性(Normal/Inverted)
1.锁操作:若之前加锁,配置完成后执行 Unlock
2.使能 / 禁用控制
◦需使能(Enable PWM=yes):执行 Enable 操作,PWM 开始输出波形
◦需禁用(Enable PWM=no):执行 Disable 操作,PWM 停止输出
1.状态同步(Sync State):确保硬件状态与配置参数一致,完成流程
1.导出 PWM 通道:进入/sys/class/pwm/pwmchip0/,执行echo 0 > export,生成pwm0目录(关闭通道执行echo 0 > unexport)
2.配置参数:进入pwm0目录,通过文件写入配置
◦周期:echo 10000 > period(10000ns=10μs,对应 100KHz 频率)
◦占空比:echo 5000 > duty_cycle(5000ns,占空比 50%)
◦极性:echo normal > polarity(normal = 正极性,inversed = 负极性)
1.使能输出:echo 1 > enable(禁用执行echo 0 > enable)
基于 Continuous mode,通过调整 PWM 占空比控制背光亮度:
•正极性:亮度等级 0~255 对应占空比 0%~100%(等级越高越亮)
•负极性:亮度等级与占空比反向(等级越高越暗)
•应用:显示屏背光调节,如手机、平板、电视等设备
1.原理:PWM 捕获红外接收头输出的高低电平宽度,触发中断后 CPU 读取寄存器值,根据 NEC 编码协议(RK 平台仅支持 NEC)解码用户码和键值码
2.操作流程
&remotectl {handle_cpu_id = <2>; // 中断处理CPU核心(4核0~3,双核0~1)ir_key1{rockchip,usercode = <0x4040>;rockchip,key_table = <0xf4 KEY_UP>, <0xf1 KEY_DOWN>; // 键值与功能映射};};
◦打开调试开关:
echo 1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
◦记录键值:按下遥控器按键,通过打印获取 usercode(如 0x4040)和键值(如 0xe9)
◦添加键值到 DTS:在&remotectl {}节点中配置 usercode 和 key_table,示例
•电机调速:通过调整 PWM 占空比控制电机转速(如风扇、小功率电机)
•电压调节(PWM Regulator):配合电源管理模块,输出不同占空比的 PWM 信号实现电压动态调整
1.问题现象:U-Boot 中使用 PWM 调压后,进入 Kernel 阶段 PWM 失效(如电压不足死机)
2.原因:
◦Kernel 未同步 U-Boot 阶段的 PWM 硬件状态(如 clock count)
◦两者时钟源频率、极性、周期配置不一致
1.解决方案
◦更新驱动文件:drivers/pwm/pwm-rockchip.c
◦统一配置:U-Boot 与 Kernel 的 GPLL 时钟频率(PWM 时钟挂在 GPLL 下)、极性、周期保持一致;U-Boot 频率通过开机 log 查看,Kernel 频率通过cat /sys/kernel/debug/clock/clock_tree | grep gpll查看
1.问题现象:系统重启(reboot)后,PWM Regulator 默认电压变化
2.原因:重启时 GRF 寄存器不复位,但 PWM 控制器复位,引脚上下拉配置为 “none” 导致状态异常
3.解决方案
// dtsi中定义pwm2_pin_pull_down: pwm2-pin-pull-down {rockchip,pins = <1 19 RK_FUNC_1 &pcfg_pull_down>;};// dts中覆盖&pwm2 {status = "okay";pinctrl-names = "active";pinctrl-0 = <&pwm2_pin_pull_down>;};
◦确认硬件默认上下拉:通过原理图查看引脚标识(“d”= 下拉,“u”= 上拉,如 RK3399 PWM2 引脚 GPIO1_C3/PWM2_d 为默认下拉)
◦DTS 配置引脚上下拉:在 dtsi 中定义 pinctrl,dts 中覆盖配置,示例
1.第一步:检查 PWM 是否工作(通过 Counter Register 寄存器)
◦寄存器值变化:PWM 工作正常,问题在引脚
可能原因:iomux 配置错误(引脚功能未切换为 PWM)、io-domain 配置错误、外部硬件干扰
解决方案:重新配置 iomux 和 io-domain,排查硬件接线或干扰源
◦寄存器值无变化:PWM 工作异常,问题在核心配置
可能原因:时钟未使能、PWM 未使能、duty>period(占空比配置无效)、RK3368 未配置 GRF_SOC_CON15 寄存器 bit12=1
解决方案:使能时钟和 PWM,修正 duty 与 period 关系,RK3368 额外配置 GRF 寄存器
全部0条评论
快来发表一下你的评论吧 !