这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 换逻辑分析仪_STM32F103_(寄存器)PWM呼吸灯

共5条 1/1 1 跳转至

换逻辑分析仪_STM32F103_(寄存器)PWM呼吸灯

工程师
2024-06-21 17:51:54   被打赏 20 分(兑奖)     打赏

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

image.png


视频:






高工
2024-06-21 21:03:33     打赏
2楼

谢谢分享


高工
2024-06-22 09:23:55     打赏
3楼

谢谢分享


院士
2024-07-03 10:43:38     打赏
4楼

这段代码烧录下去 应该看不到呼吸灯的现象吧!

我估计是半亮状态


院士
2024-07-09 19:12:43     打赏
5楼

嗯嗯,看看下面的delay_ms()函数了。

上次的时候没有注意到


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]