接触nrf52832芯片已经有一段时间了,记录我踩过的坑。这些坑大多都补回来了,愿后来的开发者没有坑~

先来点开胃小菜

一、环境问题

  • 安装离线包遇到的错误——svdconv exited with an error

原因可能是软件包含中文路径或者keil版本过低,修改安装路径或者升级一下keil。

  • Jlink下载提示No Cortex-M SW Device Found错误

最简单的就是在keil的调试设置里面选择Jlink,然后scan一下

不行就重插jlink再试一下。如果还是不行,不着急,还可以试试一下这个方法

打开jlink的RTT Viewer(或者在keil里面debug的Jlink选择cmd进入),然后选着默认使用的蓝牙芯片按下回车,之后去keil下载就没有这些错误。

  • Keil5调试警告——This target device does not support all the defined breakpos!Please reduce the number of breakpoints and start again.

原因设备断点太多,超过5个就会产生这个警告。清除所有断点,再选择自己想要设置断点的位置。

  • keil5闪退问题

可能的两个原因,Jlink的接触不良,拔了再接起来可能就没有了,最好的解决办法是买正版的Jlink,还可以把工程移动到其他文件夹也可能可以解决。

还有就是版本兼容性问题,可以试着把Keil注册表中的Recent Projects的全部内容清楚。

如果还不行,便把keil5程序改成兼容性win7。

再不行,打扰了

这些用到keil5的都有可能会遇到,不要慌都可以解决 来点主菜吧,大家也等久了~

二、程序问题

  • 【编译错误】 ".\_build\nrf52832_xxaa.axf: Error: L6218E: Undefined symbol app_uart_init (referred from main.o)."

版本驱动不兼容,添加就得版本驱动即可解决。旧版驱动:\modules\nrfx\drivers,新版驱动:\integration\nrfx\legacy.

  • 【编译错误】 "._build\rtc_tick.axf: Error: L6200E: Symbol SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler multiply defined (by nrf_drv_spi.o and nrf_drv_twi.o)."

TWI0和SPI0使用使用相同地址,把其中一个换到1(SPI1/TWI1)或者使用模拟IIC。

  • 【编译错误】 ”,. build\nrf5232 xxaa,.axf: Eror:16915E:Library zeports error: _use no sewihosting was requested, bnt asemihosting frutc was linked inNot enough information to list load addresses in the image map.“

我的解决办法是把printf改成NRF_LOG_INFO打印输出。网上的解决办法是Keil的设置里面勾选use MicroLIB。

  • RTT打印浮点数,NRF_LOG_INFO无法打印浮点数

1) 添加串口打印;

2) 添加浮点数打印函数——NRF_LOG_FLOAT.

/**
* @brief Macro to be used in a formatted string to a pass float number to the log.
*
* Use this macro in a formatted string instead of the %f specifier together with
* @ref NRF_LOG_FLOAT macro.
* Example: NRF_LOG_INFO("My float number" NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(f)))
*/
#define NRF_LOG_FLOAT_MARKER "%s%d.%02d" /**
* @brief Macro for dissecting a float number into two numbers (integer and residuum).
*/
#define NRF_LOG_FLOAT(val) (uint32_t)(((val) < 0 && (val) > -1.0) ? "-" : ""), \
(int32_t)(val), \
(int32_t)((((val) > 0) ? (val) - (int32_t)(val) \
: (int32_t)(val) - (val))*100)
  • IIC读写卡住问题

卡在iic读写的时候,很大可能是它的设备地址没有写对,有些库会偏移器件地址,有些不会。试一下把iic器件的地址偏移。

  • 自定义蓝牙名字过长,广播显示不全

原因:nrf52832默认使用蓝牙4.x的广播,它的广播包数据只有32byte数据,当广播已经包含足够多的数据的时候,广播每次过长就会显示部分名称,即便你选择"BLE_ADVDATA_FULL_NAME"也一样。解决办法是使用蓝牙5.0,它的容量就会增加到254byte,具体添加代码如下:

