一、项目概述
最近因为各种原因需要学习单片机,遂入手了一块联盛德的W801芯片,拿着做点儿小项目。
官网 有入门学习所需要的全部资料,一个非常庞大的资料包,可以挑着看。
此外,也在CSDN上面找了点儿资料,发现内容良莠不齐,有的过于简洁不适合入门,有的甚至编译都无法通过,就想着能不能把这些资料都综合起来,写一个系统且完整点儿的入门手册。
众所周知,入门任何一块儿单片机的第一步都是点灯,介于W801是一块儿物联网芯片,我们在此基础上更近一步,选择用蓝牙点灯。
二、开发环境配置
编译软件CDK
CDK用来编译程序,下载入口 放在这里,直接下到D盘就好,注意不要有中文路径。
W801开发环境搭建,也可以来这里面下载
SDK下载
SDK就是官方提供的demo,包含有芯片的基本例程,可以直接编译,以及在此基础上进行修改。W800和W801可以使用同一套SDK,直接去官网下载最新的W800的SDK就好。
烧写软件下载
官网开发工具选项中选择下载W800串口烧录工具,并解压到任意路径。
三、首次编译与烧写
路径
双击后缀名为.cdkws的文件
打开后差不多是这样子的
右键工程文件,然后build
烧写文件在bin\w800路径下面,后缀为.fls
打开烧写工具后,选择串口波特率并打开,选择固件,后点击下载即可完成烧录
四、程序设计
- 打开wm_demo.h文件,做出如下修改
- 打开main.c文件,做出如下修改
void UserMain(void)
{
My_task();
}
- My_task() 函数放在 wm_demo_console_task.c 文件里面
- 打开后,现在开头申明宏定义如下
#define MYBLE_TASK_SIZE 2048
static OS_STK MyBLETaskStk[MYBLE_TASK_SIZE];
#define MYBLE_TASK_PRIO 32
- 然后在末尾添加两个新函数
void my_ble_msg_task(void *sdata)
{
//传过来的消息队列指针,这里定义的是u8类型的
u8 *msg;
//蓝牙发送数据
u8 send_data[20] = {0x00};
//让开发板以server的身份运行起来
demo_bt_enable();
while(bt_adapter_state == WM_BT_STATE_OFF)
{
tls_os_time_delay(5000 /HZ);
}
tls_os_time_delay(5000 /HZ);
demo_ble_server_on();
printf("ble ready ok \r\n");
//初始化IO口
tls_gpio_cfg(WM_IO_PB_05, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(WM_IO_PB_25, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(WM_IO_PB_26, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
for(;;)
{
tls_os_queue_receive(ble_q,&msg, 0, 0);
//打印ble收到数据的长度
printf("ble revice len:%d\n",msg[0]);
//依次打印收到的ble数据
for(u8 i=0;i<msg[0];i++){
printf("%x ",msg[i+1]);
//收到的数据存到send_data buff
send_data[i] = msg[i+1];
}printf("\n");
if(msg[1] != 0)
tls_gpio_write(WM_IO_PB_05,1);
else
tls_gpio_write(WM_IO_PB_05,0);
if(msg[2] != 0)
tls_gpio_write(WM_IO_PB_25,1);
else
tls_gpio_write(WM_IO_PB_25,0);
if(msg[3] != 0)
tls_gpio_write(WM_IO_PB_26,1);
else
tls_gpio_write(WM_IO_PB_26,0);
//返回收到的数据
printf("send state:%d \r\n",tls_ble_server_demo_api_send_msg(send_data,3));
}
}
void My_task(void)
{
if(tls_os_queue_create(&ble_q, 32)!=TLS_OS_SUCCESS)
{
printf("create queue fail\n");
return;
}
tls_os_task_create(NULL, NULL,
my_ble_msg_task,
NULL,
(void *)MyBLETaskStk, /* task's stack start address */
MYBLE_TASK_SIZE * sizeof(u32), /* task's stack size, unit:byte */
MYBLE_TASK_PRIO,
0);
}
- 修改蓝牙数据接受程序
打开wm_ble_server_api_demo.c文件,对gatt_svr_chr_demo_access_func函数作如下修改
tls_os_queue_t *ble_q = NULL;
//重新定义一个数据uff
//ble_data[0] 表示数据的长度,往后依次为数据
u8 ble_data[255] = {0};
//add by zxx end
static int
gatt_svr_chr_demo_access_func(uint16_t conn_handle, uint16_t attr_handle,
struct ble_gatt_access_ctxt *ctxt, void *arg)
{
int i = 0;
struct os_mbuf *om = ctxt->om;
switch (ctxt->op) {
case BLE_GATT_ACCESS_OP_WRITE_CHR:
while(om) {
if(g_ble_uart_output_fptr)
{
g_ble_uart_output_fptr((uint8_t *)om->om_data, om->om_len);
}else
{
//print_bytes(om->om_data, om->om_len);
//add by zxx start
if(om->om_len > 200)
{
printf("ble om->om_len is too long:%d return 0 please check send data length...\r\n",om->om_len);
return 0;
}
ble_data[0] = om->om_len;
//将数据转存到buff中,ble_data[0]是数据的长度,长度必须小于255-1,否者下列循环会出问题。
for (u8 i = 0; i < om->om_len; i++) {
ble_data[i+1] = om->om_data[i];
}
if(om->om_len>0)
{
tls_os_queue_send(ble_q,ble_data, 0);
}
//add by zxx end
}
om = SLIST_NEXT(om, om_next);
}
return 0;
default:
assert(0);
return BLE_ATT_ERR_UNLIKELY;
}
}
PS:这套代码还是不要用官方最新的SDK了,编译都通不过
五,收发控制测试
参考官方提供的《W800_SDK DEMO运行指南v1.5》
- 手机端下载nRF Connect,应用商店没有的话,可以直接去浏览器下载。这款软件还是比较干净的,没有小广告,也不需要注册。
- 手机打开蓝牙,使用nRF connect 扫描到设备(名称默认为WM-XX:XX:XX,即模块 btmac 后六位)
- 连接设备
- APP查看service
- 点击向上的箭头,输入指令,然后点击send
- 输入0,灯亮;输入1,灯灭
- 不出意外的话,你将看到这种状况的板子