본문 바로가기
Study/nRF51xxx(BLE)

nRF51 DK 예제 13 - Random Number Generator(RNG)

by Answer Choi 2015. 3. 12.
반응형




이번 예제는 Random Number Generator입니다.


난수발생기라고도 하는데, 


임의의 수를 만들어 주는 역할을 합니다.





main.c


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
int main(void)
{
    uint32_t err_code;
    const app_uart_comm_params_t comm_params =
      {
          RX_PIN_NUMBER,
          TX_PIN_NUMBER,
          RTS_PIN_NUMBER,
          CTS_PIN_NUMBER,
          APP_UART_FLOW_CONTROL_ENABLED,
          false,
          UART_BAUDRATE_BAUDRATE_Baud38400
      };
 
    APP_UART_FIFO_INIT(&comm_params,
                         UART_RX_BUF_SIZE,
                         UART_TX_BUF_SIZE,
                         uart_error_handle,
                         APP_IRQ_PRIORITY_LOW,
                         err_code);
 
    APP_ERROR_CHECK(err_code);
 
#ifdef SOFTDEVICE_PRESENT
    SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, false);
#endif // SOFTDEVICE_PRESENT
 
    err_code = nrf_drv_rng_init(NULL);
    APP_ERROR_CHECK(err_code);
   
    while (true)
    {
        uint8_t p_buff[RANDOM_BUFF_SIZE];
        uint8_t length = random_vector_generate(p_buff,RANDOM_BUFF_SIZE);
        printf("Random Vector:");
        for(uint8_t i = 0; i < length; i++)
        {
            printf(" %3d",(int)p_buff[i]);
        }
        printf("\n\r");
        nrf_delay_ms(100);
    }
}
cs


Line  3~22 : 앞에서도 많이나왔던 UART 초기화하는 부분입니다.


Line 24~26 : softdevice를 쓰지않으므로 넘어갑니다.


Line 28~29 : rng 초기화 부분입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
ret_code_t nrf_drv_rng_init(nrf_drv_rng_config_t const * p_config)
{
    uint32_t result;
 
    if (m_rng_cb.state == NRF_DRV_STATE_UNINITIALIZED)
    {
#ifndef SOFTDEVICE_PRESENT
 
        result = app_fifo_init(&m_rng_cb.rand_pool, m_rng_cb.buffer, RNG_CONFIG_POOL_SIZE);
 
        if (p_config == NULL)
        {
            p_config = &m_default_config;
        }
 
        if (result == NRF_SUCCESS)
        {
            if (p_config->error_correction)
            {
                nrf_rng_error_correction_enable();
            }
 
            nrf_drv_common_irq_enable(RNG_IRQn, p_config->interrupt_priority);
 
            nrf_rng_shorts_clear(NRF_RNG_SHORTS_VALRDY_STOP_MASK);
 
            rng_start();
            m_rng_cb.state = NRF_DRV_STATE_INITIALIZED;
        }
#else
        UNUSED_VARIABLE(p_config);
        uint8_t softdevice_is_enabled;
        result = sd_softdevice_is_enabled(&softdevice_is_enabled);
 
        if (softdevice_is_enabled)
        {
            m_rng_cb.state = NRF_DRV_STATE_INITIALIZED;
        }
        else
        {
            result = NRF_ERROR_SOFTDEVICE_NOT_ENABLED;
        }
#endif // SOFTDEVICE_PRESENT
    }
    else
    {
        result = NRF_ERROR_INVALID_STATE;
    }
    return result;
}
cs


처음 초기화 하고, softdevice를 안쓰므로 9~28까지만 실행되고, 49에서 return됩니다.


9 : app_fifo초기화 합니다. app_fifo_init(app_fifo,buffer,buffer size)


11~14 : config값이 null이므로 기본 default값으로 설정됩니다.


18~21 : digital error correction이 true이므로 enable시킵니다.


23 : rng의 interrupt를 사용합니다.


25 : shortcut은 disable합니다.


27 : 난수발생기를 실행합니다.


28 : 난수발생기의 상태를 설정합니다.(초기화상태)


Line 33 : 발생할 난수를 저장할 버퍼설정 8bit배열로


Line 34 : 난수를 발생시켜 배열버퍼에 저장합니다.


1
2
3
4
5
6
7
8
9
10
11
uint8_t random_vector_generate(uint8_t * p_buff, uint8_t size)
{
    uint8_t available;
    uint32_t err_code;
    err_code = nrf_drv_rng_bytes_available(&available);
    APP_ERROR_CHECK(err_code);
    uint8_t length = (size<available) ? size : available;
    err_code = nrf_drv_rng_rand(p_buff,length);
    APP_ERROR_CHECK(err_code);
    return length;
}
cs


5~7 : 난수발생기에 사용할 배열크기만큰 사용가능여부를 확인한 후 배열 크기설정 


8~9 : 난수발생을 시켜 배열에 저장합니다.


Line 35~41 : Uart로 뿌려준 후 100ms를 기다리고, Line 31~42를 반복합니다.



이런식으로 계속해서 생성됩니다.

반응형

'Study > nRF51xxx(BLE)' 카테고리의 다른 글

nRF51 DK 예제 15 -TEMPERATURE  (0) 2015.03.12
nRF51 DK 예제 14 -Real Time Counter(RTC)  (0) 2015.03.12
nRF51 DK 예제 12 - ram retention  (0) 2015.03.12
nRF51 SDK 업데이트  (0) 2015.03.09
nRF51 DK 예제 11 - radiotest (2)  (2) 2015.03.06

인기글