1 准备工作

本文采用SYD8811 Smart EVK 基础版开发板测量SYD8811芯片的功耗,按以下三个步骤做准备。

1.1 取出UART排针的两个跳线帽,即断开P0.15和P0.16和USB-TTL芯片的连接。

1.2 用烙铁断开JP1,即将SYD8811的VDD引脚和LDO芯片VR1(3.3V)断开。如果JP2是连接的,也要先断开。

1.3 测量电源(一般为3V或3.3V)分别板上【+3.3V】和【GND】排针,如果是用万用表测量,则按上图所示,将电流表(万用表)串接到3.3V电源线中。

2 测试程序设计

2.1 将广播超时设置为20秒

static void setup_adv_data()
{struct gap_adv_params adv_params;  struct gap_ble_addr dev_addr;adv_params.type = ADV_IND;adv_params.channel = 0x07;  // advertising channel : 37 & 38 & 39adv_params.interval = 1600; // advertising interval : 1000ms (1600 * 0.625ms)adv_params.timeout = 0x14;  // 广播超时timeout的值配置为20s         SetAdvParams(&adv_params);  /*get bluetooth address */GetDevAddr(&dev_addr);ADV_DATA[11] = dev_addr.addr[0];ADV_DATA[12] = dev_addr.addr[1];ADV_DATA[13] = dev_addr.addr[2];ADV_DATA[14] = dev_addr.addr[3];ADV_DATA[15] = dev_addr.addr[4];ADV_DATA[16] = dev_addr.addr[5];SCAN_DATA[4] = dev_addr.addr[0];SCAN_DATA[5] = dev_addr.addr[1];SCAN_DATA[6] = dev_addr.addr[2];SCAN_DATA[7] = dev_addr.addr[3];SCAN_DATA[8] = dev_addr.addr[4];SCAN_DATA[9] = dev_addr.addr[5];SetAdvData(ADV_DATA, sizeof(ADV_DATA), SCAN_DATA, sizeof(SCAN_DATA));*(uint8_t *)0x40020014 = 0x01;        //设置ADV_PITV为1,降低功耗
}

2.2 在广播结束中断事件GAP_EVT_ADV_END判断将原来的StartAdv()函数去掉,用射频睡眠标识代替,这样每次广播20秒后,芯片的射频都会自动进入休眠状态。

