W801蓝牙点亮小灯

一、项目概述

最近因为各种原因需要学习单片机,遂入手了一块联盛德的W801芯片,拿着做点儿小项目。

官网 有入门学习所需要的全部资料,一个非常庞大的资料包,可以挑着看。

此外,也在CSDN上面找了点儿资料,发现内容良莠不齐,有的过于简洁不适合入门,有的甚至编译都无法通过,就想着能不能把这些资料都综合起来,写一个系统且完整点儿的入门手册。

众所周知,入门任何一块儿单片机的第一步都是点灯,介于W801是一块儿物联网芯片,我们在此基础上更近一步,选择用蓝牙点灯。

二、开发环境配置

编译软件CDK

CDK用来编译程序,下载入口 放在这里,直接下到D盘就好,注意不要有中文路径。
W801开发环境搭建,也可以来这里面下载

SDK下载

SDK就是官方提供的demo,包含有芯片的基本例程,可以直接编译,以及在此基础上进行修改。W800和W801可以使用同一套SDK,直接去官网下载最新的W800的SDK就好。
在这里插入图片描述

烧写软件下载

官网开发工具选项中选择下载W800串口烧录工具,并解压到任意路径。
在这里插入图片描述

三、首次编译与烧写

路径
在这里插入图片描述
双击后缀名为.cdkws的文件
在这里插入图片描述
打开后差不多是这样子的
在这里插入图片描述
右键工程文件,然后build

烧写文件在bin\w800路径下面,后缀为.fls
在这里插入图片描述
打开烧写工具后,选择串口波特率并打开,选择固件,后点击下载即可完成烧录

四、程序设计

  1. 打开wm_demo.h文件,做出如下修改 在这里插入图片描述

在这里插入图片描述

  1. 打开main.c文件,做出如下修改
void UserMain(void)
{
	My_task();
}
  1. 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);
}
  1. 修改蓝牙数据接受程序
    打开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,灯灭
  • 不出意外的话,你将看到这种状况的板子
    在这里插入图片描述

六、参考

参考文章

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值