【Nordic】使用nRF52810常见问题

问题1:Nordic调用蓝牙协议栈Crash问题

问题描述:在初始化ble_stack_init()后,程序会被卡死无法正常运行。经过多次验证,定位Crash位置如下:

ret_code_t nrf_sdh_enable_request(void)
{
    
    
	......
    nrf_clock_lf_cfg_t const clock_lf_cfg =
    {
    
    
        .source       = NRF_SDH_CLOCK_LF_SRC,
        .rc_ctiv      = NRF_SDH_CLOCK_LF_RC_CTIV,
        .rc_temp_ctiv = NRF_SDH_CLOCK_LF_RC_TEMP_CTIV,
        .accuracy     = NRF_SDH_CLOCK_LF_ACCURACY
    };

    CRITICAL_REGION_ENTER();
#ifdef ANT_LICENSE_KEY
    ret_code = sd_softdevice_enable(&clock_lf_cfg, app_error_fault_handler, ANT_LICENSE_KEY);
#else
    ret_code = sd_softdevice_enable(&clock_lf_cfg, app_error_fault_handler); // 程序每次运行到这里被卡死
#endif
	......
}

解决办法:
需要配置LFCLK时钟源为内部时钟NRF_SDH_CLOCK_LF_SRC = NRF_CLOCK_LF_SRC_RC,定时时钟校准间隔NRF_SDH_CLOCK_LF_RC_CTIV设置为16

备注:为什么需要这么设置,参考后面的的问题分析。

  • 方法1:
    在这里插入图片描述
  • 方法2:
    在这里插入图片描述
    问题分析:
    出现调用蓝牙协议后,就会卡死主要是因为Clock配置错误导致,软件配置与实际硬件未匹配。Clock control的相关配置,我们可以参考官方文档《nRF52810_PS_v1.3.pdf》。nRF52系列的Clock control图如下:

在这里插入图片描述
由上图我们可以知道,Clock control主要是分为2个部分:HFCLK(high frequency clock) 和 LFCLK(low frequency clock)。一般出现问题都是LFCLK的32.768kHz出现问题,为了降低成本32.768kHz外部晶振都会被省掉,使用内部晶振。LFCLK有3种源可以选择:

  • 32.768 kHz RC oscillator (LFRC) //使用内部晶体LFRC产生32.768kHz LFCLK时钟
  • 32.768 kHz crystal oscillator (LFXO) //使用外部晶体LFXO产生32.768kHz LFCLK时钟
  • 32.768 kHz synthesized from HFCLK (LFSYNT ) //使用内部HFCLK 分频产生32.768kHz LFCLK时钟
时钟源 优缺点 备注
LFRC 优点:低成本
缺点:精度低,易受温度影响
由于容易受到外部环境影响,并且精度低,所以需要定时校准。
校准是通过定时打开HCLK来校准LFRC。
LFXO 优点:精度高,不容易收到干扰。
缺点:增加硬件成本
使用这种方式,时钟精度比较高,但是会增加硬件成本。
LFSYNT 优点:低成本,精度相对高。
缺点:增加功耗
使用这种方式,会导致HFCLK长时间被打开,导致功耗上升。

备注:根据实际硬件方案和需求来设置NRF_SDH_CLOCK_LF_SRC,就可以解决上面遇到的卡死问题。

问题2:如何使用MDK下载Application和SoftDevice的HEX文件

Nordic的nRF52系列平台一般分为2个部分:

  • Application:主要是我们编程所生成的应用程序Hex文件;
  • SoftDevice:这个Nordic官网提供的蓝牙协议栈Hex文件,编程时可以直接调用它的API;

