使用基础版SYD8811 Smart EVK测量SYD8811芯片功耗的说明
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[单选题]人类应具备的三大思维能力是指_____.答案:实验思维.理论思维和计算思维 A. ...
- spring boot构建基础版web项目(一)springboot、thymeleaf控制层基础构
原文作者:弥诺R 原文地址:http://www.minuor.com/147852147/article 转载声明:转载请注明原文地址,注意版权维护,谢谢! 写前说明 根据个人在各篇博文中看到的信息 ...
- Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版
2019独角兽企业重金招聘Python工程师标准>>> 摘要: Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版 没有什么不可能 之前一直用的是自 ...
- 47. 对数组进行冒泡排序,实现冒泡排序的基础版与优化版
//冒泡排序: //优化版口诀:序而不排 -> 优化原理:证实已经有序,不需要再次循环 -> 代码角度实现优化:内重循环已证实有序,外重循环不需要再次循环可以停止了.建立flag标记告诉外 ...
- php vsftpd文件上传类,php ftp文件上传函数(基础版)
php ftp文件上传函数(基础版) 复制代码 代码如下: // 定义变量 $local_file = 'local.zip'; $server_file = 'server.zip'; // 连接F ...
- python爬虫招聘-Python爬虫抓取智联招聘(基础版)
原标题:Python爬虫抓取智联招聘(基础版) 作者:C与Python实战 「若你有原创文章想与大家分享,欢迎投稿.」 对于每个上班族来说,总要经历几次换工作,如何在网上挑到心仪的工作?如何提前为心仪 ...
- 淘宝旺铺基础版装修出专业版效果(不花钱也一样做到)
旺铺基础版是左右两栏的布局,那我们就把左栏的模块全部删掉,在右栏建立自己的自定义模块,在自定义模块中加入以下代码,产生的效果就是通栏效果. <div class="J_TWidget& ...
- 什么是现代通用计算机的轴型,大学计算机基础(版)各章节习题+答案.doc
大学计算机基础(版)各章节习题答案 第一章 计算机与信息社会基础知识 一.选择题 1._____________是现代通用计算机的雏形. A. 宾州大学于1946年2月研制成功的ENIAC B.查尔斯 ...
- 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)
经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...
- FineUICore(基础版)v5.4.0已发布!
FineUICore(基础版)已发布,请先加入知识星球,下载后可以永久免费商用: 转载于:https://www.cnblogs.com/sanshi/p/10469015.html
最新文章
- 通过httpmodule获取webapi返回的信息
- Reddit年度盘点:那些2019年最佳机器学习项目
- 安装Docker:解决container-selinux = 2.9问题
- [分享]MOSS的CSS样式说明,一个老外总结的
- android 是否允许打印debug级别日志的开关_log日志功能及设置方法
- 使用 LxRunOffine 迁移 WSL Ubuntu安装目录
- Debian Squeeze AMD64安装Oracle 10g x86_64 10.2.0....
- [转载]细说Java反射
- ajax html页面传值乱码,jQuery Ajax传值到Servlet出现乱码问题的解决方法
- 力扣326.3的幂 C/C++
- 圣诞海报设计没有思路,素材技巧都来了!
- 107 岁的 IBM 以 340 亿美元吞下了 25 岁的“小”红帽!
- ext2删除文件恢复笔记
- Python基础:什么是字符串?字符串是用来做什么的?
- 浅谈mysqli连接方式与PDO连接方式
- 电脑桌面上文件夹图标右上角有双箭头
- GB28181语音对讲/摄像头公网对讲指挥
- Go语言channel
- 微信公众号笔记(二)
- 全国智能网联与无人驾驶职教联盟筹建工作正式开启