gd32单片机PWM输出呼吸灯代码
时间: 2024-10-10 12:10:21 浏览: 36
GD32是一款ARM Cortex-M4/M0+系列的微控制器,它支持PWM功能,可以用于制作简单的LED呼吸灯效果。以下是基本的GPIO PWM呼吸灯示例代码,假设我们使用的是通用定时器和一个GPIO作为PWM输出:
```c
#include "gd32fxxx.h"
// 定义LED连接的GPIO口
GPIO_TypeDef* GPIOx = GPIOA;
uint16_t LED_Pin = GPIO_PIN_0; // 假设LED连接到GPIOA的Pin 0
// 初始化GPIO和定时器
void init_PWM(void) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure;
// 配置GPIO为推挽输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = LED_Pin;
GPIO_Init(GPIOx, &GPIO_InitStructure);
// 初始化定时器
TIM_TimeBaseStructure.TIM_Period = 500; // 设置周期为500us (可以根据需求调整)
TIM_TimeBaseStructure.TIM_Prescaler = 84; // 根据系统频率设置预分频值(例如72MHz系统下,84=72M/(1000Hz * 16))
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 使用TIM2定时器
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 开启更新中断
TIM_Cmd(TIM2, ENABLE); // 启动定时器
}
// PWM呼吸灯函数
void pwm_breathe(uint16_t duty_cycle) {
uint16_t period = TIM_GetCounter(TIM2); // 获取当前计数器值
float adjust = duty_cycle / ((float)period * (float)TIM2->ARR); // 调整占空比
GPIO_SetBits(GPIOx, LED_Pin); // 设定高电平
Delay_ms(adjust * 1000); // LED亮起的时间基于占空比调整
GPIO_ResetBits(GPIOx, LED_Pin); // 设定低电平
Delay_ms(((1 - adjust) * 1000)); // LED暗下的时间
}
// 引入延时函数
void Delay_ms(uint16_t ms) {
for (uint16_t i = 0; i < ms; i++);
}
int main(void) {
init_PWM();
while (1) {
pwm_breathe(50); // 调整到50%的 duty cycle
// 如果你想让LED交替强弱变化,可以在这里改变 duty_cycle 的值
}
}
```
阅读全文