/**
* @brief Function for initializing the Advertising functionality.
*/
void advertising_init(void)
{
uint32_t err_code;
ble_advertising_init_t adv_data;
ble_advdata_service_data_t service_data; //定义蓝牙服务数据到广播包中
int8_t tx_power_level = TX_POWER_LEVEL; //设置发射功率 memset(&adv_data, 0, sizeof(adv_data)); adv_data.advdata.name_type = BLE_ADVDATA_FULL_NAME;
adv_data.advdata.include_appearance = true;
adv_data.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
adv_data.advdata.p_tx_power_level = &tx_power_level; adv_data.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
adv_data.advdata.uuids_complete.p_uuids = m_adv_uuids; uint8_t my_adv_manuf_data[6] = {0};
memcpy(my_adv_manuf_data, passwords, 6);
ble_advdata_manuf_data_t manuf_specific_data; //定义制造商数据结构体变量
manuf_specific_data.company_identifier = 0x0059; //0x0059是Nordic的制造商ID
manuf_specific_data.data.p_data = my_adv_manuf_data; //指向自定义数据
manuf_specific_data.data.size = sizeof(my_adv_manuf_data); //自定义数据的大小
adv_data.advdata.p_manuf_specific_data = &manuf_specific_data; //定义自定义数据到广播包中 adv_data.config.ble_adv_fast_enabled = true;
adv_data.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
adv_data.config.ble_adv_fast_timeout = APP_ADV_DURATION;
adv_data.evt_handler = on_adv_evt; //**********************添加蓝牙5.0**************************//
adv_data.config.ble_adv_primary_phy = BLE_GAP_PHY_1MBPS;
adv_data.config.ble_adv_secondary_phy = BLE_GAP_PHY_2MBPS;
adv_data.config.ble_adv_extended_enabled = true;
//***********************************************************// err_code = ble_advertising_init(&m_advertising, &adv_data);
APP_ERROR_CHECK(err_code); ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}

注意:只能添加advdata的数据,srdata的数据在开启5.0之后添加会出错。

  • 按键长短按设置的时候每次都进入短按事件

注释掉bsp_init()里面的循环

//      uint32_t num;

//      for (num = 0; ((num < BUTTONS_NUMBER) && (err_code == NRF_SUCCESS)); num++)
// {
// err_code = bsp_event_to_button_action_assign(num, BSP_BUTTON_ACTION_PUSH, BSP_EVENT_DEFAULT);
// }
  • 【程序错误】 <error> nrf_sdh_ble: sd_ble_enable() returned NRF_ERROR_NO_MEM.

错误截图:

将0x20002AE8和0xD518放入Keil5的RAM设置

产生NRF_ERROR_NO_MEM的原因,除了RAM没有配置对,还与NRF_SDH_BLE_VS_UUID_COUNTNRF_SDH_BLE_GATTS_ATTR_TAB_SIZE,试着SIZE的值,然后改RAM可能就可以解决。

  • 【自定义服务】—— 初始化值不显示、显示不全问题

看看有没有设置变量把值存进去,再进行复制;设置长度可变,如下

add_char_params.is_var_len          = true;			//长度可变
  • 【自定义服务】添加128bitUUID到特性

在添加特性前面,添加一个sd_ble_uuid_vs_add()函数,把自定义特性的128UUID放进去,然后再添加特性。

示例代码:

