You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.5 KiB
145 lines
3.5 KiB
2 years ago
|
### 面向对象封装
|
||
|
|
||
|
以LED为例
|
||
|
|
||
|
### 调用
|
||
|
|
||
|
外部引用结构体实例化
|
||
|
头文件
|
||
|
#include "led.h"
|
||
|
extern struct led led_g;
|
||
|
extern struct led led_r;
|
||
|
|
||
|
源程序文件
|
||
|
struct led led_g;
|
||
|
struct led led_r;
|
||
|
|
||
|
状态相关的枚举 无需额外引入
|
||
|
|
||
|
|
||
|
|
||
|
### 代码
|
||
|
|
||
|
```C
|
||
|
#ifndef __LED_H
|
||
|
#define __LED_H
|
||
|
|
||
|
#include "stdint.h"
|
||
|
#include "main.h"
|
||
|
#define LED_MAX_NUM 4
|
||
|
|
||
|
// 回调需要这个参数,控制时开关还是闪烁,闪烁快慢
|
||
|
enum led_state{
|
||
|
LED_STATE_ON,
|
||
|
LED_STATE_FLICKER_SLOW,
|
||
|
LED_STATE_FLICKER_MEDIUM,
|
||
|
LED_STATE_FLICKER_QUICK,
|
||
|
LED_STATE_OFF
|
||
|
|
||
|
};
|
||
|
|
||
|
// 标准库的 GPIO_TypeDef, 改为HAL库
|
||
|
struct led
|
||
|
{
|
||
|
enum led_state state;
|
||
|
GPIO_TypeDef *gpio;
|
||
|
uint16_t pin;
|
||
|
uint16_t level_on;
|
||
|
};
|
||
|
|
||
|
// 依据GPIO 信息注册
|
||
|
int led_register(struct led *led, GPIO_TypeDef *gpio, uint16_t pin, enum led_state state, uint16_t level_on );
|
||
|
|
||
|
// 初始化状态
|
||
|
int led_set_state(struct led *led,enum led_state state);
|
||
|
|
||
|
// 执行 -- 由状态决定
|
||
|
void led_callback(void);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
```C
|
||
|
#include "led.h"
|
||
|
|
||
|
static struct led *led_table[LED_MAX_NUM];
|
||
|
static uint32_t p_led_table=0;
|
||
|
/**
|
||
|
* @brief 注册LED灯
|
||
|
*
|
||
|
* @param led struct led 结构指针
|
||
|
* @param gpio LED所在的GPIO
|
||
|
* @param pin LED所在的引脚
|
||
|
* @param state LED初始状态
|
||
|
* @param level_on LED点亮时的电平 1:高 0:低
|
||
|
* @return int 0:成功 非0:失败
|
||
|
*/
|
||
|
int led_register(struct led *led,GPIO_TypeDef *gpio,uint16_t pin,enum led_state state,uint16_t level_on)
|
||
|
{
|
||
|
if(p_led_table>=LED_MAX_NUM-1){
|
||
|
return -1;
|
||
|
}
|
||
|
led->gpio=gpio;
|
||
|
led->pin=pin;
|
||
|
led->state=state;
|
||
|
led->level_on=level_on;
|
||
|
led_table[p_led_table++]=led;
|
||
|
return 0;
|
||
|
}
|
||
|
/**
|
||
|
* @brief 设置LED状态
|
||
|
*
|
||
|
* @param led struct led 结构指针
|
||
|
* @param state LED状态
|
||
|
* @return int 0:成功
|
||
|
*/
|
||
|
int led_set_state(struct led *led,enum led_state state)
|
||
|
{
|
||
|
led->state=state;
|
||
|
return 0;
|
||
|
}
|
||
|
/**
|
||
|
* @brief led回调函数 每100ms调用一次
|
||
|
*
|
||
|
*/
|
||
|
void led_callback(void)
|
||
|
{
|
||
|
int i;
|
||
|
static uint32_t tick_con=0;
|
||
|
tick_con++;
|
||
|
for(i=0;i<p_led_table;i++){
|
||
|
switch (led_table[i]->state)
|
||
|
{
|
||
|
case LED_STATE_OFF:
|
||
|
HAL_GPIO_WritePin( led_table[i]->gpio,led_table[i]->pin,(~led_table[i]->level_on)&1 );
|
||
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,(~led_table[i]->level_on)&1);
|
||
|
break;
|
||
|
case LED_STATE_ON:
|
||
|
HAL_GPIO_WritePin( led_table[i]->gpio,led_table[i]->pin,led_table[i]->level_on&1 );
|
||
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,led_table[i]->level_on&1);
|
||
|
break;
|
||
|
case LED_STATE_FLICKER_QUICK:
|
||
|
HAL_GPIO_TogglePin( led_table[i]->gpio,led_table[i]->pin);
|
||
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,!GPIO_ReadOutputDataBit(led_table[i]->gpio,led_table[i]->pin));
|
||
|
break;
|
||
|
case LED_STATE_FLICKER_MEDIUM:
|
||
|
if((tick_con&0x01)==0){
|
||
|
HAL_GPIO_TogglePin( led_table[i]->gpio,led_table[i]->pin);
|
||
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,!GPIO_ReadOutputDataBit(led_table[i]->gpio,led_table[i]->pin));
|
||
|
}
|
||
|
break;
|
||
|
case LED_STATE_FLICKER_SLOW:
|
||
|
if((tick_con&0x03)==0){
|
||
|
HAL_GPIO_TogglePin( led_table[i]->gpio,led_table[i]->pin);
|
||
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,!GPIO_ReadOutputDataBit(led_table[i]->gpio,led_table[i]->pin));
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
```
|