开发板上的蜂鸣器是有源的,所以控制上相对比较简单,要让蜂鸣器出声,只需要把控制gpio口拉高就可了。
什么时候关闭蜂鸣器呢?有两种办法,一是在打开蜂鸣器之后加上一段延时,然后再关闭蜂鸣器。二是使用timer,加延时不好的地方在于蜂鸣器发声之后cpu就不能做其他工作了,在有些情况下会影响用户体验,所以呢,这里需要使用timer来控制。
在蓝牙样板程序中已经有app_timer的初始化,对于我们来说只需要创建一个timer,然后启动这个timer就可了,初始化的代码如下:
注意,默认系统最大timer个数为2个,在timer初始化时就指定了,而这个样板程序中,蓝牙和按键部分就分别使用了一个timer,所以这里我们还需要将timer的最大个数修改为3,才能正常使用timer。
什么时候关闭蜂鸣器呢?有两种办法,一是在打开蜂鸣器之后加上一段延时,然后再关闭蜂鸣器。二是使用timer,加延时不好的地方在于蜂鸣器发声之后cpu就不能做其他工作了,在有些情况下会影响用户体验,所以呢,这里需要使用timer来控制。
在蓝牙样板程序中已经有app_timer的初始化,对于我们来说只需要创建一个timer,然后启动这个timer就可了,初始化的代码如下:
static void timers_init(void)
{
// Initialize timer module, making it use the scheduler
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, true);
/* YOUR_JOB: Create any timers to be used by the application.
Below is an example of how to create a timer.
For every new timer needed, increase the value of the macro APP_TIMER_MAX_TIMERS by
one.
err_code = app_timer_create(&m_app_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
APP_ERROR_CHECK(err_code); */
}
使用APP_TIMER_INIT宏来做初始化。在timers_init()函数中也告诉你了,可以使用app_timer_create()来创建一个timer。
在main()函数里,最后还会调用timers_start()函数,用来启动timer,但是现在这个函数里面是空的,需要自己往里添加的。
最后,蜂鸣器的代码如下:
#include "buzzer.h"
#define BUZZER_EN 12
#define TIMER_INTERVAL APP_TIMER_TICKS(1000, 0)
static app_timer_id_t buzzer_timer_id;
static void buzzer_timer_handler(void *p)
{
buzzer_off();
}
void buzzer_init(void)
{
uint32_t err_code;
err_code = app_timer_create(&buzzer_timer_id, APP_TIMER_MODE_REPEATED,
buzzer_timer_handler);
APP_ERROR_CHECK(err_code);
nrf_gpio_cfg_output(BUZZER_EN);
}
void buzzer_on(void)
{
uint32_t err_code;
nrf_gpio_pin_set(BUZZER_EN);
err_code = app_timer_start(buzzer_timer_id, TIMER_INTERVAL, NULL);
APP_ERROR_CHECK(err_code);
}
void buzzer_off(void)
{
nrf_gpio_pin_clear(BUZZER_EN);
}
在打开蜂鸣器的同时启动一个timer,在timer时间到之后再关闭蜂鸣器。
注意,默认系统最大timer个数为2个,在timer初始化时就指定了,而这个样板程序中,蓝牙和按键部分就分别使用了一个timer,所以这里我们还需要将timer的最大个数修改为3,才能正常使用timer。