STM32F103ZET6板子使用HAL库编写程序,实现通过定时器PWM输出控制LCD屏亮度,同时PB0引脚是BL,复用功能是TIM3_CH3,或许可以讲PB0复用成PWM,然后控制LCD亮度
时间: 2025-07-26 18:25:46 浏览: 4
<think>我们使用STM32CubeMX配置,但这里我们直接写代码。步骤:
1.初始化TIM3,配置通道3为PWM模式,使用PB0引脚。
2.设置PWM周期(频率)和占空比(初始亮度)。
3.启动PWM输出。
注意:STM32F103ZET6的TIM3_CH3对应的引脚是PB0(数据手册确认)。
具体步骤:-使能TIM3和GPIOB时钟。
-配置PB0为复用推挽输出(复用功能为TIM3_CH3)。
-配置TIM3的基本参数:预分频器、自动重装载值(决定PWM频率)。
-配置TIM3通道3为PWM模式1。-设置初始占空比并启动PWM。代码示例(HAL库):```c//1.定义TIM句柄和初始化结构体TIM_HandleTypeDefhtim3;TIM_OC_InitTypeDef sConfigOC= {0};//2.初始化TIM3void MX_TIM3_Init(void){//基本定时器配置htim3.Instance= TIM3;htim3.Init.Prescaler=72-1;//72MHz/72=1MHz,即1us计数一次htim3.Init.CounterMode= TIM_COUNTERMODE_UP;htim3.Init.Period=10000-1; //自动重装载值,10000us=10ms,即100Hzhtim3.Init.ClockDivision =TIM_CLOCKDIVISION_DIV1;if(HAL_TIM_PWM_Init(&htim3) !=HAL_OK){Error_Handler();}//配置通道3sConfigOC.OCMode= TIM_OCMODE_PWM1;sConfigOC.Pulse=5000;//初始占空比50%(5000/10000)sConfigOC.OCPolarity= TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode= TIM_OCFAST_DISABLE;if(HAL_TIM_PWM_ConfigChannel(&htim3,&sConfigOC, TIM_CHANNEL_3)!= HAL_OK){Error_Handler();}//启动PWM通道HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
}//3.GPIO初始化(在HAL_TIM_PWM_Init中会调用HAL_TIM_PWM_MspInit,我们在那里配置GPIO)
voidHAL_TIM_PWM_MspInit(TIM_HandleTypeDef*tim_pwmHandle)
{GPIO_InitTypeDefGPIO_InitStruct= {0};if(tim_pwmHandle->Instance==TIM3){__HAL_RCC_TIM3_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**TIM3 GPIOConfigurationPB0------>TIM3_CH3*/GPIO_InitStruct.Pin= GPIO_PIN_0;GPIO_InitStruct.Mode= GPIO_MODE_AF_PP;GPIO_InitStruct.Pull= GPIO_NOPULL;GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);}
}//4.在main函数中调用MX_TIM3_Init()初始化//5.改变占空比:使用__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,占空比值);//例如:设置75%占空比:__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,7500);```
说明:
-定时器时钟:STM32F103ZET6主频72MHz,TIM3挂载在APB1上(最大72MHz)。-预分频器Prescaler:72-1,即72分频,得到1MHz的计数器频率(周期1us)。-自动重装载值Period:10000-1,即计数器从0计数到9999,总共10000个周期,所以PWM周期为10000us=10ms,频率100Hz。-占空比:通过设置比较寄存器(CCR)的值,即sConfigOC.Pulse(初始值)或使用__HAL_TIM_SET_COMPARE宏来改变。注意:改变占空比也可以使用函数:```cvoidset_brightness(uint16_t duty) //duty范围0-10000(对应0-100%)
{__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,duty);}
```这样,我们就可以通过改变duty的值(0到自动重装载值,即0-9999)来调整亮度。
注意事项:
-确保系统时钟配置正确(72MHz)。
-如果使用CubeMX,配置更直观,但以上代码可以直接在工程中使用。相关问题:1.如何计算STM32定时器的PWM频率和占空比?2.除了PB0,TIM3的其他通道对应的引脚是什么?
3.如何实现PWM输出渐变效果(呼吸灯效果)?</think>### STM32F103ZET6 PWM控制LCD亮度配置指南
#### 1. **硬件配置**
- **引脚映射**:PB0 对应 TIM3_CH3(参考STM32F103ZE数据手册表9)
- **时钟配置**:
- APB1总线时钟 = 72 MHz(TIM3时钟源)
- PWM频率计算公式:
$$f_{PWM} = \frac{f_{TIM}}{(PSC + 1) \times (ARR + 1)}$$
其中 $PSC$ = 预分频值,$ARR$ = 自动重装载值
#### 2. **CubeMX配置步骤**
1. 使能TIM3:
- 选择通道3 → PWM模式
- 配置参数:
```c
Prescaler (PSC) = 71 // 72分频(72MHz/(71+1)=1MHz)
Counter Period (ARR) = 999 // PWM周期=1000步(1MHz/1000=1kHz)
Pulse = 500 // 初始占空比50%
```
2. 配置PB0引脚:
- 模式:Alternate Function Push-Pull
- 复用功能:TIM3_CH3
#### 3. **HAL库代码实现**
```c
// 1. TIM3初始化
void MX_TIM3_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 71;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim3);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);
HAL_TIM_PWM_Init(&htim3);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 初始占空比
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); // 启动PWM
}
// 2. GPIO初始化(在HAL_TIM_PWM_MspInit中实现)
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle) {
if(tim_pwmHandle->Instance == TIM3) {
__HAL_RCC_TIM3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
// 3. 动态调整亮度函数
void Set_LCD_Brightness(uint16_t duty) {
// 限制占空比范围(0-1000)
duty = (duty > 1000) ? 1000 : duty;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, duty);
}
```
#### 4. **应用示例**
```c
int main(void) {
HAL_Init();
SystemClock_Config();
MX_TIM3_Init();
// 渐变亮度效果
for(int i=0; i<=1000; i+=10) {
Set_LCD_Brightness(i);
HAL_Delay(20);
}
}
```
#### 5. **关键参数说明**
| 参数 | 值 | 说明 |
|------------|--------|-------------------------------|
| PWM频率 | 1 kHz | 适合LCD背光控制 |
| 占空比范围 | 0-1000 | 对应0%-100%亮度 |
| 分辨率 | 0.1% | ARR=999时每步=0.1%亮度变化 |
> **注意**:LCD背光通常需要串联限流电阻(参考LCD规格书),PWM输出需通过MOSFET或专用驱动电路控制背光LED[^1]。
阅读全文
相关推荐


















