在 STM32F103 微控制器上使用寄存器库来实现 PWM 呼吸灯效果,涉及直接操作 STM32F103 的寄存器来配置和控制 PWM 信号输出。
下面是实现该功能的详细步骤:
1. 硬件连接确保 LED 的正极连接到 PWM 输出引脚 PA0,负极连接到一个限流电阻,然后连接到地,限流电阻120R。
软件实现流程:
2. 初始化系统时钟首先配置系统时钟,确保微控制器工作在合适的频率下。配置系统时钟为 72 MHz。3. 配置 GPIO将 PA0 引脚配置为复用功能输出,以便它可以输出 PWM 信号。4. 配置定时器使用定时器 2 来生成 PWM 信号。配置定时器的频率和 PWM 周期。5. 实现 PWM 呼吸灯效果通过软件调整 PWM 占空比,实现 LED 的呼吸效果。代码:
#include "stm32f10x.h"
// 延迟函数
void delay_ms(uint32_t ms) {
uint32_t i;
for(i = 0; i < ms * 8000; i++);
}
// 初始化系统时钟
void SystemClock_Config(void) {
// 配置系统时钟为 72 MHz
RCC->CFGR |= RCC_CFGR_PLLMULL9; // PLL 倍频因子 9
RCC->CR |= RCC_CR_PLLON; // 启用 PLL
while(!(RCC->CR & RCC_CR_PLLRDY)); // 等待 PLL 准备就绪
RCC->CFGR |= RCC_CFGR_SW_PLL; // 选择 PLL 作为系统时钟
while(!(RCC->CFGR & RCC_CFGR_SWS_PLL)); // 等待 PLL 作为系统时钟
}
// 初始化 GPIO
void GPIO_Init(void) {
// 启用 GPIOA 时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// 将 PA0 配置为复用功能推挽输出
GPIOA->CRL &= ~GPIO_CRL_MODE0; // 清除 MODE0 位
GPIOA->CRL |= GPIO_CRL_MODE0_1; // 设置 MODE0 为 10(输出模式,最大速度 2 MHz)
GPIOA->CRL &= ~GPIO_CRL_CNF0; // 清除 CNF0 位
GPIOA->CRL |= GPIO_CRL_CNF0_1; // 设置 CNF0 为 10(复用功能推挽输出)
}
// 初始化定时器 2
void TIM2_Init(void) {
// 启用 TIM2 时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
// 配置 TIM2 为 PWM 模式
TIM2->PSC = 719; // 预分频器,频率 = 72 MHz / (719 + 1) = 100 kHz
TIM2->ARR = 999; // 自动重装载寄存器,PWM 频率 = 100 kHz / (999 + 1) = 100 Hz
TIM2->CCR1 = 0; // 初始占空比为 0
TIM2->CCMR1 |= TIM_CCMR1_OC1M_PWM1; // 配置为 PWM 模式 1
TIM2->CCER |= TIM_CCER_CC1E; // 启用捕获比较通道 1 输出
TIM2->CR1 |= TIM_CR1_CEN; // 启用 TIM2
}
int main(void) {
SystemClock_Config();
GPIO_Init();
TIM2_Init();
uint32_t brightness = 0;
uint8_t direction = 0;
while(1) {
// 调整亮度
if(direction == 0) {
brightness++;
if(brightness >= 999) {
direction = 1;
}
} else {
brightness--;
if(brightness == 0) {
direction = 0;
}
}
TIM2->CCR1 = brightness; // 更新占空比
delay_ms(1); // 延迟
}
}代码说明
SystemClock_Config():配置系统时钟为 72 MHz。
GPIO_Init():将 PA0 配置为复用功能推挽输出。
TIM2_Init():配置 TIM2 产生 100 Hz 的 PWM 信号,初始占空比为 0。
主函数:在主循环中,通过逐步增加和减少 PWM 占空比来实现 LED 的呼吸效果。
开发板与LED连接示意图:

视频:

我要赚赏金
