stm32按键控制占空比控制LED灯亮度的代码
时间: 2024-09-15 13:10:56 浏览: 69
在STM32微控制器上,通常使用GPIO和定时器来控制按键并调节LED灯的亮度,通过改变PWM(Pulse Width Modulation)的占空比来实现。以下是一个简单的示例代码,假设我们有一个按键连接到GPIO输入,LED连接到GPIO输出并通过PWM驱动:
```c
#include "stm32f10x.h"
// 定义GPIO口寄存器和定时器配置
#define KEY_PIN GPIO_Pin_0 // 按键引脚
#define LED_PIN GPIO_Pin_1 // LED引脚
#define KEY_GPIO GPIO_PortD // 按键所在的GPIO端口
#define LED_GPIO GPIO_PortA // LED所在的GPIO端口
#define TIMER_ID TIM2 // 使用TIM2定时器
// 初始化GPIO
void gpio_config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOA | RCC_APB1Periph_GPIOD, ENABLE); // 启动GPIO时钟
GPIO_InitStructure.GPIO_Pin = KEY_PIN | LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_INOUT; // 设置GPIO模式为通用I/O
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_GPIO, &GPIO_InitStructure);
}
// PWM初始化
void pwm_init(void) {
TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 启动TIM2时钟
TIM_TimeBaseInitStructure.TIM_Period = 839; // 设置PWM周期,根据实际硬件调整
TIM_TimeBaseInitStructure.TIM_Prescaler = ((SystemCoreClock / 1000000) - 1) / 4; // 计算预分频值
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInit(&TIM_OCInitStructure, LED_PIN); // LED通道设置为PWM模式
TIM_ARRPreloadConfig(TIM2, ENABLE); // 先于计数预装载
TIM_Cmd(TIM2, ENABLE); // 启动定时器
}
// 按键中断服务函数,更新占空比
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // 判断按键是否按下
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志
// 更新占空比,这里仅简单模拟,实际应用应计算更精细的变化
static uint8_t duty_cycle = 50;
TIM_SetCompare(TIM2, LED_PIN, duty_cycle++);
if (duty_cycle > 100) duty_cycle = 50; // 限制占空比范围
}
}
int main(void) {
gpio_config();
pwm_init();
while (1) {
// 这里可以添加其他主循环任务
}
}
阅读全文