2 u012537916 u012537916 于 2016.04.05 14:24 提问

通过CC2540作为从机,通过手机发送数据‘a’实现从机播放“收到”声音。

现在是的问题是通过设置定时器1来完成,
但是具体的声音“收到”的频率是怎么装载到定时器里面的,产生要的PWM波形。
我的程序只能改变占空比,只是发出声音的高低,还有就是网上都是音乐的频率,没有说话的
有没有取模软件把说话的声音频率算出来??求大神指导,
#include
#include "bcomdef.h"
#include "OSAL.h"
#include "pwm.h"

//pwm pins:
//P0.0
//P0.1

uint16 gRed;
uint16 gGreen;
uint16 gBlue;

void PWM_init()
{
//设置pwm端口为输出
P1DIR|= BV(0)|BV(1);
//设置pwm端口为外设端口,非gpio
P1SEL|= BV(0)|BV(1);
//由于uart等会占用我们当前使用的pwm端口,因此需要将uart等重映射到别的端口去。
PERCFG |= 0x40; // Move USART1&2 to alternate2 location so that T1 is visible

// Initialize Timer 1
T1CTL = 0x0C; // Div = 128, CLR, MODE = Suspended

T1CCTL1 = 0x0C; // IM = 0; CMP = Clear output on compare; Mode = Compare
T1CCTL2 = 0x0C; // IM = 0; CMP = Clear output on compare; Mode = Compare
T1CCTL3 = 0x0C; // IM = 0, CMP = Clear output on compare; Mode = Compare
T1CNTL = 0; // Reset timer to 0;

T1CCTL0 = 0x4C;

T1CC0H = 0x01;

T1CC0L = 0x77;

T1CC1H = 0x01;

T1CC1L = 0x77;
T1CC2H = 0x01;

T1CC2L = 0x77;
T1CC3H = 0x01;

T1CC3L = 0x77;

EA=1;
IEN1 |= 0x02; // Enable T1 cpu interrupt
}

void pwmPulse(uint16 red, uint16 green, uint16 blue)
{
uint16 r,g,b;
// stop,注意,不能加这句,加了周期偏差十几倍,具体原因未查明
//T1CTL &= BV(0)|BV(1);
#if 0
r=375;
g=1;
b=1;
#else
r=red;
g=green;
b=blue;
#endif
// Set up the timer registers

T1CC1L = (uint8)r;
T1CC1H = (uint8)(r >> 8);
T1CC2L = (uint8)g;
T1CC2H = (uint8)(g >> 8);
T1CC3L = (uint8)b;
T1CC3H = (uint8)(b >> 8);

// Reset timer
T1CNTL = 0;

// Start timer in modulo mode.
T1CTL |= 0x02;

}

void setRGB(uint16 red, uint16 green, uint16 blue)
{
gRed=red;
gGreen=green;
gBlue=blue;
}

//#pragma register_bank=2
#pragma vector = T1_VECTOR
__interrupt void pwmISR (void) {
uint8 flags = T1STAT;
// T1 ch 0
if (flags & 0x01){

pwmPulse(gRed,gGreen,gBlue);

}
T1STAT = ~ flags;

}

if ( events & SBP_START_DEVICE_EVT )
{
static uint8 count=1;
static uint8 updown=1;

if(updown)
  count++;
else
  count--;
if(count==200)
  updown=0;
if(count==1)
  updown=1;
//设置占空比
setRGB(count,count,count);

osal_start_timerEx( SimpleOsal_TaskID, SBP_START_DEVICE_EVT, 5 );
return ( events ^ SBP_START_DEVICE_EVT );

}
// Discard unknown events
return 0;

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于TI CC2540 BLE协议栈中数据传输的几个函数实现(草稿)
在BLE协议栈站,关于数据传输可以范围下面两个方面,一是主机(Central)向从机(Peripheral)发送数据,二是从机(Peripheral)向主机(Central)发送数据。 1、主机(Central)向从机(Peripheral)发送数据 发送调用的是GATT_WriteCharValue 函数实现,该函数具体实现的是 打开发射机、调整发送功率等,最后将数据通过天线发射出去
<BLE>CC2540主机获取各个从机广播
在蓝牙BLEcc2540的程序有一个函数用于记录周围正在发广播的蓝牙的地址,并且生成地址列表,以供后面的选择连接。我们可以对比着这个函数来写一个接受周围蓝牙从机发出的广播,并且生成相应的广播数据列表。 我先来看看广播的地址在何处被接收到: 在回调函数simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )中,调用接收广播地址的函数
CC2541 设备发送数据给手机
CC2541 与手机连接后,手机有两种方法获得设备的数据: 1. 设备用 Indicate 或 Notify 方式主动发送属于给手机,这里要调用 Indicate 或 Notify 程序发送数据 2. 手机主动要求设备发送数据,调用 bloodPressure_ReadAttrCB 函数,此时不需要调用 Indicate 或 Notify 程序,只需要调用 osal_memcpy 就可以了
<蓝牙BLE>cc2540从机连接时的动态广播
转自大香瓜的博客 一、简介 本篇以SimpleBLEPeripheral工程为例,介绍实现连接时广播的方法。 二、实验平台 协议栈版本:BLE-CC254x-1.4.0 编译软件:IAR 8.20.2 硬件平台:Smart RF开发板 三、连接时广播有什么用? 答:自己想了两个理论上可行的功能,能不能实现还是要实践才知道,欢迎
TI cc2540 主从机配对、绑定、密码
主从机分别为两个CC2540
cc2541从机向主机传大数据
可以连续发上传通知(指示不行,指示需要回应)
网络数据包从主机A传输到主机B的流程
主机A需要发送一个数据包到主机B,在整个传输流程中,源和目的IP地址是保持不变的(不考虑NAT),源和目的MAC地址是随着具体链路的变化而变化。这里只考虑三种基本情形:A和B通过网线直连,A和B通过路由器连接,A和B通过交换机连接。真实网络中A和B的连接关系可能很复杂,但无非就是这三种基本情形的组合。传输流程如下: 主机A在本机的路由表中查询匹配主机B的IP的网络号; 如果能够查询到,说明主机B和
蓝牙主机和从机之间传输数据说明
转自:http://blog.sina.com.cn/s/blog_869234dc0102uxl3.html 在第一部分我们了解了几个专业词汇,接下来我们再了解一下数据的发送 一、数据发送 在BLE协议栈中进行数据发送分为两个方面,一个事GATT的client主动向service发送数据,另一个是GATT的service主动向client发送数据 我们暂且简单的分为主机向从机发送
BLE手机做从机nrf51822做主机通信实验
压缩包含有BLE手机作为从机,nrf51822做主机通信实验的文档,内附实验代码(基于SDK10.0)
【cc2541历程】按键发送键值到APP端
一、简介 本文在工程SimpleBLEPeripheral的基础上,实现按键发送相应的键值到手机APP端. 二、开发平台 编译环境:IAR820.02 协议栈:BLE-CC254x-1.4.0 程序编辑器:Source Insight 3.5 APP:Smart 硬件平台:SmartRF开发板 三、编写声明