94 lines
2.9 KiB
C
94 lines
2.9 KiB
C
/***
|
||
***************************************************************************
|
||
* @file lcd_pwm.c
|
||
* @brief
|
||
* 定时器初始化,配置pwm,作为LCD的背光调节,若PWM背光引脚改变,除了需要修改相关的宏外,
|
||
* 还需要把下面三个函数改成相应通道的函数 :
|
||
* TIM_OC2Init();
|
||
* TIM_OC2PreloadConfig();
|
||
* TIM_SetCompare2();
|
||
******************************************************************************
|
||
*
|
||
*
|
||
*
|
||
*
|
||
***************************************************************************
|
||
***/
|
||
#include "lcd_pwm.h"
|
||
#include "stm32f4xx.h"
|
||
|
||
static uint16_t LCD_PwmPeriod = 500; // 定时器重载值
|
||
static uint32_t LCD_PwmPrescaler = 90 - 1; // 定时器分频值
|
||
static uint8_t g_pulse = 100;
|
||
|
||
// 函数:TIM4 PWM CH2 IO口初始化
|
||
//
|
||
void LCD_PWM_GPIO(void) {
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
// IO口时钟配置
|
||
RCC_AHB1PeriphClockCmd(LCD_PWM_CLK, ENABLE);
|
||
|
||
// IO引脚复用
|
||
GPIO_PinAFConfig(LCD_PWM_PORT, LCD_PWM_PinSource, LCD_PWM_AF);
|
||
|
||
// IO配置
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // 速度
|
||
|
||
// 初始化 TIM4_CH2 引脚
|
||
GPIO_InitStructure.GPIO_Pin = LCD_PWM_PIN;
|
||
GPIO_Init(LCD_PWM_PORT, &GPIO_InitStructure);
|
||
}
|
||
|
||
// 函数:LCD PWM 占空比设置
|
||
// 参数:pulse - 占空比,范围 0-100
|
||
//
|
||
void LCD_PwmSetPulse(uint8_t pulse) {
|
||
uint16_t compareValue;
|
||
g_pulse = pulse;
|
||
compareValue = pulse * LCD_PwmPeriod / 100; // 根据占空比设置比较值
|
||
TIM_SetCompare2(LCD_TIM, compareValue);
|
||
}
|
||
|
||
// 获取屏幕亮度
|
||
uint8_t LCD_PwmGetPulse(void) { return g_pulse; }
|
||
|
||
// 函数:LCD PWM 初始化
|
||
// 参数: pulse - LCD背光占空比
|
||
// 说明:LCD背光的PWM频率固定为10KHz
|
||
//
|
||
void LCD_PWMinit(uint8_t pulse) {
|
||
|
||
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
|
||
TIM_OCInitTypeDef TIM_OCInitStructure;
|
||
g_pulse = pulse;
|
||
LCD_PWM_GPIO(); // 初始化IO口
|
||
RCC_APB1PeriphClockCmd(LCD_TIM_CLK, ENABLE); /// 使能时钟
|
||
|
||
// 定时器基本设置
|
||
TIM_TimeBaseInitStructure.TIM_Period = LCD_PwmPeriod; // 重载值
|
||
TIM_TimeBaseInitStructure.TIM_Prescaler = LCD_PwmPrescaler; // 分频系数
|
||
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
|
||
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
|
||
|
||
TIM_TimeBaseInit(LCD_TIM, &TIM_TimeBaseInitStructure); // 初始化
|
||
|
||
// PWM输出配置
|
||
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
|
||
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能比较输出
|
||
TIM_OCInitStructure.TIM_OCPolarity =
|
||
TIM_OCPolarity_High; // 小于跳变值输出高电平
|
||
|
||
TIM_OC2Init(LCD_TIM, &TIM_OCInitStructure); // 初始化定时器比较输出通道 2
|
||
TIM_OC2PreloadConfig(LCD_TIM,
|
||
TIM_OCPreload_Enable); // 自动重载比较输出通道 2 的值
|
||
|
||
TIM_ARRPreloadConfig(LCD_TIM, ENABLE); // 使能自动重载
|
||
|
||
TIM_Cmd(TIM4, ENABLE); // 使能定时器
|
||
|
||
LCD_PwmSetPulse(pulse); // 设置占空比
|
||
}
|