Nordic软件二[蓝牙协议栈初始化卡死(时钟源默认外部晶振但是板子是内部RC)问题][BSP代码模块修改管脚和相关机制]

ops/2024/9/24 21:46:41/

蓝牙协议栈初始化卡死(时钟源默认外部晶振但是板子是内部RC)问题

本文摘录于:https://blog.csdn.net/chengbaojin/article/details/103778150只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人!
先参考上面的文章做如下修改:
在这里插入图片描述

将如下代码:
// <0=> NRF_CLOCK_LF_SRC_RC 内部时钟
// <1=> NRF_CLOCK_LF_SRC_XTAL 外部晶振时钟
// <2=> NRF_CLOCK_LF_SRC_SYNTH  从高速时钟合成的低速时钟#ifndef NRF_SDH_CLOCK_LF_SRC
#define NRF_SDH_CLOCK_LF_SRC 1 
#endif// <o> NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval. 
#ifndef NRF_SDH_CLOCK_LF_RC_CTIV
#define NRF_SDH_CLOCK_LF_RC_CTIV 0 
#endif
修改为:
// <0=> NRF_CLOCK_LF_SRC_RC 内部时钟
// <1=> NRF_CLOCK_LF_SRC_XTAL 外部晶振时钟
// <2=> NRF_CLOCK_LF_SRC_SYNTH  从高速时钟合成的低速时钟#ifndef NRF_SDH_CLOCK_LF_SRC
#define NRF_SDH_CLOCK_LF_SRC 0 
#endif// <o> NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval. 
#ifndef NRF_SDH_CLOCK_LF_RC_CTIV
#define NRF_SDH_CLOCK_LF_RC_CTIV 16 
#endif

除了上面的修改还要修改这里:
在这里插入图片描述

// <o> NRFX_CLOCK_CONFIG_LF_SRC  - LF Clock Source// <0=> RC 
// <1=> XTAL 
// <2=> Synth 
// <131073=> External Low Swing 
// <196609=> External Full Swing #ifndef NRFX_CLOCK_CONFIG_LF_SRC
#define NRFX_CLOCK_CONFIG_LF_SRC 0
#endif

原来是打印怎么都出来不了,修改后打印正常了:
在这里插入图片描述

BSP代码模块修改管脚和回调事件

Nordic用BSP机制来管理button和led,main函数调用buttons_leds_init函数进行初始化:

static void buttons_leds_init(bool * p_erase_bonds)
{bsp_event_t startup_event;uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);APP_ERROR_CHECK(err_code);err_code = bsp_btn_ble_init(NULL, &startup_event);APP_ERROR_CHECK(err_code);*p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
}

这里同时使用了LED和button的功能,回调事件为:

void bsp_event_handler(bsp_event_t event)
{uint32_t err_code;switch (event){case BSP_EVENT_KEY_2:NRF_LOG_INFO("BSP_EVENT_KEY:%d",event);LEDandBUZZset(true);break;}
}

button的定义如下:
在这里插入图片描述
在这里插入图片描述


