自学内容网 自学内容网

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

蓝牙协议栈初始化卡死(时钟源默认外部晶振但是板子是内部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_2

static 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的单机事件!


原文地址:https://blog.csdn.net/chengdong1314/article/details/142497345

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!