beep.c分析学习

/*
 * Copyright (c) 2006-2020, Sunwancn(bwsheng2000@163.com)
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020-02-14     Sunwancn     the first version
 */

#include <rtdevice.h>
#include <rtthread.h>
#include <beep.h>

#ifdef PKG_USING_BEEP

#if !defined(PKG_BEEP_THREAD_STACK_USING_HEAP)
ALIGN(RT_ALIGN_SIZE)
static char beep_thread_stack[PKG_BEEP_THREAD_STACK_SIZE];
static struct rt_thread beep_thread_struct = {0};
#endif /* !defined(PKG_BEEP_THREAD_STACK_USING_HEAP) */

static struct beep_struct beep_data = {0};
static rt_thread_t beep_thread = RT_NULL;

#ifdef PKG_BEEP_PASSIVE_BUZZER
static void beep_set(void);
#endif
static void beep_on(void);
static void beep_off(void);
static void beep_thread_entry(void *parameter);

#if defined(PKG_BEEP_PASSIVE_BUZZER) && defined(PKG_BEEP_SUPPORT_PM_RUN_FREQ_CHANGE)
int pm_run_freq_change(const struct rt_device *device, rt_uint8_t mode)
{
    if (&beep_data.pwm_dev->parent == device)
    {
        beep_set();
    }
    return RT_EOK;
}

static struct rt_device_pm_ops beep_pm_ops =
{
    RT_NULL,
    RT_NULL,
    pm_run_freq_change
};
#endif /* defined(PKG_BEEP_PASSIVE_BUZZER) && defined(PKG_BEEP_SUPPORT_PM_RUN_FREQ_CHANGE) */

/***************************************************************************************************
 * @fn      beep_init
 *
 * @brief   初始化
 *
 * @param   pin         - 蜂鸣器驱动引脚,可查看drv_gpio.c,或使用GET_PIN()宏
 *          reset_level - 蜂鸣器关断时引脚电平,PIN_LOW或PIN_HIGH
 *
 ***************************************************************************************************/
void beep_init(rt_base_t pin, rt_base_t reset_level)
{
#ifdef PKG_BEEP_PASSIVE_BUZZER
    (void)pin;
    (void)reset_level;

    beep_data.pwm_dev = (struct rt_device_pwm *)rt_device_find(PKG_BEEP_PWM_DEV_NAME);
    RT_ASSERT(beep_data.pwm_dev);

    beep_data.freq = PKG_BEEP_DEFAULT_FREQ;

#ifdef PKG_BEEP_SUPPORT_PM_RUN_FREQ_CHANGE
    rt_pm_device_register(&beep_data.pwm_dev->parent, &beep_pm_ops);
#endif /* PKG_BEEP_SUPPORT_PM_RUN_FREQ_CHANGE */

    beep_set();
#else /* PKG_BEEP_ACTIVE_BUZZER */
    rt_pin_write(pin, reset_level);
    rt_pin_mode(pin, PIN_MODE_OUTPUT);

    beep_data.pin = pin;
    beep_data.pin_reset_level = reset_level
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值