void ble_evt_callback(struct gap_ble_evt *p_evt)
{   if(p_evt->evt_code == GAP_EVT_ATT_WRITE){#ifdef _GPIO_LED_CONTROL_
//          GPIO_Pin_Toggle(U32BIT(GPIO_LED_WRITEING));#endifble_gatt_write(p_evt->evt.att_write_evt);}else if(p_evt->evt_code == GAP_EVT_ATT_READ){#ifdef _GPIO_LED_CONTROL_
//          GPIO_Pin_Toggle(U32BIT(GPIO_LED_READING));#endifble_gatt_read(p_evt->evt.att_read_evt);}else if(p_evt->evt_code == GAP_EVT_CONNECTED){connect_flag = 1;                                 //连接状态update_latency_mode=0;Timer_Evt_Start(EVT_2S);#ifdef _GPIO_LED_CONTROL_
//          GPIO_Pin_Toggle(U32BIT(GPIO_LED_CONNECT));#endifDBGHEXDUMP("Connected addr:",p_evt->evt.bond_dev_evt.addr,sizeof(p_evt->evt.bond_dev_evt.addr));}else if(p_evt->evt_code == GAP_EVT_DISCONNECTED){     DBGPRINTF("Disconnected,reson:0x%02x\r\n", p_evt->evt.disconn_evt.reason);start_tx = 0;connect_flag = 0;//clr uart rx fifouart_rx_buf.header = uart_rx_buf.tail;        Timer_Evt_Stop(EVT_1S_OTA);setup_adv_data();        //断开连接之后功耗大10uAStartAdv();  UartEn(false);  //不允许RF sleep时关闭XODBGPRINTF(("start adv @ disc!\r\n")); }else if(p_evt->evt_code == GAP_EVT_ATT_HANDLE_CONFIGURE){if(p_evt->evt.att_handle_config_evt.uuid == BLE_UART){if(p_evt->evt.att_handle_config_evt.value == BLE_GATT_NOTIFICATION){start_tx |= 0x01;UartEn(true);   //不允许RF sleep时关闭XO,休眠的时候因为32Mhz晶振还在,所以功耗很高uart_0_ClrFiFo();//clr uart rx fifouart_rx_buf.header = uart_rx_buf.tail;#ifdef _GPIO_LED_CONTROL_
//              GPIO_Set_Bits(U32BIT(GPIO_LED_NOTIFYEN));#endifDBGPRINTF(("UART notify Enabled!\r\n"));}else{start_tx &= ~0x01;UartEn(false);    //允许硬件自由控制32Mhz晶振,休眠的时候功耗很低#ifdef _GPIO_LED_CONTROL_
//              GPIO_Clear_Bits(U32BIT(GPIO_LED_NOTIFYEN));#endifDBGPRINTF(("UART notify Disabled!\r\n"));}}}else if(p_evt->evt_code == GAP_EVT_L2CAP_UPDATE_RSP){switch(p_evt->evt.l2cap_update_rsp_evt.result){case CONN_PARAMS_ACCEPTED:#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_) DBGPRINTF(("update rsp ACCEPTED\r\n"));{struct gap_link_params  link_app;GetLinkParameters(&link_app);#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)dbg_printf("interval:%x latency:%x\r\n",link_app.interval,link_app.latency);#endif}#endifbreak;case CONN_PARAMS_REJECTED:#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)DBGPRINTF(("update rsp REJECTED\r\n"));#endifbreak;case CONN_PARAM_SMART_TIMEROUT:#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)DBGPRINTF(("update rsp TIMEROUT\r\n"));#endifbreak;case CONN_PARAM_SMART_SUCCEED:#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)DBGPRINTF(("update rsp SUCCEED\r\n"));#endifbreak;case CONN_PARAM_LATENCY_ENABLE:#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)DBGPRINTF(("Enable latency\r\n"));#endifbreak;case CONN_PARAM_LATENCY_DISABLE:#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)DBGPRINTF(("Disable latency\r\n"));#endifbreak;}}else if(p_evt->evt_code == GAP_EVT_CONN_UPDATE_COMP){struct gap_link_params link;GetLinkParameters(&link);DBGPRINTF("CONN_UPDATE_COMP: %d, %d, %d\r\n", link.interval, link.latency, link.svto);}else if(p_evt->evt_code == GAP_EVT_ADV_END){//      StartAdv();                         dbg_printf("20s ADV timerout, RF sleep.\r\n");            RF_Status = false;RFSleep();}
}

我们使用EFM32 Energy Profiler测量芯片的功耗,该测量工具的测量范围0.1uA到 50mA。在开发板上电20秒内可以测量出SYD8811的一秒广播一次的功耗,下面是实测值,大概为22uA。

20秒后,芯片的射频进入休眠,而芯片也处于浅睡状态,此时的功耗约为7uA。

如果觉得广播时间过短可以配置adv_params.timeout 的值为想要的时间,或者广播结束中断事件里面重启广播。

2.3 按键唤醒射频
首先是初始化按键IO口。

void KEY_LED_Init(void)
{PIN_Set_GPIO(U32BIT(LED1) | U32BIT(LED2) | U32BIT(LED3) | U32BIT(LED4)| U32BIT(KEY1) | U32BIT(KEY2) | U32BIT(KEY3) | U32BIT(KEY4)/* | U32BIT(KEY5)*/ ,PIN_SEL_GPIO);GPIO_Set_Input(U32BIT(KEY1) | U32BIT(KEY2) | U32BIT(KEY3) | U32BIT(KEY4), U32BIT(KEY1) | U32BIT(KEY2) | U32BIT(KEY3) | U32BIT(KEY4));              //设置输入反相PIN_Pullup_Enable(T_QFN_48, U32BIT(KEY1) | U32BIT(KEY2) | U32BIT(KEY3) | U32BIT(KEY4));GPIO_Input_Enable( U32BIT(KEY1) | U32BIT(KEY2) | U32BIT(KEY3) | U32BIT(KEY4));   GPIO_Set_Output(U32BIT(LED1) | U32BIT(LED2) | U32BIT(LED3) | U32BIT(LED4));GPIO_Set_Bits(U32BIT(LED1) | U32BIT(LED2) | U32BIT(LED3) | U32BIT(LED4));}

接着配置按键KEY2为外部中断触发。

 io_irq_enable(U32BIT(KEY2), &GPIO_callback);

按键外部中断处理函数如下,即重新配置广播参数,开始广播。

void  GPIO_callback(void)
{uint32_t SW;SW=GPIO_IRQ_CTRL->GPIO_INT;    if(SW&U32BIT(KEY2)){if(RF_Status == false){RF_Status = true;     RFWakeup();DelayMS(100);            UartEn(true);ble_init();UartEn(false);DelayMS(100);StartAdv();      dbg_printf("ADV restart 20s.\r\n");           }}
}

当射频休眠后,按下开发板上的按键KEY2,即可重启广播。

为了方便测试,我将代码上传到这里。欢迎下载测试。

使用基础版SYD8811 Smart EVK测量SYD8811芯片功耗的说明相关推荐

  1. 【基础版】大学计算机-计算思维导论

    超星尔雅[基础版]大学计算机-计算思维导论章节测验答案,下面就是按照章节顺序的题目 计算机.计算与计算思维 1[单选题]人类应具备的三大思维能力是指_____.答案:实验思维.理论思维和计算思维 A. ...

  2. spring boot构建基础版web项目(一)springboot、thymeleaf控制层基础构

    原文作者:弥诺R 原文地址:http://www.minuor.com/147852147/article 转载声明:转载请注明原文地址,注意版权维护,谢谢! 写前说明 根据个人在各篇博文中看到的信息 ...

  3. Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版 没有什么不可能  之前一直用的是自 ...

  4. 47. 对数组进行冒泡排序,实现冒泡排序的基础版与优化版

    //冒泡排序: //优化版口诀:序而不排 -> 优化原理:证实已经有序,不需要再次循环 -> 代码角度实现优化:内重循环已证实有序,外重循环不需要再次循环可以停止了.建立flag标记告诉外 ...

  5. php vsftpd文件上传类,php ftp文件上传函数(基础版)

    php ftp文件上传函数(基础版) 复制代码 代码如下: // 定义变量 $local_file = 'local.zip'; $server_file = 'server.zip'; // 连接F ...

  6. python爬虫招聘-Python爬虫抓取智联招聘(基础版)

    原标题:Python爬虫抓取智联招聘(基础版) 作者:C与Python实战 「若你有原创文章想与大家分享,欢迎投稿.」 对于每个上班族来说,总要经历几次换工作,如何在网上挑到心仪的工作?如何提前为心仪 ...

  7. 淘宝旺铺基础版装修出专业版效果(不花钱也一样做到)

    旺铺基础版是左右两栏的布局,那我们就把左栏的模块全部删掉,在右栏建立自己的自定义模块,在自定义模块中加入以下代码,产生的效果就是通栏效果. <div class="J_TWidget& ...

  8. 什么是现代通用计算机的轴型,大学计算机基础(版)各章节习题+答案.doc

    大学计算机基础(版)各章节习题答案 第一章 计算机与信息社会基础知识 一.选择题 1._____________是现代通用计算机的雏形. A. 宾州大学于1946年2月研制成功的ENIAC B.查尔斯 ...

  9. 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)

    经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...

  10. FineUICore(基础版)v5.4.0已发布!

    FineUICore(基础版)已发布,请先加入知识星球,下载后可以永久免费商用: 转载于:https://www.cnblogs.com/sanshi/p/10469015.html

最新文章

  1. 通过httpmodule获取webapi返回的信息
  2. Reddit年度盘点:那些2019年最佳机器学习项目
  3. 安装Docker:解决container-selinux = 2.9问题
  4. [分享]MOSS的CSS样式说明,一个老外总结的
  5. android 是否允许打印debug级别日志的开关_log日志功能及设置方法
  6. 使用 LxRunOffine 迁移 WSL Ubuntu安装目录
  7. Debian Squeeze AMD64安装Oracle 10g x86_64 10.2.0....
  8. [转载]细说Java反射
  9. ajax html页面传值乱码,jQuery Ajax传值到Servlet出现乱码问题的解决方法
  10. 力扣326.3的幂 C/C++
  11. 圣诞海报设计没有思路,素材技巧都来了!
  12. 107 岁的 IBM 以 340 亿美元吞下了 25 岁的“小”红帽!
  13. ext2删除文件恢复笔记
  14. Python基础:什么是字符串?字符串是用来做什么的?
  15. 浅谈mysqli连接方式与PDO连接方式
  16. 电脑桌面上文件夹图标右上角有双箭头
  17. GB28181语音对讲/摄像头公网对讲指挥
  18. Go语言channel
  19. 微信公众号笔记(二)
  20. 全国智能网联与无人驾驶职教联盟筹建工作正式开启

热门文章

  1. Spark SQL操作JSON字段小Tips
  2. iOS转前端之仿写宠物网(适配不同尺寸)
  3. Shell脚本初学习
  4. 反向传播思想及其优缺点
  5. [C++]学生学籍管理系统
  6. 稠密检索模型的zero-shot能力究竟如何?
  7. 10个优秀的图标搜索引擎
  8. 【ELM预测】基于蝴蝶算法优化极限学习机预测附matlab代码
  9. jQuery双指放大缩小页面内容
  10. iOS-苹果官方开源网站;objc、Runloop、GCD、OC等开源代码