STM32做一个呼吸灯/屏幕亮度调节功能PA1&TIM2CH2 再次回顾定时器的2个参数

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42381351/article/details/80705156

写在前面:

现在屏幕的驱动程序是用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个参数

展开阅读全文

没有更多推荐了,返回首页