前言
本文接着上一篇文章的内容带大家学习如何编写一个完整的LED代码。
一、头文件以及宏定义的编写
led.c
#include "led.h"
在led.c中我们只需要包含.h文件即可 led.h
#ifndef _LED_H_
#define _LED_H_
#include "main.h"
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
#define LED2_RESET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET)
#define LED2_SET() HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET)
#define LED1_RESET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)
#define LED1_SET() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET)
led.h中的定义比较多一些,需要对LED的端口进行定义方便使用,移植时只需要改写后面的代码即可使用。 还需要对常用的数据类型进行宏定义,方便书写代码。
二、框架式管理代码的精华:结构体
led.h
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;
在led.h文件中我们定义了三个结构体,一个是管理呼吸灯属性的结构体,一个是管理闪烁灯属性的结构体。这两个结构体里面分别定义了开关变量和周期变量,通过修改开关变量可以改变LED灯的亮灭,改变周期变量可以让LED灯的呼吸频率和闪烁频率改变。 最后一个结构体作为统筹管理的结构体,他里面定义了呼吸灯结构体变量和闪烁灯结构体变量,方便调试运行。
三、函数的编写
void LED_Init(void);
void LED_Task(void);
void LED_TIM_Handle(void);
通常我们编写这三个函数 Init做一些LED灯的初始化比如开关的状态和周期的大小。 Task函数一般放在while(1)里面轮询调用 Handle函数则放在定时器里面中断调用
总结
信息大家看完这篇文章后应该会更加了解框架式编写代码的流程了。具体的代码放在LED代码 上一篇文章
|