guowenxue
4 days ago c6a1e7c00cd2946cef7716b205026a907136778b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/**********************************************************************
*   Copyright: (C)2024 LingYun IoT System Studio
*      Author: GuoWenxue<guowenxue@gmail.com>
* Description: ISKBoard Hardware Abstract Layer driver
*
*   ChangeLog:
*        Version    Date       Author            Description
*        V1.0.0  2024.08.29    GuoWenxue      Release initial version
***********************************************************************/
 
#ifndef __MISCDEV_H
#define __MISCDEV_H
 
#include <stdio.h>
 
#include "stm32l4xx_hal.h"
#include "usart.h"
#include "buzzer.h"
 
/* 定义ON/OFF两个宏,这样在代码中使用比 1/0 更具有可读性 */
#define OFF    0
#define ON     1
 
/*
 *+----------------------+
 *|    STM32 GPIO API    |
 *+----------------------+
 */
 
 
/* 定义一个gpio的结构体,用来描述这个引脚的相关信息 */
typedef struct gpio_s
{
    const char         *name;
    GPIO_TypeDef       *group;
    uint16_t            pin;
    int                 active; /* 1 for active high, 0 for active low */
} gpio_t;
 
extern void gpio_clk_enable(GPIO_TypeDef *port);
 
/*
 *+----------------------+
 *|    GPIO Relay API    |
 *+----------------------+
 */
 
/**
 * @brief  继电器初始化:配置继电器控制引脚对应的GPIO
 */
extern void init_relay(void);
 
/**
 * @brief  控制继电器的开关状态
 * @param  status: ON 或 OFF
 */
extern void turn_relay(int status);
 
/*
 *+----------------------+
 *|     GPIO Led API     |
 *+----------------------+
 */
 
/* 定义了一个枚举,分别表示RGB三个灯的索引:
 * 枚举的第1个成员,如果没赋值则其值为0,后面的成员值永远是前面成员的值加1.
 */
typedef enum
{
    Led_R, /* 其值为0 */
    Led_G, /* 其值为1 */
    Led_B, /* 其值为2 */
    LedMax,/* 其值为3,刚好是Led的总数 */
} lednum_t;
 
/**
 * @brief  LED初始化:配置各LED对应的GPIO状态。
 */
extern void init_led(void);
 
/**
 * @brief  控制指定LED的开关状态
 * @param  which:  LED编号(参考 lednum_t,如 Led_R/Led_G/Led_B)
 * @param  status: ON 或 OFF
 */
extern void turn_led(int which, int status);
 
/**
 * @brief  翻转指定LED当前状态(亮变灭,灭变亮)
 * @param  which: LED编号(参考 lednum_t)
 */
extern void toggle_led(int which);
 
/**
 * @brief  阻塞式闪烁指定LED一次(亮interval毫秒,灭interval毫秒)
 * @param  which:    LED编号(参考 lednum_t)
 * @param  interval: 亮灭各自持续时间(ms)
 */
extern void blink_led(int which, uint32_t interval);
 
/**
 * @brief  绿灯"滴-答"双闪心跳灯:模拟真实心跳节奏(两次快闪 + 一段停顿).
 */
extern void heartbeat_led(void);
 
/*
 *+----------------------+
 *|     GPIO Led API     |
 *+----------------------+
 */
 
/* 定义了一个枚举,分别表示RGB三个灯的索引:
 * 枚举的第1个成员,如果没赋值则其值为0,后面的成员值永远是前面成员的值加1.
 */
typedef enum
{
    Key1, /* 其值为0 */
    Key2, /* 其值为1 */
    Key3, /* 其值为2 */
    KeyMax,/* 其值为3,刚好是Key的总数 */
} keynum_t;
 
/* 按键状态位掩码:对应 g_keys_status 中的第 Key1/Key2/Key3 位被按下 */
#define KEY1_PRESSED    (1<<Key1)
#define KEY2_PRESSED    (1<<Key2)
#define KEY3_PRESSED    (1<<Key3)
 
/* 全局按键状态位图,每一位代表当前按键是否处于"已按下"状态,由中断逻辑置位 */
extern int  g_keys_status;
 
/* 判断指定按键当前是否处于按下状态 */
#define key_pressed(key)  (g_keys_status & (1<<key) )
 
/* 清除指定按键的按下标志 */
#define key_clear(key)    (g_keys_status &= ~(1<<key) )
 
/*
 *+----------------------------+
 *| ADC noisy & lux sensor API |
 *+----------------------------+
 */
 
 /**
 * @brief  采集光照度与噪声值
 * @param  lux:   输出参数,采集到的光照度值
 * @param  noisy: 输出参数,采集到的噪声值
 * @return 0表示成功,-1 表示失败
 */
extern int adc_sample_lux_noisy(uint32_t *lux, uint32_t *noisy);
 
/*
 *+----------------------------+
 *|      Timer delay API       |
 *+----------------------------+
 */
 
/**
 * @brief  微秒级延时,最大支持 60000us,更长延时可以使用 HAL_Delay()
 * @param  us: 延时时长(微秒)
 */
extern void udelay(uint16_t us);
 
/**
 * @brief  毫秒秒级延时,直接使用 HAL_Delay(),方便代码可读性
 * @param  ms: 延时时长(毫秒)
 */
#define mdelay(ms)  HAL_Delay(ms)
 
#endif /* __MISCDEV_H */