1、在 source_code/kernel/arch/arm/boot/dts/infinity2m-ssc011a-s01a.dtsi 中加入:
pwm {
compatible = "sstar,infinity-pwm";
reg = <0x1F003400 0x600>;
clocks = <&CLK_xtali_12m>;
npwm = <2>; //代表下面的pad-ctrl有2个
pad-ctrl = <PAD_GPIO4 PAD_GPIO5>; // 这里PAD_GPIO4对应PWM0,PAD_GPIO5对应PWM1
status = "ok";
};
2、在 source_code/kernel/arch/arm/boot/dts/infinity2m-ssc011a-s01a-padmux.dtsi中修改:
<PAD_GPIO4 PINMUX_FOR_PWM0_MODE_3 MDRV_PUSE_PWM0 >,
<PAD_GPIO5 PINMUX_FOR_PWM1_MODE_4 MDRV_PUSE_PWM1 >,
ps:然后把 PINMUX_FOR_EJ_MODE_x 模式的几个注释掉,即 PAD_GPIO4-7。同理,对infinity2m-ssc011a-s01a-padmux-display.dtsi做同样的修改!!!
【注】待烧录后可以通过 echo 4 > /sys/class/gpio/export 的方式查看是否配置成功:
如果配置成功只会打印PWM0_MODE_3模式,如果出现PINMUX_FOR_EJ_MODE模式则配置失败。
3、编译kernel前,make menuconfig进去后,进入Device Driver/SStar Soc platform drivers
按空格修改 <> SSTAR_PWM 为 <*> SSTAR_PWM 并保存编译
。
4、操作步骤:
设置PWM0:echo 0 > /sys/class/pwm/pwmchip0/export
设置频率:echo 100 > /sys/class/pwm/pwmchip0/pwm0/period
设置占空比:echo 30 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
设置极性:echo normal或inverse > /sys/class/pwm/pwmchip0/pwm0/polarity
设置使能:echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
ps:如果是normal,那么duty_cycle=25%,表示高电平占的比例是25%,否则反之。
配置完后,用示波器可以测量到下图波形。
通过preject的代码实现模拟的话,应选择用户方式去打开GPIO口,这里无法通过调用 gpio_set_value()等函数。
// 通过GPIO10模拟输出PWM波形: f=100, T=10ms, duty=30%
void Gpio2Pwm(void)
{
int i = 0;
system("echo 10 > /sys/class/gpio/export ");
system("echo out > /sys/class/gpio/gpio10/direction"); // 设置IO口为输出
while(1){
// 通过用户使用IO口的方式拉gpio10口
system("echo 1 > /sys/class/gpio/gpio10/value");
// 增加延时。system语句和for循环共延时3ms
for(i=0; i<23045; i++){
; // 空语句
}
// 通过用户使用IO口的方式拉gpio10口
system("echo 0 > /sys/class/gpio/gpio10/value");
// 增加延时。system语句和for循环共延时7ms
for(i=0; i<516445; i++){
; // 空语句
}
}
}
【注1】通过 system() 去拉IO的方式比较耗时间,我试了一下大概需要2.8ms左右,所以这种方式无法实现非常高频率的 PWM 波形。
ps:换而言之,如果需要获得更高频率的 PWM 波,需要通过配置 kernel 的方式实现。
【注2】当我们要设置想要的频率时,可通过占空比计算高低电平的时间。
ps:我这里设置的是 f=100, T=10ms, duty=30%,也就是高电平3ms,电平7ms。
通过示波器的波形图,可以看出PWM波形的是一样的效果。
以上。
联系客服