#define BUTTON_1       9//13
#define BUTTON_2       30//14#define BSP_BUTTON_0   BUTTON_1
#define BSP_BUTTON_1   BUTTON_2static const app_button_cfg_t app_buttons[BUTTONS_NUMBER] =
{#ifdef BSP_BUTTON_0{BSP_BUTTON_0, false, BUTTON_PULL, bsp_button_event_handler},#endif // BUTTON_0#ifdef BSP_BUTTON_1{BSP_BUTTON_1, false, BUTTON_PULL, bsp_button_event_handler},#endif // BUTTON_1#ifdef BSP_BUTTON_2{BSP_BUTTON_2, false, BUTTON_PULL, bsp_button_event_handler},#endif // BUTTON_2#ifdef BSP_BUTTON_3{BSP_BUTTON_3, false, BUTTON_PULL, bsp_button_event_handler},#endif // BUTTON_3#ifdef BSP_BUTTON_4{BSP_BUTTON_4, false, BUTTON_PULL, bsp_button_event_handler},#endif // BUTTON_4#ifdef BSP_BUTTON_5{BSP_BUTTON_5, false, BUTTON_PULL, bsp_button_event_handler},#endif // BUTTON_5#ifdef BSP_BUTTON_6{BSP_BUTTON_6, false, BUTTON_PULL, bsp_button_event_handler},#endif // BUTTON_6#ifdef BSP_BUTTON_7{BSP_BUTTON_7, false, BUTTON_PULL, bsp_button_event_handler},#endif // BUTTON_7};

这里测试到一个问题,明明我的GPIO9定义为BSP_BUTTON_0,为啥上报事件为BSP_EVENT_KEY_2,继续往下看advertising_buttons_configure函数中这样关联BSP_EVENT_KEY_2和BTN_ID_REQ:

#define BTN_ID_REQ                0//2  
#define BTN_ID_UPDATE_ADV         1//3  err_code = bsp_event_to_button_action_assign(BTN_ID_REQ,BSP_BUTTON_ACTION_PUSH,BSP_EVENT_KEY_2);
uint32_t bsp_event_to_button_action_assign(uint32_t button, bsp_button_action_t action, bsp_event_t event)

其实转了一圈后发现BTN_ID_REQ也是ID,Nordic就是这样一个定义转来转去!由上面的代码可以看到把BTN_ID_REQ(和BUTTON_1有关系)的BSP_BUTTON_ACTION_PUSH事件和BSP_EVENT_KEY_2关联了,所以在bsp_event_handler函数中可以直接用BSP_EVENT_KEY_2来判断是BUTTON_1的单机事件!


http://www.ppmy.cn/ops/115479.html

相关文章

网络:TCP协议-报头字段

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 文章目录 前言一、TCP协议格式16位源端口号 和 16位目的端口号4位首部长度16位窗口大小32位序号 和 32位确认序号6种标记位 和 16位紧急指针 总结 前言 本文是我对于TCP协…

集群聊天服务器项目【C++】(六)MySql数据库

前面已经介绍了网络模块和业务模块&#xff0c;本章介绍数据模块&#xff0c;同样保持模块解耦的特性&#xff0c;即业务模块不能出现数据模块内容&#xff0c;如出现SQL语句&#xff0c;接下来看看怎么实现的。 1.环境安装 第一章已经介绍了MySql安装&#xff0c;但注意需要…

ES 索引或索引模板

文章目录 1.索引模板是什么2.索引模板查询3.索引模板中条目数4.索引模板删数据5.尝试刷新索引6.索引模板删数据7.查询索引字段类型8.创建索引模板 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 1.索引模板是什么 当需要为同一类索引应用相同的配置、…

chatGPT问答知识合集【二】

Redis 架构说明 Redis 是一个开源的内存数据库&#xff0c;它也可以持久化到磁盘。以下是 Redis 的典型架构说明&#xff1a;### Redis 架构组件&#xff1a;1. **客户端**&#xff1a;与 Redis 服务器进行通信的应用程序或客户端库。2. **Redis 服务器**&#xff1a;执行实际…

构建高可用和高防御力的云服务架构第五部分:PolarDB(5/5)

引言 云计算与数据库服务 云计算作为一种革命性的技术&#xff0c;已经深刻改变了信息技术行业的面貌。它通过提供按需分配的计算资源&#xff0c;使得数据存储、处理和分析变得更加灵活和高效。在云计算的众多服务中&#xff0c;数据库服务扮演着核心角色。数据库服务不仅负…

计算机网络17——IM聊天系统——客户端核心处理类框架搭建

目的 拆开客户端和服务端&#xff0c;使用Qt实现客户端&#xff0c;VS实现服务端 Qt创建项目 Qt文件类型 .pro文件&#xff1a;配置文件&#xff0c;决定了哪些文件参与编译&#xff0c;怎样参与编译 .h .cpp .ui&#xff1a;画图文件 Qt编码方式 Qt使用utf-8作为编码方…

Spring Data Rest 远程命令执行命令(CVE-2017-8046)

&#xff08;1&#xff09;访问 http://your-ip:8080/customers/1&#xff0c;然后抓取数据包&#xff0c;使用PATCH请求来修改 PATCH /customers/1 HTTP/1.1 Host: Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MS…

vue3<script setup>中toref()和torefs()

在 Vue 3 中&#xff0c;特别是与 <script setup> 语法糖结合使用时&#xff0c;toRef 和 toRefs 是两个非常有用的 Composition API 函数&#xff0c;它们用于在 Composition API 中创建响应式引用&#xff0c;这些引用可以保持对原始响应式对象的响应性&#xff0c;同时…