STM32MP157实验(七)——通用定时器PWM

本文详细介绍了如何利用STM32CubeIDE和定时器TIM配置PWM,实现LCD屏幕亮度的渐变控制。通过设置硬件资源、初始化定时器、编写中断回调函数以及启动PWM,成功达到了LED亮度变化的效果,展示了STM32在控制领域的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


设计需求

利用定时器产生PWM,实现LCD亮度渐变


一、基础知识

PWM(Pulse Width Modulation)、即脉冲宽度0度调制。是一种利用微处理器的数字输出来对模拟电路进行控制的技术,广泛应用在测量、通信、功率控制等诸多领域。

举个最常见的例子,利用PWM控制显示屏亮度,屏幕背光可以看作是一个大灯,这个大灯只有亮,灭两种状态。如果把灯亮看作100%,灯灭看作0%,要实现50%的亮度,可以在某个单位时间里亮灯50%时间、灭灯50%时间,只要这个单位够小,由于人眼具有视觉暂留效应,就会从宏观的感觉整个灯是一直亮着,且亮度只要原来的一半。本节就以LED灯类比屏幕背光灯实现对其亮度的控制。

PWM实质就是GPIO不断地翻转输出高低电平,这个效果可以写代码控制GPIO产生,但是这样就会占用CPU,CPU就不方便去做其他时间。MCU里都有一个定时器,配置好这个定时器,就可以让它去控制CPIO自动翻转,无需CPU再参与

STM32MP157有14个定时器TIM(各有差异),5个低功耗定时器(LPTIM)

硬件知识

参考开发板LED原理图,两个LED灯,分别使用PA10和PG8
在这里插入图片描述通过查阅数据手册可以知道两个脚都支持TIM功能
在这里插入图片描述在这里插入图片描述这里以PG8为例,设置其复用功能位TIM2_CH1输出PWM

在这里插入图片描述

STM32CubeIDE开发

MX设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码设计

在这里插入图片描述

在这里插入图片描述
driver_tim_pwm.h

#ifndef DRIVER_TIM_PWM_H_
#define DRIVER_TIM_PWM_H_

#include "main.h"
#include "stm32mp1xx_hal.h"
extern TIM_HandleTypeDef htim2;

extern void TIM_LED3_Start(void);
#endif /* DRIVER_TIM_PWM_H_ */

driver_tim_pwm.c

#include "driver_tim_pwm.h"
#include "stm32_hal_legacy.h"

static uint32_t pulse=0;

//设置PWM一个周期满,溢出时,的回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	if(htim->Instance==TIM2){
		pulse++;//进入中断回调函数,更改pulse的值,进行更改占空比
		if(pulse>1000){
			pulse=0;
		}
		__HAL_TIM_SetCompare (&htim2, TIM_CHANNEL_1, pulse);
	}
}

//启动PWM函数

void TIM_LED3_Start(void){
	if(HAL_TIM_Base_Start(&htim2)!=HAL_OK){//轮询中断是否开启
		Error_Handler();
	}
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//开启PWM定时器
}

工程结构

在这里插入图片描述

运行结果

在这里插入图片描述
实验现象没问题,黄灯从亮变暗,一直循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacky~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值