第六篇 蜂鸣器和app_timer

来源:互联网 发布:微分销源码 .net 编辑:程序博客网 时间:2024/05/17 03:12
开发板上的蜂鸣器是有源的,所以控制上相对比较简单,要让蜂鸣器出声,只需要把控制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。

原创粉丝点击