本文最后修改时间:2017年11月13日 15:00
一、本节简介
本节以simple_peripheral工程为例,介绍如何控制香瓜开发板上的有源蜂鸣器。
二、实验平台
1)CC2640R2F平台
①协议栈版本:CC2640R2 SDK v1.40.00.45
②编译软件:CCS7.3.0.00019
③硬件平台:香瓜CC2640R2F开发板
④仿真器:香瓜XDS100V3下载器
三、版权声明
1)作者:甜甜的大香瓜
2)声明:喝水不忘挖井人,转载请注明出处。
3)纠错/业务合作:[email protected]
4)香瓜BLE之CC2640R2F群:557278427
5)本文出处:原创连载资料《简单粗暴学蓝牙5》
6)完整开源资料下载地址(电脑端打开):
https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
7)香瓜CC2640R2F开发板购买链接:
https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4023-16963296339.8.21bfc58419sWKt&id=558653143169
8)香瓜XDS100V3下载器购买链接:
https://item.taobao.com/item.htm?spm=a230r.1.14.1.1d150040zvJBco&id=558356989143&ns=1&abbucket=6#detail
四、实验前提
1、在进行本文步骤前,请先阅读以下章节:
1)《简单粗暴学蓝牙5》的“第一章至第四章”章节。
2、在进行本文步骤前,请先实现以下章节:
1)《简单粗暴学蓝牙5》的“第三章 软件的安装及使用”章节。
2)《简单粗暴学蓝牙5》的《香瓜CC2640R2F之LED》:http://blog.csdn.net/feilusia/article/details/78087346
3)《简单粗暴学蓝牙5》的《香瓜CC2640R2F之自定义按键》:http://blog.csdn.net/feilusia/article/details/78239447
4)《简单粗暴学蓝牙5》的《香瓜CC2640R2F之自定义周期事件》:http://blog.csdn.net/feilusia/article/details/78245788
五、基础知识
1、有源蜂鸣器和无源蜂鸣器有什么区别?
答:“源”是指震荡源,而不是指电源。
1)有源蜂鸣器
①优点:蜂鸣器两脚供电(要注意有3V、5V不同电压值的蜂鸣器)就会响,控制简单。
②缺点:贵。
2)无源蜂鸣器
①优点:便宜。
②缺点:蜂鸣器两脚需要2K~5K的方波驱动才会响,使用麻烦。
注:香瓜开发板中使用的是有源蜂鸣器。
六、硬件原理
1、原理图
上图可知:
1)当DIO13为高电平时,蜂鸣器响。
2)当DIO13为低电平时,蜂鸣器不响。
2、开发板对应位置
需将拨码开关的左1(VCC)、左4(BUZZ)按键上拨。
七、实验步骤
1、编写并添加自定义的BEEP驱动
1)写一个BEEP驱动GUA_Beep.c(存放在“……\simplelink_cc2640r2_sdk_1_40_00_45\examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\GUA”路径下)
//**********************************************************************
//name: GUA_Beep.c
//introduce: 香瓜自定义的蜂鸣器驱动
//author: 甜甜的大香瓜
//email: [email protected]
//QQ group: 香瓜BLE之CC2640R2F(557278427)
//shop:
//https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
//changetime: 2017.10.17
//**********************************************************************
#include
#include
#include
#include
#include
#include
#include
#include
#include "GUA_Beep.h"
/*********************宏定义************************/
//IO对应关系
#define GUA_ID_BEEP PIN_ID(13)
/*********************内部变量************************/
static PIN_State sGUA_BeepPins;
static PIN_Handle sGUA_HBeepPins = NULL;
//IO配置
PIN_Config bGUA_BeepPinsCfg[] =
{
GUA_ID_BEEP | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE
};
//**********************************************************************
//name: GUA_Beep_Set
//introduce: 香瓜蜂鸣器驱动
//parameter: nGUA_Mode:GUA_BEEP_MODE_OFF、GUA_BEEP_MODE_ON、
//return: none
//author: 甜甜的大香瓜
//email: [email protected]
//QQ group: 香瓜BLE之CC2640R2F(557278427)
//shop:
//https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
//changetime: 2017.10.17
//**********************************************************************
void GUA_Beep_Set(GUA_U8 nGUA_Mode)
{
//第一次使用时注册IO
if(NULL == sGUA_HBeepPins)
{
sGUA_HBeepPins = PIN_open(&sGUA_BeepPins, bGUA_BeepPinsCfg);
}
//执行模式
switch(nGUA_Mode)
{
//蜂鸣器响模式
case GUA_BEEP_MODE_OFF:
{
PIN_setOutputValue(sGUA_HBeepPins, GUA_ID_BEEP, 0);
break;
}
//蜂鸣器不响模式
case GUA_BEEP_MODE_ON:
{
PIN_setOutputValue(sGUA_HBeepPins, GUA_ID_BEEP, 1);
break;
}
//其他
default:break;
}
}
2)写一个BEEP驱动头文件GUA_Beep.h(存放在“……\simplelink_cc2640r2_sdk_1_40_00_45\examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\GUA”路径下)
//**********************************************************************
//name: GUA_Beep.h
//introduce: 香瓜自定义的蜂鸣器驱动头文件
//author: 甜甜的大香瓜
//email: [email protected]
//QQ group: 香瓜BLE之CC2640R2F(557278427)
//shop:
//https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
//changetime: 2017.09.30
//**********************************************************************
#ifndef _GUA_BEEP_H_
#define _GUA_BEEP_H_
/*********************宏定义************************/
//类型宏
#ifndef GUA_U8
typedef unsigned char GUA_U8;
#endif
//Modes
#define GUA_BEEP_MODE_OFF 0x00
#define GUA_BEEP_MODE_ON 0x01
/*********************函数声明************************/
extern void GUA_Beep_Set(GUA_U8 nGUA_Mode);
#endif
注:拖拽至CCS工程的Application文件夹下
添加文件过程中,选项选择如下
3、应用层调用
1)添加头文件(simple_peripheral.c中)
//GUA
#include "GUA_Beep.h"
//GUA
①修改按键处理函数(替换simple_peripheral.c的GUA_HandleKeys函数)
//GUA
//**********************************************************************
//name: GUA_HandleKeys
//introduce: 应用层按键处理函数
//parameter: GUA_Keys:键值
//return: none
//author: 甜甜的大香瓜
//email: [email protected]
//QQ group: 香瓜BLE之CC2640R2F(557278427)
//shop:
//https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
//changetime: 2017.10.17
//**********************************************************************
static void GUA_HandleKeys(uint8 GUA_Keys)
{
//UP按键
if(GUA_Keys & GUA_KEY_UP_VALUE)
{
//LED1亮
GUA_Led_Set(GUA_LED_NO_1, GUA_LED_MODE_ON);
//蜂鸣器响
GUA_Beep_Set(GUA_BEEP_MODE_ON);
//启动定时器
Util_startClock(&GUA_periodicClock);
}
//DOWN按键
if(GUA_Keys & GUA_KEY_DOWN_VALUE)
{
//LED2亮
GUA_Led_Set(GUA_LED_NO_2, GUA_LED_MODE_ON);
//蜂鸣器响
GUA_Beep_Set(GUA_BEEP_MODE_ON);
//启动定时器
Util_startClock(&GUA_periodicClock);
}
//LEFT按键
if(GUA_Keys & GUA_KEY_LEFT_VALUE)
{
//LED3亮
GUA_Led_Set(GUA_LED_NO_3, GUA_LED_MODE_ON);
//蜂鸣器响
GUA_Beep_Set(GUA_BEEP_MODE_ON);
//启动定时器
Util_startClock(&GUA_periodicClock);
}
//RIGHT按键
if(GUA_Keys & GUA_KEY_RIGHT_VALUE)
{
//LED4亮
GUA_Led_Set(GUA_LED_NO_4, GUA_LED_MODE_ON);
//蜂鸣器响
GUA_Beep_Set(GUA_BEEP_MODE_ON);
//启动定时器
Util_startClock(&GUA_periodicClock);
}
//SELECT按键
if(GUA_Keys & GUA_KEY_SELECT_VALUE)
{
//LED全亮
GUA_Led_Set(GUA_LED_NO_ALL, GUA_LED_MODE_ON);
//蜂鸣器响
GUA_Beep_Set(GUA_BEEP_MODE_ON);
//启动定时器
Util_startClock(&GUA_periodicClock);
}
}
//GUA
//GUA
//**********************************************************************
//name: GUA_performPeriodicTask
//introduce: 香瓜周期事件的处理函数
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: [email protected]
//QQ group: 香瓜BLE之CC2640R2F(557278427)
//shop:
//https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
//changetime: 2017.10.17
//**********************************************************************
static void GUA_performPeriodicTask(void)
{
//LED全灭
GUA_Led_Set(GUA_LED_NO_ALL, GUA_LED_MODE_OFF);
//蜂鸣器停止
GUA_Beep_Set(GUA_BEEP_MODE_OFF);
}
//GUA
暂无
九、实验结果
仿真并全速运行,可以发现每个按键按下都会让蜂鸣器短暂响一下。
因此,控制蜂鸣器成功。