nrf52832蓝牙开发踩过的坑
接触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_COUNT和NRF_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该有的坑我都踩了
五、参考链接
关于stm32报错Library reports error: __use_no_semihosting was requested的三种解决方案
nrf52832蓝牙开发踩过的坑的更多相关文章
- 那些年,Android开发踩过的坑
首先讲一讲环境配置吧,一般刚上手Android编程,推荐的两款软件开发工具有Eclipse和Andriod Studio,配置环境来讲呢,Android Studio配置环境要快得多,而且比起Ecli ...
- "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"
欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...
- 使用vue开发项目需要注意的问题和可能踩到的坑
最近,在公司给一些刚刚使用vue进行开发的同学做了一次分享, 其中包括一些vue开发中需要注意的点, 以及一些可能会踩到的坑.具体内容如下: 一.生命钩子使用需要注意的地方 1.beforeCreat ...
- 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 ...
- 微信小程序开发踩坑记
前言 微信小程序自去年公测以来,我司也申请了一个帐号开发,春节前后开始开发,现在终于告一个段落了.谨以此文记录下踩过的坑. 坑1:scroll-view与onPullDownRefresh冲突 由于有 ...
- Dcloud开发webApp踩过的坑
Dcloud开发webApp踩过的坑 一.总结 一句话总结:HTML5+扩展了JavaScript对象plus,使得js可以调用各种浏览器无法实现或实现不佳的系统能力,设备能力如摄像头.陀螺仪.文件系 ...
- 转:Flutter开发中踩过的坑
记录一下入手Flutter后实际开发中踩过的一些坑,这些坑希望后来者踩的越少越好.本文章默认读者已经掌握Flutter初步开发基础. 坑1问题:在debug模式下,App启动第一个页面会很慢,甚至是黑 ...
- Taro 开发踩坑指南 (小程序,H5, RN)
Taro 开发踩坑指南 (小程序,H5, RN) css taro 如何展示多行文本省略号 https://www.cnblogs.com/xgqfrms/p/12569057.html UI 设计稿 ...
- web开发实战--弹出式富文本编辑器的实现思路和踩过的坑
前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...
随机推荐
- js正则格式化日期时间自动补0
原文 js正则格式化日期时间自动补0 背景 时间日期格式化的需求很常见,也有很多工具类转换方法,比如需要将2022-3-4这种日期格式转化为2022-03-04,也就是实现个位数月份或天数日期自动前置 ...
- Java基础之(五):数据类型
Java快捷键 首先我们先来介绍下IDEA的一些快捷键 psvm=public static void main(String[] args) {} sout=System.out.println(& ...
- pip 命令总结
建议和 Conda 命令一起看,pip 和conda命令有点相似.<Conda 命令> 1 查看帮助文档 pip --help 使用该命令将告诉你 pip 的常用命令. 使用时,输入pip ...
- scratch塔罗牌的制作
首先,这个程序的流程是洗牌->占卜,很简单的一个程序.那个程序的组成是什么呢? 该程序由22张大卡.开始洗牌按钮.占卜按钮和说出占卜结果的角色组成. 先来说说开始洗牌按钮吧. 开始的时候移动到相 ...
- 内网渗透DC-1靶场通关(CTF)
最新博客见我的个人博客地址 DC系列共9个靶场,本次来试玩一下DC-1,共有5个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题. ...
- Java编程开发学习路线图(附所有免费课程+在线自测)
转自 https://yq.aliyun.com/articles/134286?spm=5176.100239.0.0.1UfveS 摘要: 长期以来,Java一直占据TIOBE编程语言排行版第一 ...
- 并发编程从零开始(八)-ConcurrentHashMap
并发编程从零开始(八)-ConcurrentHashMap 5.5 ConcurrentHashMap HashMap通常的实现方式是"数组+链表",这种方式被称为"拉链 ...
- DDD领域驱动设计-案例建模设计-Ⅲ
1. 背景 参考<DDD领域驱动设计-案例需求文档>,本文将构建实体,聚合根详述领域驱动中的建模设计.构建实体,聚合根的一些原则或方法,将在后续文章中说明. 2. 建模设计 2.1. 实体 ...
- allegro查看线宽的方法
- 大牛针对零基础入门c语言详解指针(超详细)
C语言指针说难不难但是说容易又是最容易出错的地方,因此不管是你要做什么只要用到C指针你就跳不过,今天咱们就以 十九个例子来给大家简单的分析一下指针的应用,最后会有C语言视频资料提供给大家更加深入的参考 ...