/**
@brief Register the application callback function. Call this function only once
@param pLwsProfile -[out] LWS Initialize the service structure
@param pAppCallback -[in] Callback to the application
@return NRF_SUCCESS - Success; other values-failure
*/
uint32_t ble_lws_init(LwsProfile_t *pLwsProfile, const LwsProfileCallback_t *pAppCallback)
{
uint32_t errCode;
ble_uuid_t bleUuid;
ble_add_char_params_t addCharParams; // Initialize the service structure
pLwsProfile->lWsProfileCharWriteHandler = pAppCallback->lWsProfileCharWriteHandler; /*--------------------- service ---------------------*/
ble_uuid128_t baseUuid = {LWSPROFILE_UUID_BASE};
// Add base UUID
errCode = sd_ble_uuid_vs_add(&baseUuid, &pLwsProfile->uuidType);
VERIFY_SUCCESS(errCode); //Add main service UUID
bleUuid.type = pLwsProfile->uuidType;
bleUuid.uuid = LWSPROFILE_UUID_SERVICE; errCode = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
&bleUuid,
&pLwsProfile->serviceHandle);
VERIFY_SUCCESS(errCode); /*--------------------- characteristic 1--Update request---------------------*/
ble_uuid128_t nus_base_uuid_char1 = LWSPROFILE_UUID_NEW_CHAR1;
errCode = sd_ble_uuid_vs_add(&nus_base_uuid_char1, &pLwsProfile->uuidType); // add uuid base to SD, get uuid type back to app
VERIFY_SUCCESS(errCode); memset(&addCharParams, 0, sizeof(addCharParams));
addCharParams.uuid = LWSPROFILE_UUID_CHAR1;
addCharParams.uuid_type = pLwsProfile->uuidType;
addCharParams.init_len = 0;
addCharParams.max_len = LWSPROFILE_CHAR1_LEN; // Characteristic length
addCharParams.is_var_len = true; //可变数据长度
addCharParams.char_props.indicate = 1; // Declarable addCharParams.cccd_write_access = SEC_MITM; errCode = characteristic_add(pLwsProfile->serviceHandle, &addCharParams, &pLwsProfile->char1Handle);
return errCode;
}
  • 在DFU后,FDS内容丢失

FDS供用户使用的有一个范围的ID,FILE ID(0x0000 - 0xBFFF),RECORD KEY(0x0001 - 0xBFFF),在这个范围内使用一般没什么问题,而我直接使用0xfff1的ID,就有这个问题。FILE ID 从0xC000 到 0xFFFF 的值保留供Peer Manager模块使用,并且只能在不包含 Peer Manager 的应用程序中使用;RECORD KEY 从0xFFFF 是被系统使用的,从 0xC000 到 0xFFFE 的值保留供Peer Manager模块使用,并且只能在不包含 Peer Manager 的应用程序中使用。

  •  sd_ble_gatts_value_set()产生的错误NRF_ERROR_DATA_SIZE

原因:使用数据长度超过特征最大长度

解决办法:将所使用到的特征的最大长度加长

  • nrf_crypto_init初始化失败

RTT打印信息:

sm_init()初始化产生的错误,可能是RNG重复初始化,可以在sm_init()里面加一个重复判断,或者把原先的RNG初始化关闭。

三、硬件问题

  • DFU升级程序一直卡在bootloader

本来以为是配置问题,然后看了一天的配置,发现一点问题都没有  再去看升级命令、步骤,也没有发现什么问题。也试过改settings的版本号,也不行。最后在官方文档发现,程序在启动时先进入协议栈,再由协议栈进入bootloader,然后bootloader去检测是否进入app。如果bootloader的按键进入DFU引脚一直被拉高,就会导致程序一直无法启动。解决办法,把bootloader的按键检测引脚更换到其他引脚位置。

原本是25号引脚,被我改到了27号,程序可以正常进入,DFU也是正常的。

四、解决思路

以前遇到nrf52832问题的时候,直接就百度,如果关键词不对会花费很多时间。现在的话,先去开启DEBUG打印,看看错误的位置,再去看函数定义的错误返回值是什么原因引起的,要么直接改,要么根据这个函数和返回错误百度或者去官方社区搜索。都找不到就去看NORDIC在线文档的指导步骤。之后想到的再更新,nrf52832该有的坑我都踩了

五、参考链接

nrf52832 SPI和IIC外设不可同时使用

nrf52832底层驱动兼容性问题

关于stm32报错Library reports error: __use_no_semihosting was requested的三种解决方案

NRF52832学习笔记(13)——RTT打印调试日志

Flash Data Storage (FDS)存储

