你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32框架式管理代码第一篇LED代码的管理

[复制链接]
STMCU小助手 发布时间:2022-5-21 18:00
前言
这篇文章将正式开始带大家学习框架式编程。

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

二、cubeMX配置
这里我会用到两个LED灯一个作为闪烁灯,一个作为呼吸灯。

BYR}%]SXER(J$WYKQ@M9M@N.png

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

三、代码展示
led.c文件

  1. #include "led.h"

  2. LED_DATA ledData;

  3. static void LED_Bre_Ser(void); //启动一个处理bre的服务
  4. static void LED_Blk_Ser(void); //启动一个处理blk的服务

  5. void LED_Bre_Ser(void)
  6. {
  7.     static u16 count=0;
  8.         static u8 step=0;
  9.         static u8 t1=0;
  10.         static u8 t=0;

  11.         if(ledData.bre.sw==0)
  12.         {
  13.                   count=0;
  14.                 t1=0;
  15.                 t=0;
  16.                 step=0;
  17.         return;
  18.         }

  19.     //模拟产生PWM
  20.     if(t<t1)
  21.     {
  22.         LED2_RESET(); //亮
  23.     }
  24.     else
  25.     {
  26.         LED2_SET(); //灭
  27.     }
  28.     t++;
  29.     t=t%64;

  30.     //渐变占空比
  31.     count++;
  32.     if(count>=(ledData.bre.pre/128*5))
  33.     {
  34.         count=0;
  35.         switch(step)
  36.         {
  37.             case 0:
  38.             {
  39.                 t1++;
  40.                 if(t1>=64)
  41.                 {
  42.                     step=1;
  43.                 }
  44.             }
  45.             break;

  46.             case 1:
  47.             {
  48.                 t1--;
  49.                 if(t1==0)
  50.                 {
  51.                     step=0;
  52.                 }
  53.             }
  54.             break;
  55.         }
  56.     }
  57. }

  58. void LED_Blk_Ser(void)
  59. {
  60.     static u32 count=0;
  61.         static u8 step=0;

  62.         if(ledData.blk.sw==0)
  63.         {
  64.         step=0;
  65.                 count=0;
  66.                 return;
  67.         }

  68.         switch(step)
  69.         {
  70.                 case 0:
  71.                 {
  72.                         count++;
  73.                         if(count>=(ledData.blk.pre/2*5))
  74.                         {
  75.                                 count=0;
  76.                                 LED1_SET(); //灭
  77.                                 step=1;
  78.                         }
  79.                 }
  80.                 break;

  81.                 case 1:
  82.                 {
  83.                         count++;
  84.                         if(count>=(ledData.blk.pre/2*5))
  85.                         {
  86.                                 count=0;
  87.                                 LED1_RESET(); //亮
  88.                                 step=0;
  89.                         }
  90.                 }
  91.                 break;
  92.         }
  93. }

  94. void LED_Init(void)
  95. {
  96.     LED2_SET(); //LED2灭
  97.         LED1_SET(); //LED1灭
  98.         
  99.         //设定初始值
  100.         ledData.bre.sw=1;
  101.         ledData.bre.pre=2000; //2000ms
  102.     ledData.blk.sw=1;
  103.         ledData.blk.pre=1000; //1000ms
  104. }

  105. void LED_Task(void)
  106. {

  107. }

  108. void LED_TIM_Handle(void)
  109. {
  110.     LED_Bre_Ser();
  111.     LED_Blk_Ser();
  112. }
复制代码

led.h文件

  1. #ifndef _LED_H_
  2. #define _LED_H_

  3. #include "main.h"

  4. #define u8 unsigned char
  5. #define u16 unsigned short
  6. #define u32 unsigned int

  7. //灯LED2的IO定义
  8. #define LED2_RESET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET) //设置LED2低电平
  9. #define LED2_SET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET) //设置LED2高电平

  10. //灯LED1的IO定义
  11. #define LED1_RESET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET) //设置LED1低电平
  12. #define LED1_SET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET) //设置LED1高电平

  13. typedef struct
  14. {
  15.         u8 sw; //开关
  16.         u32 pre; //周期
  17.         
  18. } BRE_t;

  19. typedef struct
  20. {
  21.         u8 sw; //开关
  22.         u32 pre; //周期
  23.         
  24. } BLK_t;

  25. typedef struct
  26. {
  27.     BRE_t bre; //呼吸灯
  28.     BLK_t blk; //闪烁灯

  29. } LED_DATA;

  30. extern LED_DATA ledData; //灯属性封装

  31. void LED_Init(void); //初始化调用
  32. void LED_Task(void); //后台轮询调用
  33. void LED_TIM_Handle(void); //定时调用

  34. #endif
复制代码

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


收藏 评论0 发布时间:2022-5-21 18:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版