stm32cubemax和keil5用PWM波的原理,生成周期为1s和3s的呼吸灯并通过按键来切换的代码
时间: 2024-10-05 10:01:24 浏览: 46
STM32CubeMax是一个基于STMicroelectronics STM32微控制器的软件开发套件,它提供了一系列库文件和驱动程序,方便用户快速上手STM32的硬件操作。Keil5则是STM32的官方集成开发环境(IDE)。
要通过PWM控制LED实现1s和3s的呼吸灯效果,并通过按键切换周期,首先你需要做的是设置GPIO作为输入用于接收按键信号,另一组GPIO作为PWM输出连接到LED。这里是一段简单的示例代码:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_tim.h"
// 定义定时器、GPIO和按键相关的宏
#define LED_PIN GPIO_Pin_0
#define KEY_PIN GPIO_Pin_1
#define KEY_GPIO_PORT GPIOB
#define PWM_TIM TIM2
#define PWM_CHANNEL TIM_CHANNEL_1
// 定义PWM的频率和占空比范围
#define PWM_FREQ_HZ 1000 // 1kHz
#define MIN_DUTY_CYCLE 5 // % (最小5%)
#define MAX_DUTY_CYCLE 95 // % (最大95%)
void setup_PWM(uint32_t period_ms)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 启动TIM2时钟
TIM_TimeBaseInitTypeDef timerConfig;
timerConfig.TIM_Prescaler = (CPU_CLOCK_HZ / 1000) - 1; // 计算周期计数器分频
timerConfig.TIM_CounterMode = TIM_CounterMode_Up; // 上升沿计数
timerConfig.TIM_Period = ((period_ms * 1000) / PWM_FREQ_HZ) - 1; // 设置周期
timerConfig.TIM_ClockDivision = TIM_CKD_DIV1;
timerConfig.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(&PWM_TIM, &timerConfig);
TIM_ARRPreloadConfig(&PWM_TIM, ENABLE); // 预装载寄存器
TIM_Cmd(&PWM_TIM, ENABLE); // 启动定时器
TIM_OCInitTypeDef ocConfig;
ocConfig.TIM_OCMode = TIM_OCMode_PWM1; // 输出模式为PWM
ocConfig.TIM_OutputState = TIM_OutputState_Enable; // 开启输出
ocConfig.TIM_OCPolarity = TIM_OCPolarity_High; // 输出高电平
ocConfig.TIM_OutputCompare = (MAX_DUTY_CYCLE * (PWM_FREQ_HZ / 1000)) - 1; // 设置占空比上限
TIM_OC1Init(&PWM_TIM, &ocConfig);
TIM_OC1PreloadConfig(&PWM_TIM, ENABLE); // 启用预装载
}
void toggle_LED(void)
{
TIM_OC1Cmd(&PWM_TIM, !TIM_OC1StateGet(&PWM_TIM)); // 切换PWM输出状态
}
int main(void)
{
GPIO_InitTypeDef gpioConfig;
gpioConfig.GPIO_Pin = LED_PIN | KEY_PIN;
gpioConfig.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
gpioConfig.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_GPIO_PORT, &gpioConfig);
EXTI_InitTypeDef extiConfig;
extiConfig.EXTI_Line = KEY_PIN;
extiConfig.EXTI_Mode = EXTI_Mode_Interrupt;
extiConfig.EXTI_Trigger = EXTI_Trigger_Rising;
extiConfig.EXTI_LineCmd = ENABLE;
EXTI_Init(&extiConfig);
while (1)
{
if (EXTI_GetITStatus(KEY_PIN) != RESET) // 检查按键是否按下
{
toggle_LED(); // 按键触发LED周期切换
EXTI_ClearITPendingBit(KEY_PIN); // 清除中断标志
}
// 调整PWM周期,例如切换到1秒和3秒
setup_PWM(current_period == 1000 ? 1000 : 3000);
current_period = (current_period + 1) % 2; // 循环切换周期
}
}
```
阅读全文