NRF5 SDK蓝牙开发——NRF_LOG_INFO(...)通过串口输出的实现

本文介绍如何在NRF5SDK蓝牙开发环境中配置并实现通过串口输出日志信息。主要内容包括:使能NRF_LOG_BACKEND_UART_ENABLED宏定义、设置串口引脚与波特率等参数、添加必要的源文件、调整调试输出等级以及避免串口重复初始化等问题。

NRF5 SDK蓝牙开发——NRF_LOG_INFO(…)通过串口输出的实现

  • 开发环境

    1. iar for arm开发平台
    2. nrf52832开发板,使用P06引脚作为串口TX口
    3. 应用程序:nRF5_SDK_15.0.0_a53641a(examples/ble_central/ble_app_uart_c)
    4. 协议栈: s132_nrf52_6.0.0_softdevice.hex

    由于直接编译sdk会出现Pa050相关错误,在iar选项配置中屏蔽该编译错误即可。
    这里写图片描述
    一。打开”sdk_config.h”文件,使能及禁能相关功能

关闭宏NRF_LOG_BACKEND_RTT_ENABLED如下,

#ifndef NRF_LOG_BACKEND_RTT_ENABLED
#define NRF_LOG_BACKEND_RTT_ENABLED 0
#endif

添加如下宏定义到”sdk_config.h”文件合适位置,

// <e> NRF_LOG_BACKEND_UART_ENABLED - nrf_log_backend_uart - Log UART backend
//==========================================================
#ifndef NRF_LOG_BACKEND_UART_ENABLED
#define NRF_LOG_BACKEND_UART_ENABLED 1
#endif
// <o> NRF_LOG_BACKEND_UART_TX_PIN - UART TX pin 
#ifndef NRF_LOG_BACKEND_UART_TX_PIN
#define NRF_LOG_BACKEND_UART_TX_PIN 6
#endif

// <o> NRF_LOG_BACKEND_UART_BAUDRATE  - Default Baudrate

// <323584=> 1200 baud 
// <643072=> 2400 baud 
// <1290240=> 4800 baud 
// <2576384=> 9600 baud 
// <3862528=> 14400 baud 
// <5152768=> 19200 baud 
// <7716864=> 28800 baud 
// <10289152=> 38400 baud 
// <15400960=> 57600 baud 
// <20615168=> 76800 baud 
// <30801920=> 115200 baud 
// <61865984=> 230400 baud 
// <67108864=> 250000 baud 
// <121634816=> 460800 baud 
// <251658240=> 921600 baud 
// <268435456=> 1000000 baud 

#ifndef NRF_LOG_BACKEND_UART_BAUDRATE
#define NRF_LOG_BACKEND_UART_BAUDRATE 30801920
#endif

// <o> NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE - Size of buffer for partially processed strings. 
// <i> Size of the buffer is a trade-off between RAM usage and processing.
// <i> if buffer is smaller then strings will often be fragmented.
// <i> It is recommended to use size which will fit typical log and only the
// <i> longer one will be fragmented.

#ifndef NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE
#define NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE 64
#endif

二。工程中,添加nrf_log_backend_uart.c文件,路径为
components\libraries\experimental_log\src\nrf_log_backend_uart.c

三。在main函数中,注释掉uart_init()函数
不注释该函数,会出现串口初始化两次的情况,第一次在log_init()函数,第二次在uart_init()函数。
在第二次串口初始化时,会因为没有先释放串口,直接初始化,导致出错。
另外,sdk_config.h中更改调试输出等级。设置为4。

// <0=> Off 
// <1=> Error 
// <2=> Warning 
// <3=> Info 
// <4=> Debug 

