Files
Leakage-Control/leakage_system/usr/bsp/bsp_buzzer.c
T
chenzongxiong 293b1add7c update:
1.变更了引脚,并且添加了一个继电器使用PD7为报警灯
2026-09-03 16:22:51 +08:00

118 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_ON;
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();
}
}