内存分区大致如下:
在这里插入图片描述

  1. Application程序下载
    使用Nordic官方SDK的测试样例测试,路径如下:nRF5_SDK_17.0.2_d674dde\examples\ble_peripheral\ble_app_uart\pca10040e\s112\arm5_no_packs
    • 通过MDK打开ble_app_uart项目。
    • 打开MDK中的魔法棒,如下图:
      -
    • 在弹出的窗口中切换到“Utilities”选项卡,然后点击“Setting”,打开编程算法窗口。(备注:使用默认配置无需修改)
      -
    • 编译工程,编译成功后点击下载应用程序到开发板。
      在这里插入图片描述
  2. SoftDevice蓝牙协议栈程序下载
    使用Nordic官方SDK的测试样例测试,路径如下:nRF5_SDK_17.0.2_d674dde\examples\ble_peripheral\ble_app_uart\pca10040e\s112\arm5_no_packs
    • 通过MDK打开ble_app_uart项目。
    • 切换到下载协议栈的工程
      在这里插入图片描述
    • 打开MDK中的魔法棒,如下图:
      在这里插入图片描述
    • 在弹出的窗口中切换到“Utilities”选项卡,然后点击“Setting”,打开编程算法窗口。(备注:将nRF52xx修改为nRF52xx SoftDevice Erase)
      在这里插入图片描述
    • 点击下载按钮,即可下载协议栈。
      在这里插入图片描述

备注:一般烧录顺序为:

  • 擦除Flash分区 // MDK工具栏“Flash” --> “Erase”
  • 烧录SoftDevice蓝牙协议栈Hex文件
  • 烧录Application程序Hex文件

问题3:如何使用JFlash下载Application和SoftDevice的HEX文件

J-Flash是SEGGER(J-Link仿真器厂商)发布的一款单独的Flash烧录软件,支持HEX和BIN格式文件烧写到Flash。J-Flash烧写速度极快,远远快于Nordic提供的下载软件nRFgo Studio。我这里展示的是SEGGER J-Flash Lite,因为它比较小巧,操作简单和J-Flash相比。

1.打开J-Flash Lite软件工具
在这里插入图片描述
2.选择我们需要下载的Device,在Manufacturer下的输入框中输入nordic Semi,然后会展示所有的Nordic的相关的IC,并选择nRF52810。
在这里插入图片描述
3.选择Interface为SWD,并点击OK。
在这里插入图片描述
4.点击Erase Chip按钮,擦除整块芯片。
在这里插入图片描述
4.选择需要下载的Application和SoftDevice的HEX文件,然后点击Program Device按钮下载固件。
在这里插入图片描述

备注:因为下载的是Hex文件,里面包含下载的Flash地址信息,所以不用担心烧录2个Hex文件会把另外一个Hex文件数据冲掉。除非是编译Application生成的HEX地址和SoftDevice的HEX文件地址有重复。

问题4:nRF52810如何选择SoftDevice版本

《nRF52810 product brief.pdf》里面有介绍nRF52810兼容的SoftDevice版本,BT协议栈相关的是S112S132ANT协议栈相关的是S212S312。具体如下:
在这里插入图片描述
S112S132都支持Bluetooth 5 protocol stack,它们之间的差异如下:

Version Description
S112 支持Bluetooth 5.1单模式BLE协议栈:
• Peripheral x 4
• Broadcaster x 1
S132 支持Bluetooth 5.1单模式BLE协议栈:
• Central
• Observer
• Peripheral
• Broadcaster

备注:只是需要Peripheral模式,一般选择S112。如果需要支持Central模式或者Central & Peripheral模式,一般选择S132

问题5:如何使用Nordic NRF Log

  1. 默认打印方式有2种:

    • 串口打印的方式,即printf()的方式
    • JLink的RTT Log打印方式
  2. 如果选择JLink的RTT Log打印方式,需要在工程添加SEGGER相关的文件
    在这里插入图片描述

  3. sdk_config.h文件中配置:

    • NRF_LOG_BACKEND_RTT_ENABLED 设置为1
    • NRF_LOG_BACKEND_UART_ENABLED 设置为0(没有就无需设置)
  4. 打开JLinkRTTViewer.exe
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ZHONGCAI0901/article/details/110955946