stm32F07 HAL 库 通过定时器方式实现呼吸灯 自定义呼吸灯函数 (以参数方式设置io口,亮或灭的持续时间,亮或灭的频率,从最低亮度开始上升)

效果:

 

1、通过Stm32CubMX开启定时器、设置对应的io口,然后生成工程

  STM32CubeMX | STM32 HAL库方式的微秒延时函数

 

 

2、自定义呼吸灯函数代码:

//  呼吸灯 函数
//  GPIO_TypeDef* GPIOx : GPIO组 (A - G)
//  uint16_t GPIO_Pin   : IO口 (GPIO_Pin_0 -- GPIO_Pin_16)
//  uint8_t  continueTime : 亮或灭的持续时间
//  uint16_t frequency    : 亮或灭的频率
//  uint8_t  minimumLuminance :从最低亮度开始上升
void BreathLed(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,uint8_t continueTime, uint16_t frequency,uint8_t  minimumLuminance)
{
    uint16_t t = 1;
    uint8_t toggle = 0;
    for(int i =0;i<frequency*2;i++)
    {
        if(toggle == 0)
        {
            for(int i =0;i<continueTime;i++)
            {
                    HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_RESET);
                    delay_us(t+minimumLuminance);
                    HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_SET);
                    delay_us((frequency +1)-t);
            }
            t++;
            if(t == frequency)
            {
                    toggle = 1;
            }
        }    
        
        if(toggle == 1)
        {
                for(int i = 0;i<continueTime;i++)
                {
                        HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_RESET);
                      delay_us(t+minimumLuminance);
                      HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_SET);
                      delay_us((frequency +1)- t);
                }
                t--;
                if(t==1)
                {
                        toggle = 0;
                }
        }
    }    
}

3、在main函数中调用代码:

 while (1)
  {
    /* USER CODE END WHILE */
        BreathLed(GPIOA,GPIO_PIN_6,10,200,16);
        
    /* USER CODE BEGIN 3 */
  }

 

posted @ 2024-04-30 09:21  雾枫  阅读(9)  评论(0编辑  收藏  举报