第六篇 蜂鸣器和app_timer

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mcgrady_tracy/article/details/77942929
开发板上的蜂鸣器是有源的,所以控制上相对比较简单,要让蜂鸣器出声,只需要把控制gpio口拉高就可了。

什么时候关闭蜂鸣器呢?有两种办法,一是在打开蜂鸣器之后加上一段延时,然后再关闭蜂鸣器。二是使用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。
展开阅读全文

没有更多推荐了,返回首页