在对boot进行修改时,请先掌握以下内容:
《nRF5x系列蓝牙模块DFU升级服务移植 -- 1 工具安装》
《nRF5x系列蓝牙模块DFU升级服务移植 -- 2 文件生成》
《nRF5x系列蓝牙模块DFU升级服务移植 -- 3 烧写升级》
《nRF5x系列蓝牙模块DFU升级服务移植 -- 4 应用移植》
由于车位锁项目中使用自制底板,和标准开发板存在差异,所以需要按照以下步骤对bootloader程序进行修改。
5.1 配置文件使能
协议栈时钟初始化参数的更改,修改nRF_softDevice选项下的NRF_SDH_BLE_ENABLED下的Clock下的NRF_SDH_CLOCK_LF_SRC内容为NRF_CLOCK_LF_SR_RC;修改nRF_softDevice选项下的NRF_SDH_BLE_ENABLED下的Clock下的NRF_SDH_CLOCK_LF_RC_CTIV内容为16;修改nRF_softDevice选项下的NRF_SDH_BLE_ENABLED下的Clock下的NRF_SDH_CLOCK_LF_ACCURACY内容为NRF_CLOCK_LF_ACCURACY_250_PPM。修改后结果如下图所示:
5.2 代码修改
5.2.1 PA初始化
1、在nrf_dfu_ble.c文件中添加PA配置初始化函数,代码如下图所示:
void pa_lna_assist(uint32_t gpio_pa_pin, uint32_t gpio_lna_pin)
{
ret_code_t err_code;
//static const uint32_t gpio_toggle_ch = 0;
//static const uint32_t ppi_set_ch = 0;
//static const uint32_t ppi_clr_ch = 1;
static const uint32_t gpio_toggle_ch = 3;
static const uint32_t ppi_set_ch = 0;
static const uint32_t ppi_clr_ch = 1;
// Configure SoftDevice PA/LNA assist
ble_opt_t opt;
memset(&opt, 0, sizeof(ble_opt_t));
// Common PA/LNA config
opt.common_opt.pa_lna.gpiote_ch_id = gpio_toggle_ch; // GPIOTE channel
opt.common_opt.pa_lna.ppi_ch_id_clr = ppi_clr_ch; // PPI channel for pin clearing
opt.common_opt.pa_lna.ppi_ch_id_set = ppi_set_ch; // PPI channel for pin setting
// PA config
opt.common_opt.pa_lna.pa_cfg.active_high = 1; // Set the pin to be active high
opt.common_opt.pa_lna.pa_cfg.enable = 1; // Enable toggling
opt.common_opt.pa_lna.pa_cfg.gpio_pin = gpio_pa_pin; // The GPIO pin to toggle
// LNA config
opt.common_opt.pa_lna.lna_cfg.active_high = 1; // Set the pin to be active high
opt.common_opt.pa_lna.lna_cfg.enable = 1; // Enable toggling
opt.common_opt.pa_lna.lna_cfg.gpio_pin = gpio_lna_pin; // The GPIO pin to toggle
err_code = sd_ble_opt_set(BLE_COMMON_OPT_PA_LNA, &opt);
APP_ERROR_CHECK(err_code);
}
2、在广播初始化函数中调用PA配置初始化函数,代码如下图所示:
static uint32_t advertising_init(uint8_t adv_flags, ble_gap_adv_params_t const * const p_adv_params)
{
uint32_t err_code;
uint16_t actual_device_name_length = BLE_GAP_ADV_SET_DATA_SIZE_MAX - APP_ADV_DATA_HEADER_SIZE;
/* This needs to be static because of SoftDevice API requirements. */
static uint8_t m_enc_advdata[BLE_GAP_ADV_SET_DATA_SIZE_MAX];
ble_gap_adv_data_t m_adv_data =
{
.adv_data =
{
.p_data = m_enc_advdata,
.len = APP_ADV_DATA_HEADER_SIZE,
}
};
/* Encode flags. */
m_enc_advdata[0] = 0x2;
m_enc_advdata[1] = BLE_GAP_AD_TYPE_FLAGS;
m_enc_advdata[2] = adv_flags;
/* Encode 'more available' UUID list. */
m_enc_advdata[3] = 0x3;
m_enc_advdata[4] = BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE;
m_enc_advdata[5] = LSB_16(BLE_DFU_SERVICE_UUID);
m_enc_advdata[6] = MSB_16(BLE_DFU_SERVICE_UUID);
/* Get GAP device name and length. */
err_code = sd_ble_gap_device_name_get(&m_enc_advdata[9], &actual_device_name_length);
if (err_code != NRF_SUCCESS)
{
return err_code;
}
// Set GAP device in advertising data.
m_enc_advdata[7] = actual_device_name_length + 1; // (actual_length + ADV_AD_TYPE_FIELD_SIZE(1))
m_enc_advdata[8] = BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME;
m_adv_data.adv_data.len += actual_device_name_length;
pa_lna_assist(24, 20); //ÉèÖÃpa,lnaÒý½Å
//err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, BLE_CONN_HANDLE_INVALID, TX_POWER_LEVEL);
//APP_ERROR_CHECK(err_code);
return sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, p_adv_params);
}
5.2.2 宏的声明
在Keil工程设置选项下的C/C++选项下的Define中删除CONFIG_GPIO_AS_PINRESET宏定义,如下图所示:
操作完成后,按照《nRF5x系列蓝牙模块DFU升级服务移植 -- 2 文件生成》、《nRF5x系列蓝牙模块DFU升级服务移植 -- 3 烧写升级》编译生成引导hex文件。烧写步骤可按照第3章操作步骤进行。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。