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

【经验分享】STM32框架式代码管理LED代码的讲解

[复制链接]
STMCU小助手 发布时间:2022-5-21 19:00
前言% Z3 o, n9 {) F/ L$ _( Y
本文接着上一篇文章的内容带大家学习如何编写一个完整的LED代码。' y6 f" b- f: D' D$ A9 j
9 I" T6 f3 ^/ s% n% E: A+ S
一、头文件以及宏定义的编写
2 w; ]6 A8 Z- i. O7 p* Z4 @+ e
led.c
  Y! V9 i4 g( O+ p: W# f  K
# s, V# ?% U+ h0 d) R# J& |& M: o* S
  1. #include "led.h"
复制代码

, \6 l; j6 P  \在led.c中我们只需要包含.h文件即可
$ x2 D3 h5 [2 g: Uled.h
( ?  s; ?( b' W- D" V' g) ?( \( f4 r( G+ g2 a6 o
  1. #ifndef _LED_H_3 N4 e# y  f1 m% _9 I
  2. #define _LED_H_
    4 u, [& e# c$ w& @2 l  ^+ s

  3. 8 z  S8 [# q1 Y0 M
  4. #include "main.h"
    % T- k3 _/ T0 T& Y' k& t

  5. 0 C$ q, ?4 B. O9 N9 Q* F) D
  6. #define u8 unsigned char
    / W# i, d  w+ ^9 L: S  R8 @1 h
  7. #define u16 unsigned short
    ; K# v: z5 G7 q0 {5 k
  8. #define u32 unsigned int
    ' p. O$ P! d7 f( m$ d0 G* P

  9. 1 x$ o( V  `2 W! ^) U, C0 Y* o
  10. //灯LED2的IO定义' X% i, |! a; I+ f+ H# Q5 X+ ?
  11. #define LED2_RESET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET) //设置LED2低电平
    3 ^6 o+ ^- F6 M" B/ n; T# N
  12. #define LED2_SET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET) //设置LED2高电平
    : `( q0 e7 I/ R+ k9 x- {
  13. ' C. g' e- \6 i) t; s
  14. //灯LED1的IO定义- L: i# ^+ M9 ]9 c4 i
  15. #define LED1_RESET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET) //设置LED1低电平: z- f: S$ K! \( V6 E
  16. #define LED1_SET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET) //设置LED1高电平
    : Z. N9 D! k$ T. s
复制代码

2 v* K5 U' n( M8 ?led.h中的定义比较多一些,需要对LED的端口进行定义方便使用,移植时只需要改写后面的代码即可使用。
, k) H- \8 Q; c; b( B1 r还需要对常用的数据类型进行宏定义,方便书写代码。
7 P7 n- X+ o. _' G1 J2 s
7 K  |& B) H" K- Q5 q0 T* M4 |- A二、框架式管理代码的精华:结构体

" Q# p4 \# R, p2 p8 Bled.h+ q- S/ h$ @9 N5 n
* [8 J, V6 ]% I5 j; a
  1. typedef struct! i' ]8 S7 x& {: s) A- d# I  q
  2. {
    : s% l& e5 W& |+ V7 g) k! g4 n- F. G
  3.         u8 sw; //开关
    4 m' ?+ Y" P$ L0 {9 j9 Z1 V
  4.         u32 pre; //周期2 l+ H# i* f' u
  5.         ( j- H& E7 I$ u' |$ n. c- _" k7 m
  6. } BRE_t;$ }$ e+ M* {; T. |9 {
  7. , i8 i2 D9 f( X! K
  8. typedef struct
    4 X  r, N$ e9 h1 w1 W% n
  9. {! u( W7 c& h3 Q0 p1 Z
  10.         u8 sw; //开关
    6 \+ W8 R1 D  Z! y2 v
  11.         u32 pre; //周期
    . q4 L& R% \% B
  12.         
    5 \7 M) l$ a) ^) _: ?6 q8 @1 p+ E
  13. } BLK_t;
    4 h% H: t5 ~& ~5 P9 C" u5 i* }
  14. 7 y, m2 @: T& G3 S$ ~$ E
  15. typedef struct6 X8 a4 m1 B' F
  16. {" j& w- s0 w; ?: `! b) e" y; S: G; P
  17.     BRE_t bre; //呼吸灯# g) D. P' G/ w
  18.     BLK_t blk; //闪烁灯
    ' ]9 B  _2 y9 p9 Q! u
  19.   ~/ r/ V( J9 ?& }* l
  20. } LED_DATA;8 q( K/ y( Z& F  K  a

  21. 2 D) l) B9 p' ?
  22. extern LED_DATA ledData; //灯属性封装
复制代码

' v! }5 X' U: o# @( M9 S在led.h文件中我们定义了三个结构体,一个是管理呼吸灯属性的结构体,一个是管理闪烁灯属性的结构体。这两个结构体里面分别定义了开关变量和周期变量,通过修改开关变量可以改变LED灯的亮灭,改变周期变量可以让LED灯的呼吸频率和闪烁频率改变。$ N4 P- V0 F/ `; B; o
最后一个结构体作为统筹管理的结构体,他里面定义了呼吸灯结构体变量和闪烁灯结构体变量,方便调试运行。
; E$ s. i! h- [9 ^# Q8 T" T6 ]: f6 y6 H# K5 G" A, r, ]* O
三、函数的编写

2 ^) J) _6 m2 s1 O' l1 j. I7 a
  1. void LED_Init(void); //初始化调用
      M) h5 m( p7 y) k, k/ p9 g$ \8 X
  2. void LED_Task(void); //后台轮询调用: n) O# c" w: ?1 j6 n- d- z" B+ k" A
  3. void LED_TIM_Handle(void); //定时调用
复制代码

( I6 @/ A6 g. J- B/ P' a: n通常我们编写这三个函数: L5 _9 q  K4 |0 D+ z
Init做一些LED灯的初始化比如开关的状态和周期的大小。$ N7 W8 O+ a  S/ X* x. \2 t' P
Task函数一般放在while(1)里面轮询调用
) a* b/ U5 f4 Y1 v6 r# B* X- K& w+ fHandle函数则放在定时器里面中断调用
2 E8 B; s, h+ j* S! h% P# P& T/ ~2 k" ~8 z+ U  N6 ]

: b. a  Q  x6 s/ U  l: O9 Q" H; H7 W0 _3 @9 \; h4 ~
赞 收藏 评论0 发布时间:2022-5-21 19:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版