beep.c分析学习

本文详细分析了beep.c文件,该文件主要用于单片机的蜂鸣器驱动开发。通过阅读源代码,我们可以了解如何控制硬件产生蜂鸣声,涉及到嵌入式系统的中断处理、定时器配置和I/O口操作等关键知识点。对于想要深入理解单片机硬件驱动的开发者,这是一个很好的学习案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 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_le
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值