沥沥小鱼 2024-04-18 23:00 采纳率: 45.5%
浏览 12
已结题

stm32 板子上的呼吸灯

如何用stm32 板子上自带的一红一绿的灯写呼吸灯
求C语言代码

img

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-18 23:00
    关注

    引自免费微信小程序:皆我百晓生

    为了在STM32板子上实现一个简单的呼吸灯效果,你需要连接两个LED到STM32的GPIO引脚,并编写相应的C语言代码。这里我们假设红灯连接到GPIOA的PA0引脚,绿灯连接到GPIOA的PA1引脚。首先确保你的STM32开发环境已经设置好,例如Keil MDK、IAR EWARM或STM32CubeIDE。

    以下是详细的步骤和代码示例:

    1. 包含必要的头文件

    #include "stm32f1xx_hal.h" // 包含HAL库头文件
    

    2. 定义LED引脚配置

    #define RED_LED_PIN GPIO_PIN_0
    #define GREEN_LED_PIN GPIO_PIN_1
    #define LED_PORT GPIOA
    
    // 定义GPIO模式和速度
    #define GPIO_MODE_OUTPUT_PP    GPIO_MODE_OUTPUT_PP_NO_PUPPED
    #define GPIO_SPEED_FREQ_LOW    GPIO_SPEED_FREQ_LOW
    

    3. 初始化GPIO

    void led_init(void) {
        GPIO_InitTypeDef gpio_config;
    
        // 配置红色LED
        gpio_config.Pin = RED_LED_PIN;
        gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
        gpio_config.Pull = GPIO_NOPULL;
        gpio_config.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(LED_PORT, &gpio_config);
    
        // 配置绿色LED
        gpio_config.Pin = GREEN_LED_PIN;
        HAL_GPIO_Init(LED_PORT, &gpio_config);
    }
    

    4. 呼吸灯函数

    这个函数会逐渐改变LED的亮度(模拟呼吸效果),然后降低亮度回到初始状态。我们将使用定时器来控制这个过程。

    #include "stm32f1xx_tim.h"
    #include "stm32f1xx_rcc.h"
    
    TIM_HandleTypeDef htim;
    
    void tim_init(void) {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM1, ENABLE); // 启动TIM1时钟
    
        htim.Instance = TIM1;
        htim.Init.Prescaler = 84 - 1; // 计算为1秒周期
        htim.Init.CounterMode = TIM_COUNTERMODE_UP;
        htim.Init.Period = 65535; // 最大计数值
        htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
        HAL_TIM_Base_Init(&htim);
    }
    
    void breathe_led(uint8_t red_level, uint8_t green_level) {
        HAL_GPIO_WritePin(LED_PORT, RED_LED_PIN, GPIO_PIN_SET << red_level);
        HAL_GPIO_WritePin(LED_PORT, GREEN_LED_PIN, GPIO_PIN_SET << green_level);
    }
    
    void tim_callback(void) {
        static uint8_t red_step = 0;
        static uint8_t green_step = 0;
        const uint8_t max_steps = 10; // 调整这个值改变呼吸灯的速度
        const uint8_t min_brightness = 1; // 设置最小亮度
    
        if (red_step < max_steps && green_step < max_steps) {
            red_step++;
            green_step++;
        } else if (red_step >= max_steps || green_step >= max_steps) {
            red_step--;
            green_step--;
        }
    
        if (red_step == 0 || red_step > max_steps / 2) {
            red_step = min_brightness;
        }
        if (green_step == 0 || green_step > max_steps / 2) {
            green_step = min_brightness;
        }
    
        breathe_led(red_step, green_step);
    }
    
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
        tim_callback();
    }
    

    5. 主函数

    int main(void) {
        HAL_Init(); // 初始化HAL库
        SystemClock_Config(); // 初始化系统时钟
    
        led_init(); // 初始化LED
        tim_init(); // 初始化定时器
    
        HAL_TIM_Base_Start_IT(&htim); // 启动定时器中断
    
        while (1) {
            // 这里可以添加其他任务,但要确保主循环不会阻塞
        }
    }
    

    以上代码演示了如何在STM32板子上创建一个基本的呼吸灯效果。你可以根据需要调整定时器的参数以及呼吸灯的速度。记得将这段代码整合进你的项目中,并根据实际的硬件连接进行适当的修改。如果你有任何疑问或遇到问题,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 已采纳回答 5月23日
  • 创建了问题 4月18日