17.背光PWM调节
17.背光PWM调节
#include "bsp_backlight.h"
#include "bsp_int.h"struct backlight_dev_struc backlight_dev;
unsigned int i = 0;
void backlight_init(void){//IO初始化IOMUXC_SetPinMux(IOMUXC_GPIO1_IO08_PWM1_OUT,0); IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO08_PWM1_OUT,0Xb090);//pwm初始化PWM1->PWMCNR = 0;PWM1->PWMCR |= (1<<16)|(65<<4)|(1<<26);pwm1_setperiod_value(1000);//设置占空比backlight_dev.pwm_duty = 50;for(i = 0;i<4;i++){pwm1_set_duty(backlight_dev.pwm_duty );}PWM1->PWMIR = 1<<0; //使能FIFO空中断GIC_EnableIRQ(PWM1_IRQn);system_register_irqhandler(PWM1_IRQn,(system_irq_handler_t)pwm1_irqHander, NULL) ;PWM1->PWMSR = 0xff;//打开PWMPWM1->PWMCR |= 1<<0;
} //中断处理函数
void pwm1_irqHander(unsigned int gicciar, void * param){if(PWM1->PWMSR &(1<<3 )) {pwm1_set_duty(backlight_dev.pwm_duty);PWM1->PWMSR |= (1<<3);}
}//设置PR寄存器void pwm1_setperiod_value(unsigned int value){unsigned int regvalue = 0;if (value < 2 ){regvalue = 2;}else{regvalue = value -2;} PWM1->PWMPR = (regvalue & 0xFFFF);
}
void pwm1_set_duty(unsigned char duty){unsigned short period;unsigned short sample;backlight_dev.pwm_duty = duty;period = PWM1->PWMPR +2;sample = (unsigned short)(period * backlight_dev.pwm_duty /100.0f);PWM1->PWMSAR =(sample & 0xffff);}
bsp_backlight.h
#ifndef __BSP_BACKLIGHT_H
#define __BSP_BACKLIGHT_H
#include "imx6ul.h"struct backlight_dev_struc
{unsigned char pwm_duty;
};extern struct backlight_dev_struc backlight_dev;
void pwm1_irqHander(unsigned int gicciar, void * param);
void backlight_init(void);
void pwm1_setperiod_value(unsigned int value);
void pwm1_set_duty(unsigned char duty);
#endif
(unsigned short)(period * backlight_dev.pwm_duty /100.0f);
period * backlight_dev.pwm_duty /100,除法运算要小心,需要使用浮点计算后强制转换为整形。
