在 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连接示意图:
视频: