본문 바로가기
Embedded/nRF52 BLE 개발 안내서

nRF52 BLE 개발하기 - NRF_LOG_INFO

by 큐찡 2021. 1. 19.
728x90
반응형

시작하기

이번에는 random number generator 예제를 통해 소스코드 디버깅 시 유용한 NRF_LOG_INFO 함수 사용법을 같이 알아보도록 하자.

\examples\peripheral\rng\pca10040\blank\ses 폴더에서 프로젝트를 실행하자.

#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"


#define RANDOM_BUFF_SIZE    16      /**< Random numbers buffer size. */

/** @brief Function for getting vector of random numbers.
 *
 * @param[out] p_buff       Pointer to unit8_t buffer for storing the bytes.
 * @param[in]  length       Number of bytes to take from pool and place in p_buff.
 *
 * @retval     Number of bytes actually placed in p_buff.
 */
static uint8_t random_vector_generate(uint8_t * p_buff, uint8_t size)
{
    uint32_t err_code;
    uint8_t  available;

    nrf_drv_rng_bytes_available(&available);
    uint8_t length = MIN(size, available);

    err_code = nrf_drv_rng_rand(p_buff, length);
    APP_ERROR_CHECK(err_code);

    return length;
}

/** @brief Function for main application entry.
 */
int main(void)
{
    uint32_t err_code;

    err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();

    err_code = nrf_drv_rng_init(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_INFO("RNG example started.");

    while (true)
    {
        uint8_t p_buff[RANDOM_BUFF_SIZE];
        uint8_t length = random_vector_generate(p_buff,RANDOM_BUFF_SIZE);
        NRF_LOG_INFO("Random Vector:");
        NRF_LOG_HEXDUMP_INFO(p_buff, length);
        NRF_LOG_INFO("");
        NRF_LOG_FLUSH();
        nrf_delay_ms(100);
    }
}

rng 예제는 100ms 마다 랜덤 한 숫자를 만들어서 이를 보여주는 간단한 예제이다.

기본적으로 UART를 통해 NRF_LOG_INFO를 출력하도록 설정되어 있어 USB to UART 컨버터가 없으면 확인할 수 없는 문제가 있다.

USB to UART 컨버터를 구매해서 사용하면 확인할 수 있지만 nRF52832는 사용 가능한 UART가 1개뿐이다.

만약에 UART를 사용하여 센서 사용이나 외부와 통신(RS-232/485 등)을 하게 되면 문제가 발생할 수 있다.

그래서 SES에서 Debug Terminal로 NRF_LOG_INFO를 통해 출력하는 방법에 대해서 알아보도록 하자.

// <e> NRF_LOG_ENABLED - nrf_log - Logger
//==========================================================
#ifndef NRF_LOG_ENABLED
#define NRF_LOG_ENABLED 1
#endif

// <q> NRF_FPRINTF_FLAG_AUTOMATIC_CR_ON_LF_ENABLED  - For each printed LF, function will add CR.
 

#ifndef NRF_FPRINTF_FLAG_AUTOMATIC_CR_ON_LF_ENABLED
#define NRF_FPRINTF_FLAG_AUTOMATIC_CR_ON_LF_ENABLED 0
#endif

//==========================================================
// <e> NRF_LOG_BACKEND_RTT_ENABLED - nrf_log_backend_rtt - Log RTT backend
//==========================================================
#ifndef NRF_LOG_BACKEND_RTT_ENABLED
#define NRF_LOG_BACKEND_RTT_ENABLED 1
#endif

// <e> NRF_LOG_BACKEND_UART_ENABLED - nrf_log_backend_uart - Log UART backend
//==========================================================
#ifndef NRF_LOG_BACKEND_UART_ENABLED
#define NRF_LOG_BACKEND_UART_ENABLED 0
#endif

sdk_config.h 파일에서 위와 같이 설정을 변경하고 펌웨어를 다운로드해주자.

펌웨어가 다운로드되고 나면 메뉴바에서 View - Debug Terminal (Ctrl+Alt+D)를 선택한다.

그럼 하단에 Output으로 되어있는 창이 Debug Terminal 창으로 전환된다.

이제 이 상태에서 펌웨어를 동작시켜 보도록 하자.

Debug Terminal 창에 NRF_LOG_INFO 출력 메시지가 나타나는 것을 볼 수 있다.

이제 NRF_LOG_INFO 출력을 어떻게 사용하는지 알아보도록 하자.

1. NRF_LOG_INIT 함수와 NRF_LOG_DEFAULT_BACKENDS_INIT 함수를 호출해 NRF_LOG를 사용할 수 있게 설정한다.

2. NRF_LOG_INFO 함수에 출력할 메시지를 전달 인자로 넘겨준다.

3. NRF_LOG_FLUSH 함수를 호출해 메시지를 출력한다.

예제에서는 랜덤 하게 생성된 숫자 배열을 출력하도록 되어 있다.

이제 printf 함수를 사용하는 것처럼 해보도록 하자.

int main(void)
{
    uint32_t err_code;
    uint32_t i = 0;

    err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();

    while (true)
    {
        NRF_LOG_INFO("Hello World! - %d", i);
        NRF_LOG_FLUSH();
        nrf_delay_ms(1000);
        
        i++;
    }
}


int main(void)
{
    uint32_t err_code;
    uint32_t i = 0;

    err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();

    while (true)
    {
        NRF_LOG_INFO("Hello World! - %02x", i);
        NRF_LOG_FLUSH();
        nrf_delay_ms(1000);
        
        i++;
    }
}


int main(void)
{
    uint32_t err_code;
    float i = 0.0;

    err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();

    while (true)
    {
        NRF_LOG_INFO("Hello World! - "NRF_LOG_FLOAT_MARKER"", NRF_LOG_FLOAT(i));
        NRF_LOG_FLUSH();
        nrf_delay_ms(1000);
        
        i += 0.15;
    }
}

앞으로

rng 예제였지만 실제로는 NRF_LOG_INFO 사용법에 대해서 알아보았다.

이제부터 예제에 있는 메시지 출력은 NRF_LOG_INFO를 이용하면서 살펴볼 예정이다.

728x90
반응형

댓글