117 lines
2.8 KiB
C
117 lines
2.8 KiB
C
#include "bsp_buzzer.h"
|
||
#include "bsp_w25q.h"
|
||
|
||
/*开关控制电平,使用同一的电平控制方式*/
|
||
#define BUZZER_GPIO_ON GPIO_PIN_SET
|
||
#define BUZZER_GPIO_OFF GPIO_PIN_RESET
|
||
|
||
#define BUZZER_ON HAL_GPIO_WritePin (BUZZER_GPIO_Port, BUZZER_Pin, BUZZER_GPIO_ON)
|
||
#define BUZZER_OFF HAL_GPIO_WritePin (BUZZER_GPIO_Port, BUZZER_Pin, BUZZER_GPIO_OFF)
|
||
|
||
static void bsp_buzzer_init(void);
|
||
static void bsp_buzzer_task(void);
|
||
static void bsp_buzzer_set(u8 ch,u8 state);
|
||
static void bsp_buzzer_on(void);
|
||
static void bsp_buzzer_off(void);
|
||
static void bsp_buzzer_enable(void);
|
||
static void bsp_buzzer_disable(void);
|
||
static void bsp_buzzer_flash_data_load(void);
|
||
|
||
bsp_buzzer_t buzzer =
|
||
{
|
||
.init = bsp_buzzer_init,
|
||
.task = bsp_buzzer_task,
|
||
.set.on = bsp_buzzer_on,
|
||
.set.off = bsp_buzzer_off,
|
||
.set.enable = bsp_buzzer_enable,
|
||
.set.disable = bsp_buzzer_disable,
|
||
};
|
||
|
||
bsp_buzzer_t *p_buzzer = &buzzer;
|
||
|
||
|
||
static bsp_buzzer_flash_data_t flash_data;
|
||
|
||
/*其他外设初始化后快速闪烁,提示初始化完成*/
|
||
static void bsp_buzzer_init(void)
|
||
{
|
||
BUZZER_OFF;
|
||
p_buzzer->p_flash_data = &flash_data;
|
||
bsp_buzzer_flash_data_load();
|
||
}
|
||
|
||
static void bsp_buzzer_flash_data_save(void)
|
||
{
|
||
// 擦除整个扇区(地址是扇区起始)
|
||
w25q32_sector_erase(W25Q32_BUZZER_STATE_ADDR);
|
||
w25q32.write(W25Q32_BUZZER_STATE_ADDR, (uint8_t*)&flash_data, sizeof(bsp_buzzer_flash_data_t));
|
||
}
|
||
|
||
static void bsp_buzzer_flash_data_load(void)
|
||
{
|
||
w25q32.read(W25Q32_BUZZER_STATE_ADDR, (uint8_t*)&flash_data, sizeof(bsp_buzzer_flash_data_t));
|
||
|
||
// 检查是否全为0xFF(首次使用)
|
||
uint8_t *p = (uint8_t*)&flash_data;
|
||
u8 all_ff = 1;
|
||
for (u8 i = 0; i < sizeof(bsp_buzzer_flash_data_t); i++) {
|
||
if (p[i] != 0xFF) {
|
||
all_ff = 0;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (all_ff) {
|
||
// 首次使用,默认关闭蜂鸣器
|
||
flash_data.sw = USR_DISABLE;
|
||
bsp_buzzer_flash_data_save();
|
||
}
|
||
|
||
// 根据加载的状态设置蜂鸣器使能
|
||
if (flash_data.sw == USR_ENABLE) {
|
||
p_buzzer->p_flash_data->sw = flash_data.sw;
|
||
}
|
||
}
|
||
|
||
static void bsp_buzzer_task(void)
|
||
{
|
||
if(USR_DISABLE == p_buzzer->p_flash_data->sw)
|
||
{
|
||
BUZZER_OFF;
|
||
}
|
||
else if( USR_ON == p_buzzer->state)
|
||
{
|
||
BUZZER_ON;
|
||
}
|
||
else
|
||
{
|
||
BUZZER_OFF;
|
||
}
|
||
}
|
||
|
||
static void bsp_buzzer_on(void)
|
||
{
|
||
p_buzzer->state = USR_ON;
|
||
}
|
||
static void bsp_buzzer_off(void)
|
||
{
|
||
p_buzzer->state = USR_OFF;
|
||
}
|
||
static void bsp_buzzer_enable(void)
|
||
{
|
||
if(USR_ENABLE != p_buzzer->p_flash_data->sw)
|
||
{
|
||
p_buzzer->p_flash_data->sw = USR_ENABLE;
|
||
bsp_buzzer_flash_data_save();
|
||
}
|
||
}
|
||
|
||
static void bsp_buzzer_disable(void)
|
||
{
|
||
if(USR_DISABLE != p_buzzer->p_flash_data->sw)
|
||
{
|
||
p_buzzer->p_flash_data->sw = USR_DISABLE;
|
||
bsp_buzzer_flash_data_save();
|
||
}
|
||
}
|