STM32框架式管理代码第一篇LED代码的管理

简介: STM32框架式管理代码第一篇LED代码的管理

前言

这篇文章将正式开始带大家学习框架式编程。


一、什么是框架式编程

大多数人都是只在main.c里面编写代码这样会导致代码看起来非常的繁杂,不容易管理。框架式编写代码就是将各种外设写成.c和.h文件这样既方便管理又方便移植。


二、cubeMX配置

这里我会用到两个LED灯一个作为闪烁灯,一个作为呼吸灯。

不太懂LED怎么配置的同学可以看看我之前的文章:配置LED灯闪烁

三、代码展示

led.c文件

#include "led.h"
LED_DATA ledData;
static void LED_Bre_Ser(void); //启动一个处理bre的服务
static void LED_Blk_Ser(void); //启动一个处理blk的服务
void LED_Bre_Ser(void)
{
    static u16 count=0;
  static u8 step=0;
  static u8 t1=0;
  static u8 t=0;
  if(ledData.bre.sw==0)
  {
      count=0;
    t1=0;
    t=0;
    step=0;
        return;
  }
    //模拟产生PWM
    if(t<t1)
    {
        LED2_RESET(); //亮
    }
    else
    {
        LED2_SET(); //灭
    }
    t++;
    t=t%64;
    //渐变占空比
    count++;
    if(count>=(ledData.bre.pre/128*5)) 
    {
        count=0;
        switch(step)
        {
            case 0:
            {
                t1++;
                if(t1>=64)
                {
                    step=1;
                }
            }
            break;
            case 1:
            {
                t1--;
                if(t1==0)
                {
                    step=0;
                }
            }
            break;
        }
    }
}
void LED_Blk_Ser(void)
{
    static u32 count=0;
  static u8 step=0;
  if(ledData.blk.sw==0)
  {
        step=0;
    count=0;
    return;
  }
  switch(step)
  {
    case 0:
    {
      count++;
      if(count>=(ledData.blk.pre/2*5)) 
      {
        count=0;
        LED1_SET(); //灭
        step=1;
      }
    }
    break;
    case 1:
    {
      count++;
      if(count>=(ledData.blk.pre/2*5)) 
      {
        count=0;
        LED1_RESET(); //亮
        step=0;
      }
    }
    break;
  }
}
void LED_Init(void)
{
    LED2_SET(); //LED2灭
  LED1_SET(); //LED1灭
  //设定初始值
  ledData.bre.sw=1;
  ledData.bre.pre=2000; //2000ms
    ledData.blk.sw=1;
  ledData.blk.pre=1000; //1000ms
}
void LED_Task(void)
{
}
void LED_TIM_Handle(void)
{
    LED_Bre_Ser();
    LED_Blk_Ser();
}

led.h文件

#ifndef _LED_H_
#define _LED_H_
#include "main.h"
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
//灯LED2的IO定义
#define LED2_RESET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET) //设置LED2低电平
#define LED2_SET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET) //设置LED2高电平
//灯LED1的IO定义
#define LED1_RESET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET) //设置LED1低电平
#define LED1_SET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET) //设置LED1高电平
typedef struct
{
  u8 sw; //开关
  u32 pre; //周期
} BRE_t;
typedef struct
{
  u8 sw; //开关
  u32 pre; //周期
} BLK_t;
typedef struct
{
    BRE_t bre; //呼吸灯
    BLK_t blk; //闪烁灯
} LED_DATA;
extern LED_DATA ledData; //灯属性封装
void LED_Init(void); //初始化调用
void LED_Task(void); //后台轮询调用
void LED_TIM_Handle(void); //定时调用
#endif

总结

本文我们先展示一下代码的具体内容,下篇文章我们接着讲解代码的具体实现原理。整个工程放在代码

供大家下载学习。

相关文章
|
5月前
【STM32】基于HAL库的360度编码器、摇杆代码编写
【STM32】基于HAL库的360度编码器、摇杆代码编写
|
4月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
353 2
|
18天前
stm32学习 3-2 LED流水灯
stm32学习 3-2 LED流水灯
50 4
|
18天前
stm32学习3-1 LED闪烁
stm32学习3-1 LED闪烁
29 4
|
3月前
STM32CubeMX FreeRTOS点亮LED
STM32CubeMX FreeRTOS点亮LED
71 10
|
3月前
STM32CubeMX 按键控制LED
STM32CubeMX 按键控制LED
54 0
|
3月前
STM32CubeMX 点亮LED
STM32CubeMX 点亮LED
55 0
|
4月前
|
存储 数据安全/隐私保护 芯片
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解独立看门狗的本质和使用步骤&代码
【STM32】详解独立看门狗的本质和使用步骤&代码
|
4月前
|
传感器 数据格式
【STM32】DHT11温湿度模块传感器详解&代码
【STM32】DHT11温湿度模块传感器详解&代码