ble_app_template APP_ERROR:ERROR:Fatal Печать
Добавил(а) microsin   

После некоторого периода ожидания (приблизительно 3 минуты), в течение которого BLE-устройство ble_app_template выдает пакеты оповещения (advertising), возникает ошибка, при которой в RTT-лог выводится сообщение APP_ERROR:ERROR:Fatal.

Эта ошибка появляется только в случае, когда к устройству подключена консоль сообщений RTT [2] в момент, когда вызывается обработчик событий оповещения on_adv_evt с кодом события BLE_ADV_EVT_IDLE. Тогда вызывается функция sleep_mode_enter(), восстановление из которой возможно только путем полного сброса системы.

/**@brief Функция для обработки событий оповещения (advertising events).
 *
 * @details Эта функция будет вызвана, когда SoftDevice передает
 *          в приложение события оповещения.
 *
 * @param[in] ble_adv_evt  Событие оповещения BLE.
 */
static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
{
    uint32_t err_code;
 
    switch (ble_adv_evt)
    {
        case BLE_ADV_EVT_FAST:
            NRF_LOG_INFO("Fast advertising\r\n");
            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
            APP_ERROR_CHECK(err_code);
            break;
 
        case BLE_ADV_EVT_IDLE:
            sleep_mode_enter();
            break;
 
        default:
            break;
    }
}

В этот момент устройство входит в режим сна, и при активной консоли RTT происходит ошибка APP_ERROR:ERROR:Fatal. Если в этот момент нажать на любую из 4 кнопок DK, то произойдет перезагрузка. При отключенном RTT устройство перезагрузится автоматически.

В принципе такое поведение с входом в режим сна вызовом функции sleep_mode_enter() было изначально предусмотрено как в примере приложения ble_app_template, так и во многих других примерах периферийных устройств BLE из SDK от Nordic Semiconductor. Это сделано специально, чтобы устройство уходило в режим сна для максимальной экономии энергии. Интервал, через которые происходит уход в sleep_mode_enter - APP_ADV_TIMEOUT_IN_SECONDS.

Отключить такое поведение просто, если закомментировать вызов функции sleep_mode_enter. Тогда устройство будет бесконечно находиться в режиме оповещения.

        case BLE_ADV_EVT_IDLE:
            // sleep_mode_enter();
            break;

[Ссылки]

1. Fatal error on sleep 0x4001 site:devzone.nordicsemi.com.
2. nRF5x: отладка с помощью RTT.