文章目录
问题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;
内存分区大致如下:
- 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”,打开编程算法窗口。(备注:使用默认配置无需修改)
- 编译工程,编译成功后点击下载应用程序到开发板。
- 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协议栈相关的是S112
、S132
,ANT协议栈相关的是S212
、S312
。具体如下:
S112
和S132
都支持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
-
默认打印方式有2种:
- 串口打印的方式,即printf()的方式
- JLink的RTT Log打印方式
-
如果选择JLink的RTT Log打印方式,需要在工程添加SEGGER相关的文件:
-
sdk_config.h文件中配置:
NRF_LOG_BACKEND_RTT_ENABLED
设置为1NRF_LOG_BACKEND_UART_ENABLED
设置为0(没有就无需设置)
-
打开JLinkRTTViewer.exe