本帖最后由 sujingliang 于 2024-11-1 20:14 编辑
调节LCD背光涉及PWM和GPIO外部中断
一、PWM
- static pwm_ch_t light_pwm_ch;
- static uint16_t lightVal=255; //亮度 255最暗,0最亮
复制代码
PWM初始化
- /*
- * 频率=16/N/(TOP_VAL+1)=16M/1/(255+1)=62500hz
- */
- void light_pwm_init(void)
- {
- hal_pwm_module_init();
- light_pwm_ch.pwmN = (PWMN_e)(PWM_CH0); //CH0
- light_pwm_ch.pwmPin = GPIO_P34; //PWM输出PIN
- light_pwm_ch.pwmDiv = PWM_CLK_NO_DIV; //不分频
- light_pwm_ch.pwmMode = PWM_CNT_UP; //up mode
- light_pwm_ch.pwmPolarity = PWM_POLARITY_RISING; //输出极性
- light_pwm_ch.cmpVal = 0; //
- light_pwm_ch.cntTopVal = 255; //
- }
复制代码 hal_pwm_module_init();初始化PWM为初始值,相当于清空。
控制LED亮度函数,cmpVal数值影响占空比
- int light_ctrl(uint16_t value)
- {
- light_pwm_ch.cmpVal=value;
-
- hal_pwm_ch_start(light_pwm_ch);
- return PPlus_SUCCESS;
- }
复制代码
二、GPIO外部中断
- void posedge_int_cb(GPIO_Pin_e pin,IO_Wakeup_Pol_e type)
- {
- if(type == POSEDGE)
- {
- lightVal++;
- if(lightVal>255) lightVal=0;
- light_ctrl(lightVal);
- }
- }
- void negedge_int_cb(GPIO_Pin_e pin,IO_Wakeup_Pol_e type)
- {
- if(type == NEGEDGE)
- {
- }
- }
- void Key_P15_Init(void)
- {
- hal_gpio_init();
- hal_gpioretention_register(P15);
- hal_gpio_pin_init(P15,IE);
- hal_gpioin_register(P15,posedge_int_cb,negedge_int_cb);
- }
-
复制代码 hal_gpioin_register注册 GPIO 的输入模式,该模式下支持中断和唤醒回调,包括上升沿回调和下降沿回调函数
在上升沿回调中调用了light_ctrl(lightVal)调节亮度。
三、OSAL task init函数中增加
- light_pwm_init();
- Key_P15_Init();
复制代码
四、效果
没有防抖设计,按一下P15好像背光值不只加1。
|