nrf52832蓝牙开发踩过的坑的更多相关文章

  1. 那些年,Android开发踩过的坑

    首先讲一讲环境配置吧,一般刚上手Android编程,推荐的两款软件开发工具有Eclipse和Andriod Studio,配置环境来讲呢,Android Studio配置环境要快得多,而且比起Ecli ...

  2. "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"

    欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...

  3. 使用vue开发项目需要注意的问题和可能踩到的坑

    最近,在公司给一些刚刚使用vue进行开发的同学做了一次分享, 其中包括一些vue开发中需要注意的点, 以及一些可能会踩到的坑.具体内容如下: 一.生命钩子使用需要注意的地方 1.beforeCreat ...

  4. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  5. 微信小程序开发踩坑记

    前言 微信小程序自去年公测以来,我司也申请了一个帐号开发,春节前后开始开发,现在终于告一个段落了.谨以此文记录下踩过的坑. 坑1:scroll-view与onPullDownRefresh冲突 由于有 ...

  6. Dcloud开发webApp踩过的坑

    Dcloud开发webApp踩过的坑 一.总结 一句话总结:HTML5+扩展了JavaScript对象plus,使得js可以调用各种浏览器无法实现或实现不佳的系统能力,设备能力如摄像头.陀螺仪.文件系 ...

  7. 转:Flutter开发中踩过的坑

    记录一下入手Flutter后实际开发中踩过的一些坑,这些坑希望后来者踩的越少越好.本文章默认读者已经掌握Flutter初步开发基础. 坑1问题:在debug模式下,App启动第一个页面会很慢,甚至是黑 ...

  8. Taro 开发踩坑指南 (小程序,H5, RN)

    Taro 开发踩坑指南 (小程序,H5, RN) css taro 如何展示多行文本省略号 https://www.cnblogs.com/xgqfrms/p/12569057.html UI 设计稿 ...

  9. web开发实战--弹出式富文本编辑器的实现思路和踩过的坑

    前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...

随机推荐

  1. 10.1 HTTP

    1.跨网络的主机间通讯 套接字Socket是进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间通信和数据交换 在建立通信连接的每一端,进程间的传输要有两个标志:IP地址和端口号, ...

  2. SphereEx 登陆 ApacheCon Asia|依托 ShardingSphere 可插拔架构体系打造数据应用完整生态

    2021 年 8 月 8 日,ApacheCon 首次亚洲大会于线上正式闭幕.作为久负盛名的开源盛宴,本届 ApacheCon Asia 受到了海内外众多开源领域人士的关注. 作为 Apache 软件 ...

  3. 初探区块链数字加密资产标准ERC721

    ERC721介绍 数字加密货币大致可以分为原生币(coin)和代币(token)两大类.前者如BTC.ETH等,拥有自己的区块链.后者如Tether.TRON.ONT等,依附于现有的区块链.市场上流通 ...

  4. 搭建hexo博客遇到的问题

    搭建hexo博客遇到的问题 常用命令 hexo clean 清除hexo缓存 hexo generate 生成文章 hexo deploy 部署 hexo new post name 新建文章名 he ...

  5. 听说,99% 的 Go 程序员都被 defer 坑过

    原文链接: 听说,99% 的 Go 程序员都被 defer 坑过 先声明:我被坑过. 之前写 Go 专栏时,写过一篇文章:Go 专栏|错误处理:defer,panic 和 recover.有小伙伴留言 ...

  6. 痞子衡嵌入式:超级下载算法RT-UFL v1.0在恩智浦MCUXpresso IDE下的使用

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...

  7. 自定义ConditionalOnXX注解

    一.Conditional注解介绍 对SpringBoot有足够了解的小伙伴应该都用过Conditional系列注解,该注解可用在类或者方法上用于控制Bean的初始化. 常用的Conditional注 ...

  8. Elasticsearch 中为什么选择倒排索引而不选择 B 树索引

    目录 前言 为什么全文索引不使用 B+ 树进行存储 全文检索 正排索引 倒排索引 倒排索引如何存储数据 FOR 压缩 RBM 压缩 倒排索引如何存储 字典树(Tria Tree) FST FSM 构建 ...

  9. js this指向汇总

    this指向 普通函数  window 定时器函数         window 事件函数 事件源 箭头函数 父function中的this,没有就是window 对象函数 对象本身 构造函数 实例化 ...

  10. DeWeb进阶 :控件开发 --- 1 完成一个纯html的demo

    最近随着DeWeb(以下简称DW)的完善,和群友的应用的深入,已经有网友开始尝试做DeWeb支持控件的开发了! 这太令人兴奋了! 作为DeWeb的开发者,感觉DeWeb的优势之一就是简洁的第三方控件扩 ...