写在前面:
现在屏幕的驱动程序是用PA1连接到LCD上,先初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
再调用一句LCD_LED=1;随即点亮屏幕。
额外说明:
#define LCD_LED PAout(1) //LCD背光 //PA1
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
其实就是设置为GPIO_Mode_Out_PP;在拉高,就完事了。
本文想控制屏幕亮度,以前做过呼吸灯,现在算是第二个PWM波的应用吧。
逻辑修改:初始化不能再是GPIO_Mode_Out_PP而是 PA1+定时器TIM2CH2,此后也不能再是GPIO_ResetBits这样的而是TIM_SetCompare2
void TS_Lcd_PWM_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;//!!可以不开中断
/*时钟部分*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
/*GPIO部分*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*设置定时器部分*/
TIM_TimeBaseStruct.TIM_Period=899;
TIM_TimeBaseStruct.TIM_Prescaler=7;
TIM_TimeBaseStruct.TIM_ClockDivision=0;
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;
// TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);//!!可以不开中断--打开这句就开中断啦
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_Cmd(TIM2,ENABLE);
TIM_SetCompare2(TIM2,0);//亮度调节 900灭 0最亮 GPIO_ResetBits(GPIOA ,GPIO_Pin_1)无效!!
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断部分
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //GPRS
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
XXXX
}
因为不是呼吸灯,所以关闭了中断。
现在就可以用啦。
测试中,最开始用的参数是:899 799 也就是如下,以前的做法。
现象是屏幕闪瞎狗眼,修改为899 7999也是一样,狗眼不保。
想了一下,这是我PWM的频率在小了,太慢了,我需要更快的频率高低交换,来让眼睛看不出来。
最后 用899-7 成功了。太快了,所以it最好不用了。
再次回顾定时器的2个参数