반응형
이번 예제는 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 |