/**********************************************************************
|
* 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
|
|
/* 定义一个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;
|
|
/*
|
*+----------------------+
|
*| 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);
|
|
#endif /* __MISCDEV_H */
|