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

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

[复制链接]
STMCU小助手 发布时间:2022-5-21 19:00
前言2 E% K! `. ^4 \- d. W+ A5 t3 E
本文接着上一篇文章的内容带大家学习如何编写一个完整的LED代码。; ^8 u5 u2 X1 x' _7 N# v8 Y

; |; R9 J! R9 ^6 m8 p3 X9 Z一、头文件以及宏定义的编写
4 T9 \5 T& q  _8 O% P
led.c
0 F, ^6 Z3 K, s7 _
, M7 t+ j% h6 ~  i( x: a
  1. #include "led.h"
复制代码

7 ]! W. i* N8 L在led.c中我们只需要包含.h文件即可/ H  h- D# L8 c$ H- A0 _$ V* K0 q
led.h
! k" w' x4 T& g3 c+ g' N9 g* r
6 @& p' H5 r! {
  1. #ifndef _LED_H_
    9 R. `( Y5 Z  s% y
  2. #define _LED_H_
    4 L* e# [! j1 n" j7 K

  3. 6 o* Z! O; X; t! Y
  4. #include "main.h"
    ' b/ I. B( U  B* F/ ^% `5 Z

  5. * y' N* l8 G, @: Y
  6. #define u8 unsigned char6 F) L; _. `! U
  7. #define u16 unsigned short
    8 t4 y! D$ W4 [. w, j! q
  8. #define u32 unsigned int
      c1 x- a$ a2 C1 ~3 y4 Q& E
  9. 6 x  d  k2 O; T* X6 f
  10. //灯LED2的IO定义
    . d* T# Q- C7 t7 d
  11. #define LED2_RESET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET) //设置LED2低电平. F# F& U; G7 P8 ]& K5 P
  12. #define LED2_SET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET) //设置LED2高电平" Z5 r8 |5 r# v, r
  13. 2 L, z  z( M; q: U6 W
  14. //灯LED1的IO定义1 o) O* T2 e, {. b( a3 U
  15. #define LED1_RESET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET) //设置LED1低电平2 s" @9 C) K5 n) a  H* [
  16. #define LED1_SET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET) //设置LED1高电平
    % V8 S4 _1 ?  U3 n1 Y4 x
复制代码

; s8 L2 I- g( ?7 ^. Gled.h中的定义比较多一些,需要对LED的端口进行定义方便使用,移植时只需要改写后面的代码即可使用。
- J; v: H7 I  R5 u. i还需要对常用的数据类型进行宏定义,方便书写代码。
) q4 J6 f9 M: z* c& c8 e+ N. D( T- z
% N1 X+ K" W' k# C+ M4 K  K二、框架式管理代码的精华:结构体
6 a9 F3 T1 N+ m+ E& ~5 f' h
led.h
, @) d5 L# q4 h2 D& f
9 {  J1 X- Q  \& v: Y
  1. typedef struct/ F/ Q, `& ^0 j+ ~; E/ W0 y! Q4 W/ d
  2. {" |; r4 R' n# S
  3.         u8 sw; //开关* W8 F: A7 g7 w3 s+ R5 |; L
  4.         u32 pre; //周期
    # s0 g& i8 `( w/ H7 W' O
  5.         : }  w, }. c! R; c3 \  B4 T. E
  6. } BRE_t;& g8 ?1 F2 d4 P: O1 e& b

  7. 9 }  ^7 _) d! k6 [# G% l( T+ }# m
  8. typedef struct+ x+ |9 |- e/ W0 B1 q
  9. {! H! {" J/ `3 a, f: X3 g
  10.         u8 sw; //开关
    - u# x0 t) Q# F5 c4 g
  11.         u32 pre; //周期0 }. ~/ q7 X- V2 ?; j; d
  12.         ; L" n7 N7 l* ]  F7 P  l1 U* @
  13. } BLK_t;; R9 p' U6 Y( J

  14. ( a. w( _. C" T+ K: `
  15. typedef struct* I$ V5 T; A- v- o
  16. {' B$ t  O% Q/ U) e$ b
  17.     BRE_t bre; //呼吸灯
    1 D5 h+ ^2 S; Q) U# w3 \$ [6 S
  18.     BLK_t blk; //闪烁灯) X8 F) `, ?; H, F- d8 H4 e& A# o

  19. , S- U6 U/ T6 r  X  i
  20. } LED_DATA;# A% n0 N5 l, a
  21. # g" U6 O! Y$ t" U5 K- m
  22. extern LED_DATA ledData; //灯属性封装
复制代码
' Z& S" p* e$ x/ P% \
在led.h文件中我们定义了三个结构体,一个是管理呼吸灯属性的结构体,一个是管理闪烁灯属性的结构体。这两个结构体里面分别定义了开关变量和周期变量,通过修改开关变量可以改变LED灯的亮灭,改变周期变量可以让LED灯的呼吸频率和闪烁频率改变。+ s; D( C/ z4 I9 ^2 n5 k- e
最后一个结构体作为统筹管理的结构体,他里面定义了呼吸灯结构体变量和闪烁灯结构体变量,方便调试运行。
- Y6 l8 q% Z  X0 O# ?; W% Y# o3 r% A0 k; Y
三、函数的编写
0 @- _9 {! _+ ^
  1. void LED_Init(void); //初始化调用
    ; F3 U: E* N. b# t4 e$ T
  2. void LED_Task(void); //后台轮询调用: s6 H) x  B' d% y) R$ o# K5 Q6 U
  3. void LED_TIM_Handle(void); //定时调用
复制代码

' z# j5 p' y$ R  E9 ^( v通常我们编写这三个函数7 M3 @- {! K6 B' a5 N4 D8 M% G) J
Init做一些LED灯的初始化比如开关的状态和周期的大小。3 P8 k( M1 l: Q4 m- {
Task函数一般放在while(1)里面轮询调用
$ O! g8 K! ^5 a! S$ y" l1 u1 WHandle函数则放在定时器里面中断调用: k; K% k1 m( R/ l

. J' C& I2 S2 i) ~! R, E
; ~- N9 a. ?" j" M
* b0 L% d- e( P7 {; D; G* Y
收藏 评论0 发布时间:2022-5-21 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

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