#ifndef NRF_LOG_DEFAULT_LEVEL
#define NRF_LOG_DEFAULT_LEVEL  4
<think>我们之前提到过使用nrfjprog烧录,但用户现在只有串口,无法直接使用J-Link工具(nrfjprog依赖J-Link)。因此需要采用串口烧录方案。 串口烧录通常使用nRF52的DFU(Device Firmware Update)功能,通过引导程序(bootloader)实现。但默认情况下,nRF52832芯片内部没有预置bootloader,所以需要先通过其他方式(如J-Link)烧录一次bootloader,之后才能通过串口更新固件。 然而,用户当前只有串口,且可能没有预先烧录bootloader。因此我们需要考虑以下两种方案: 方案1:使用nRF Util工具通过串口进行DFU(需要事先烧录了SDK中的串口引导程序) 方案2:通过nRF52832串口自举功能(UART recovery mode)进行烧录(无需专门的bootloader,但需要进入特定模式) 由于用户没有J-Link,我们假设芯片尚未烧录任何bootloader,因此方案1可能不适用。我们重点介绍方案2:利用串口自举模式。 ### 串口自举模式烧录步骤(无需bootloader) 1. **进入自举模式**: - 将芯片的`RESET`引脚拉低 - 将芯片的`BOOT`引脚(即`DFU`引脚)拉高(具体引脚号需查看硬件设计,通常为P0.18或P0.20) - 释放`RESET`引脚,芯片进入自举模式 2. **使用nrfutil工具生成烧录包**: - 由于自举模式要求特定的文件格式,需要将.bin文件转换为.hex格式,并合并引导程序(但自举模式不需要外部bootloader,而是使用内置ROM中的bootloader) - 实际上,nRF52的自举模式支持通过串口接收nRF Util生成的特定协议包。 3. **操作流程**: a. 安装nrfutil: ```bash pip install nrfutil ``` b. 生成自举模式所需的烧录包(.zip格式): ```bash nrfutil pkg generate --hw-version 52 --sd-req 0x0 --application gap.bin --application-version 1 gap_dfu.zip ``` 参数说明: - `--hw-version 52`:对应nRF52系列 - `--sd-req 0x0`:表示不需要SoftDevice(因为我们的示例固件没有使用SoftDevice) - `--application gap.bin`:指定要烧录的bin文件 c. 通过串口发送: ```bash nrfutil dfu serial -pkg gap_dfu.zip -p /dev/ttyUSB0 -b 115200 ``` 注意:`/dev/ttyUSB0`替换为实际的串口设备名(Windows下可能是COMx),波特率通常为115200。 4. **退出自举模式**: - 烧录完成后,芯片会自动复位运行新固件。下次如需再次烧录,需重新进入自举模式。 ### 注意事项 - 串口自举模式需要连接串口的TX、RX、RTS、CTS四根线(如果硬件支持流控,否则可能需要调整参数)。 - 如果硬件设计时没有引出BOOT引脚,则无法使用此方法(必须依赖已烧录的bootloader)。 ### 替代方案:使用OpenOCD和串口(不推荐,因为通常OpenOCD需要JTAG/SWD接口) 由于用户只有串口,无法使用OpenOCD烧录。 ### 总结 在只有串口且没有预先烧录bootloader的情况下,唯一的解决方案是使用串口自举模式(UART recovery mode),前提是硬件必须支持(有BOOT引脚引出)。 如果硬件上没有预留BOOT引脚,则无法通过串口直接烧录,必须使用J-Link或其他调试器进行初次烧录(例如烧录一个支持串口DFU的bootloader)。 §§相关问题§§ 1. 如何确定nRF52832硬件上的BOOT引脚是哪个? 2. 使用nrfutil生成dfu包时出现“Unsupported SoftDevice”错误怎么办? 3. 串口自举模式下支持的最高波特率是多少? 4. 没有引出BOOT引脚的nRF52832设备如何通过串口烧录程序? 5. 如何验证串口烧录后的固件是否正常运行? </think>### 通过串口烧录 nRF52832 固件指南(无需 J-Link) #### 串口烧录前提条件 1. **硬件连接**: - USB转串口模块(如 FTDI、CH340)连接到开发板 - 接线方式: ``` TXD → nRF52832 RXD (P0.06) RXD → nRF52832 TXD (P0.05) GND → 共地 ``` - 开发板供电:USB 或 3.7V 锂电池 2. **软件工具**: - [nRF Connect Serial Terminal](https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-desktop) - [nrfutil](https://github.com/NordicSemiconductor/pc-nrfutil)(核心工具) #### 完整烧录步骤(使用串口 DFU) 1. **安装必需工具**: ```bash pip install nrfutil ``` 2. **生成 DFU 升级包**: ```bash nrfutil pkg generate --hw-version 52 --sd-req 0x00 \ --application gap.bin --application-version 1 \ gap_dfu.zip ``` - `--hw-version 52`:指定 nRF52832 - `--sd-req 0x00`:不使用 SoftDevice(基础固件) 3. **进入 DFU 模式**: - **硬件方式**: - 按住开发板上的 DFU 按钮(通常标记为 BOOT) - 按下 RESET 按钮并保持 DFU 按钮不放 - 释放 RESET 按钮,继续按住 DFU 按钮 1 秒后松开 4. **执行串口烧录**: ```bash nrfutil dfu serial -pkg gap_dfu.zip -p COM3 -b 115200 ``` - 将 `COM3` 替换为实际串口号(Linux 为 `/dev/ttyUSB0`) - 波特率推荐 115200 #### 烧录过程示例输出 ```log [INFO] Opened serial port: COM3 [INFO] Starting DFU upgrade... [INFO] Transmitting DFU package... [####################################] 100% [INFO] Device programmed successfully. [INFO] Device reset after firmware update. ``` #### 验证烧录结果 1. **使用 nRF Connect App**: - 手机扫描蓝牙设备 - 应出现 "GAP_ADV" 广播名 2. **串口日志验证**: ```bash screen COM3 115200 # Linux/Mac # 或使用 Putty(Windows) ``` - 成功启动会输出:`BTstack up and running...` #### 注意事项 1. **首次烧录要求**: - 如果芯片**从未烧录过引导程序**,需先通过 SWD 接口烧录一次 [串口引导程序](https://github.com/NordicSemiconductor/nRF5-bootloader) 2. **波特率问题**: - 如遇超时错误,尝试降低波特率: ```bash nrfutil dfu serial -pkg gap_dfu.zip -p COM3 -b 9600 ``` 3. **引脚冲突处理**: - 如果 DFU 按钮未引出,可短接: ``` nRF52832 引脚: P0.18 (RESET) → GND P0.20 (DFU) → VDD ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wayne2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值