您尚未登录。

楼主 # 2021-08-08 16:47:23

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

nrf52系列开发日志

作为全球蓝牙份额占比最大的nordic公司,其nrf52系列非常经典,广泛用于物联网、可穿戴设备。而且其协议栈紧跟蓝牙标准,怀疑nordic中有人参与标准的制定。开发环境非常亲民,keil、gcc、ses(SEGGER公司开发)等,开贴记录一下填一下坑。


1.keil环境下,直接用pack installer把对应的包在线安装即可
2.从nrf官方下载sdk
3.点灯
4.ble点灯

官方sdk中有examples,其中大多数例子是基于nrf52840或nrf52832的。由于我买的是nrf52811模块,所以例子需要做一些修改。
例子中的pca10056是nrf52840,pca10056e对应的是nrf52811(是官方从pca10056复制并修改了一些配置)。


点灯程序很顺利,按照自己的板子修改一下io即可。
ble点灯就不是很顺利了,遇到的问题是日志无法打印,无法发现蓝牙设备,开始以为是协议栈烧录有问题,反复折腾还是不行。后来拆开模块屏蔽罩发现没有32.768k的晶振,而协议栈工作是需要低速时钟的,由于官方例子默认是外部晶振,所以修改配置后解决问题。至此,蓝牙可以完美工作。

内部rc修改步骤:
其中source是时钟源,rc_ctiv是校准定时器间隔,rc_temp_ctiv是恒温下的软装置校准计时器间隔,accuracy是外部时钟的精度。

与四个结构体成员相关的宏定义在sdk_config.h文件下,修改相关的宏就可以设置低频时钟的来源。

1).source的宏:NRF_SDH_CLOCK_LF_SRC,置0选择NRF_CLOCK_LF_SRC_RC----内部RC振荡,置1选择NRF_CLOCK_LF_SRC_XTAL ----外部晶振。
2).rc_ctiv的宏:NRF_SDH_CLOCK_LF_RC_CTIV,选择内部RC时值为16,选择外部晶体时值为0.
3).rc_temp_ctiv:NRF_SDH_CLOCK_LF_RC_TEMP_CTIV,选择内部RC时值为2,选择外部晶体时值为0.
4).accuracy:NRF_SDH_CLOCK_LF_ACCURACY,内部RC时置选择NRF_CLOCK_LF_ACCURACY_500_PPM,选择外部晶体时根据实际参考精度设置。

ble点灯视频:

最近编辑记录 kekemuyu (2021-08-08 16:48:09)

离线

楼主 #1 2021-08-09 12:24:05

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

Re: nrf52系列开发日志

功耗测试,看到nrf52811的手册功耗参数有点吓人,1mhz运行功耗是34.4 µA,经过实测基本符合手册,官方的点灯程序修改一下测得是2.69ma,然后除以64mhz,平均功耗是42ua,可能需要优化才能达到官方数据吧,不管了,42ua的运行功耗也是很优秀了。

#include <stdbool.h>
#include <stdint.h>
#include "nrf_delay.h"
#include "boards.h"

/**
 * @brief Function for application main entry.
 */
int main(void)
{
    /* Configure board. */
    //bsp_board_init(BSP_INIT_LEDS);

    /* Toggle LEDs. */
    while (true)
    {
//        for (int i = 0; i < LEDS_NUMBER; i++)
//        {
//            bsp_board_led_invert(i);
//            nrf_delay_ms(500);
//        }
    }
}

离线

楼主 #2 2021-08-09 13:12:12

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

Re: nrf52系列开发日志

ble点灯程序功耗实测,官方的例程中有四个led和四个按键,需要把不需要的按键注释掉,只保留一个led,如下:

int main(void)
{
    // Initialize.
    log_init();
		NRF_LOG_INFO("Blinky example started.");
    leds_init();
    timers_init();
    //buttons_init();
    power_management_init();
    ble_stack_init();
    gap_params_init();
    gatt_init();
    services_init();
    advertising_init();
    conn_params_init();

    // Start execution.
    NRF_LOG_INFO("Blinky example started.");
    advertising_start();

    // Enter main loop.
    for (;;)
    {
        idle_state_handle();
    }
}

sdk_config.h中开启dcdc使能,由于模块没有外接32k晶振,使能内部rc(内部rc要比外部晶振功耗增加几个ua)。
重点优化功耗的几个参数:
  广播间隔越大, 功耗越低;
广播持续时间越长,功耗越大

蓝牙BLE设备联结后,蓝牙主机会向BLE设备发送连接事件(Connection Events),BLE设备接收到连接事件后,会进行回复,以通知蓝牙主机连接通路正常。而这是BLE设备连接后最耗电的工况,所以增加连接间隔时间会降低BLE设备的功耗,但是需要注意的是,改变连接间隔时间就相应地会改变蓝牙的通讯速度。
从机延时(Slave Latency)次数,就是在连接时忽略连接事件的次数。
                             

#define APP_ADV_INTERVAL                640                                      /**< The advertising interval (in units of 0.625 ms; this value corresponds to 40 ms). */
#define APP_ADV_DURATION                BLE_GAP_ADV_TIMEOUT_LIMITED_MAX//BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED   /**< The advertising time-out (in units of seconds). When set to 0, we will never time out. */


#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(1000, UNIT_1_25_MS)        /**< Minimum acceptable connection interval (0.5 seconds). */
#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(2000, UNIT_1_25_MS)        /**< Maximum acceptable connection interval (1 second). */
#define SLAVE_LATENCY                   0                                       /**< Slave latency. */
#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(6000, UNIT_10_MS)         /**< Connection supervisory time-out (4 seconds). */

这些参数需要综合考虑,因为参数之间是有关联的,设置不当反而会适得其反,以上设置的参数可能并不是最优的甚至是错误的,需要学习这些参数的具体原理。以下是官方给出的功耗优化建议:
https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/optimizing-power-on-nrf52-designs

由于测试条件有限,万用表并不适合测量这么低功耗的射频芯片。功率分析仪可能会好些,大概用万用表测了一下,广播电流在15ua左右(有跳动但是太快测不出,官方有个理论评估在线工具:
https://devzone.nordicsemi.com/nordic/power/w/opp/2/online-power-profiler-for-ble
简单评估了一下广播功耗大概23ua:
Screenshot130834.png

最近编辑记录 kekemuyu (2021-08-09 13:15:38)

离线

楼主 #3 2021-08-11 17:27:53

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

Re: nrf52系列开发日志

nrf蓝牙芯片有个很有意思的外设ppi,可编程外设互联。进一步了解得知nrf系列的外设的寄存器很不一样,nRF52832 的寄存器分为下面的三种类型。

Task :任务寄存器,可以由程序或事件触发。
Event:事件寄存器,事件可以产生中断或触发任务。
Register:普通寄存器,和一般单片机的寄存器一样。

Task 和 event 使得操作片上外设十分方便简洁,只需进行少量的配置,即可轻松运用各种外设。同时,Task 和 event 能有效减少 CPU 的占用时间,降低 CPU 的负荷。

Task 和 Event 更多的是用来和 PPI(可编程外设互连)配合使用,通过 PPI 将某个 Event和 Task 连接起来,连接后,该 Event 即可触发对应的 Task 执行相应的功能。

不知道其他蓝牙芯外设是否有同样设计,这是第一次发现这样有趣的设计,应该是为低功耗而生的设计。最近发现很多mcu芯片开始集成一些fpga类似的功能,比如rp2040的可编程io,这次的ppi也有异曲同工之妙。估计以后的芯片设计方向都会加入类此的外设。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn