BB端PWM FIFO mode配置参数说明
时间:10-02
整理:3721RD
点击:
PWM FIFO mode配置说明如下:
struct _PWM_MODE_FIFO_REGS {
U16 IDLE_VALUE;
U16 GUARD_VALID;
U16 STOP_BITPOS_VALUE;
U16 HDURATION;
U16 LDURATION;
U32 GDURATION;
U32 SEND_DATA0;
U32 SEND_DATA1;
U32 WAVE_NUM;
}PWM_MODE_FIFO_REGS;
1:pwm_no:是选取需要的PWM number,有PWM0,PWM1,PWM2,PWM3,PWM4,PWM5,PWM6供User选择
。
2:mode:选择PWM_MODE_FIFO;
3:clk_src:PWM_CLK_NEW_MODE_BLOCK (52MHz), PWM_CLK_NEW_MODE_BLOCK_div_BY_1625 (32KHz);
4:clk_div:CLK_div1, CLK_div2, CLK_div4, CLK_div8, CLK_div16, CLK_div32, CLK_div64,
CLK_div128;
5:IDLE_VALUE:FALSE 或者 TRUE,FALSE则波形传输结束后,该GPIO的电平为低,TRUE则波形传输
结束后,该GPIO的电平为高;
6:GUARD_VALID:FALSE 或者TRUE, FALSE则两次完整的波形之间没有间隔时间,TRUE则两次完整
的波形之间有间隔时间,时间由GDURATION决定;
7:GDURATION:当GUARD_VALID 置1,GDURATION才会生效,表示两次完整波形之间的间隔时间,计
算公式:
T = 1/(clk_src/clk_div) * (GDURATION + 1)
Ex:clk_src选择52MHz,clk_div选择1分频,GDURATION = 1
T = 1/(52/1) * (1 + 1) = 40ns
8:HDURATION和LDURATION:分别表示高电平和低电平的持续时间,计算公式:
T = 1/(clk_src/clk_div) * (HDURATION + 1)
Ex:clk_src选择52MHz,clk_div选择1分频,HDURATION = 1
T = 1/(52/1) * (1 + 1) = 40ns
T = 1/(clk_src/clk_div) * (LDURATION + 1)
Ex:clk_src选择52MHz,clk_div选择1分频,LDURATION = 1
T = 1/(52/1) * (1 + 1) = 40ns
NOTE:HDURATION 和LDURATION的值不能为-1,或者小于0的数。
9:STOP_BITPOS_VALUE:是FIFO MODE中send_data0和send_data1在实际传输时的停止位,最大值为
63(因为最多传输64bits)。
10:send_data0和send_data1:是传输的波形的数据,转化成二进制整数以后,1代表高电平,0代
表低电平。
11:wave_num:为波形传输的次数,如果值为0那么只有disable pwm的时候会停止波形传输;
具体的PWM使用说明您还可以参考MT6575_PWM_UserGuide.doc这个文档,以及参考leds.c文件里
backlight_set_pwm()这个函数里的代码。
例如,PWM3输出1KHz,占空比是50%的方波,可以尝试如下配置:
pwm_setting.pwm_no = 3;
pwm_setting.mode = PWM_MODE_FIFO;
pwm_setting.clk_src = PWM_CLK_NEW_MODE_BLOCK;//52MHz
pwm_setting.clk_div = CLK_div128; // 52MHz/128
pwm_setting.PWM_MODE_FIFO_REGS.IDLE_VALUE = 0;
pwm_setting.PWM_MODE_FIFO_REGS.GUARD_VALID = 0;
pwm_setting.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 63; // 52MHz/128/64
pwm_setting.PWM_MODE_FIFO_REGS.HDURATION = 3;
pwm_setting.PWM_MODE_FIFO_REGS.LDURATION = 3; // 52MHz/128/64/(3+3)1KHz
pwm_setting.PWM_MODE_FIFO_REGS.GDURATION = 0;
pwm_setting.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
pwm_setting.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0xFFFFFFFF; // duty is 50%
pwm_setting.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0x00000000;
pwm_set_spec_config(&pwm_setting);
struct _PWM_MODE_FIFO_REGS {
U16 IDLE_VALUE;
U16 GUARD_VALID;
U16 STOP_BITPOS_VALUE;
U16 HDURATION;
U16 LDURATION;
U32 GDURATION;
U32 SEND_DATA0;
U32 SEND_DATA1;
U32 WAVE_NUM;
}PWM_MODE_FIFO_REGS;
1:pwm_no:是选取需要的PWM number,有PWM0,PWM1,PWM2,PWM3,PWM4,PWM5,PWM6供User选择
。
2:mode:选择PWM_MODE_FIFO;
3:clk_src:PWM_CLK_NEW_MODE_BLOCK (52MHz), PWM_CLK_NEW_MODE_BLOCK_div_BY_1625 (32KHz);
4:clk_div:CLK_div1, CLK_div2, CLK_div4, CLK_div8, CLK_div16, CLK_div32, CLK_div64,
CLK_div128;
5:IDLE_VALUE:FALSE 或者 TRUE,FALSE则波形传输结束后,该GPIO的电平为低,TRUE则波形传输
结束后,该GPIO的电平为高;
6:GUARD_VALID:FALSE 或者TRUE, FALSE则两次完整的波形之间没有间隔时间,TRUE则两次完整
的波形之间有间隔时间,时间由GDURATION决定;
7:GDURATION:当GUARD_VALID 置1,GDURATION才会生效,表示两次完整波形之间的间隔时间,计
算公式:
T = 1/(clk_src/clk_div) * (GDURATION + 1)
Ex:clk_src选择52MHz,clk_div选择1分频,GDURATION = 1
T = 1/(52/1) * (1 + 1) = 40ns
8:HDURATION和LDURATION:分别表示高电平和低电平的持续时间,计算公式:
T = 1/(clk_src/clk_div) * (HDURATION + 1)
Ex:clk_src选择52MHz,clk_div选择1分频,HDURATION = 1
T = 1/(52/1) * (1 + 1) = 40ns
T = 1/(clk_src/clk_div) * (LDURATION + 1)
Ex:clk_src选择52MHz,clk_div选择1分频,LDURATION = 1
T = 1/(52/1) * (1 + 1) = 40ns
NOTE:HDURATION 和LDURATION的值不能为-1,或者小于0的数。
9:STOP_BITPOS_VALUE:是FIFO MODE中send_data0和send_data1在实际传输时的停止位,最大值为
63(因为最多传输64bits)。
10:send_data0和send_data1:是传输的波形的数据,转化成二进制整数以后,1代表高电平,0代
表低电平。
11:wave_num:为波形传输的次数,如果值为0那么只有disable pwm的时候会停止波形传输;
具体的PWM使用说明您还可以参考MT6575_PWM_UserGuide.doc这个文档,以及参考leds.c文件里
backlight_set_pwm()这个函数里的代码。
例如,PWM3输出1KHz,占空比是50%的方波,可以尝试如下配置:
pwm_setting.pwm_no = 3;
pwm_setting.mode = PWM_MODE_FIFO;
pwm_setting.clk_src = PWM_CLK_NEW_MODE_BLOCK;//52MHz
pwm_setting.clk_div = CLK_div128; // 52MHz/128
pwm_setting.PWM_MODE_FIFO_REGS.IDLE_VALUE = 0;
pwm_setting.PWM_MODE_FIFO_REGS.GUARD_VALID = 0;
pwm_setting.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 63; // 52MHz/128/64
pwm_setting.PWM_MODE_FIFO_REGS.HDURATION = 3;
pwm_setting.PWM_MODE_FIFO_REGS.LDURATION = 3; // 52MHz/128/64/(3+3)1KHz
pwm_setting.PWM_MODE_FIFO_REGS.GDURATION = 0;
pwm_setting.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
pwm_setting.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0xFFFFFFFF; // duty is 50%
pwm_setting.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0x00000000;
pwm_set_spec_config(&pwm_setting);
学习啦 每天都有新的知识学习
互相学习
