이번 예제는 uart로 char형 문자 하나를 입력 받아 flash에 써주고, 써넣은걸 읽어오는 예제입니다.
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | int main(void) { uint32_t * addr; uint8_t patwr; uint8_t patrd; uint8_t patold; uint32_t i; uint32_t pg_size; uint32_t pg_num; uint32_t err_code; APP_GPIOTE_INIT(1); 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); printf("Flashwrite example\n"); patold = 0; pg_size = NRF_FICR->CODEPAGESIZE; pg_num = NRF_FICR->CODESIZE - 1; // Use last page in flash while (true) { // Start address: addr = (uint32_t *)(pg_size * pg_num); // Erase page: flash_page_erase(addr); i = 0; do { printf("Enter char to write to flash\n\r"); // Read char from uart, and write it to flash: do { err_code = app_uart_get(&patwr); } while(err_code == NRF_ERROR_NOT_FOUND); if (patold != patwr) { patold = patwr; flash_word_write(++addr, (uint32_t)patwr); i += 4; printf("'%c' was write to flash\n\r", patwr); } // Read pattern from flash and send it back: patrd = (uint8_t)*addr; printf("'%c' was read from flash\n\r\n\r", patrd); } while (i < pg_size); } } | cs |
먼저 main.c의 main함수입니다.
Line 3~9 : flash메모리 제어를 하며 쓸 변수들입니다.
addr - 사용할 flash메모리 영역입니다.
patwr - uart로 읽어와 flash로 적어넣을 변수값입니다.
patrd - flash에서 읽어와 uart로 뿌릴 변수값입니다.
patold - flash에 적힌값 중복비교용 변수입니다.
i - flash에 쓰는 변수의 영역(밑에 코드에서 자세히 설명)
pg_size - 페이지 크기
pg_num - 페이지 번호
Line 12 : GPIOTE 초기화부분이네요.
Line 13~22 : uart설정을 위한 구조체 변수값입니다.
Line 24~29 : uart fifo 방식으로 초기화
Line 33 : printf로 uart에 뿌려줍니다.
Line 34 : 중복방지를 위한 변수 patold를 0으로 초기화
Line 35 : pg_size에 실제 페이지 사이즈값을 넣습니다.
Line 36 : pg_num에 제일 마지막 페이지번호값을 넣습니다.
Line 41 : addr에 위에서 구한 pg_size와 pg_num을 곱해서 flash에 쓸 주소값을 넣어줍니다.
Line 43 : 위의 addr영역을 지워줍니다.
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 | static void flash_page_erase(uint32_t * page_address) { // Turn on flash erase enable and wait until the NVMC is ready: NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Een << NVMC_CONFIG_WEN_Pos); while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { // Do nothing. } // Erase page: NRF_NVMC->ERASEPAGE = (uint32_t)page_address; while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { // Do nothing. } // Turn off flash erase enable and wait until the NVMC is ready: NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos); while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { // Do nothing. } } | cs |
Line 44 : i값을 0으로 초기화 합니다. 이 값은 flash에 쓸 때마다 증가합니다.
Line 48~55 : uart로 flash에 write할 값을 입력받습니다. error가 없는 한 계속 입력을 기다립니다.
Line 57~63 : 바로 전에 입력한 값과 다르거나 처음 입력한다면, 이 if문이 실행됩니다.
flash에 입력 받은 값을 write하고 i값을 4증가시킵니다.
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 | static void flash_word_write(uint32_t * address, uint32_t value) { // Turn on flash write enable and wait until the NVMC is ready: NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos); while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { // Do nothing. } *address = value; while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { // Do nothing. } // Turn off flash write enable and wait until the NVMC is ready: NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos); while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { // Do nothing. } } | cs |
Line 65~66 : flash에서 바로 전에 write된 값을 읽어와 uart로 출력합니다.
Line 68 : flash에 write하고 증가된 i값이 페이지크기보다 작으면 Line 46~67이 계속 실행되고, 넘게 되면, Line 41부터 다시 초기화 됩니다.
아래는 실행한 모습입니다.
처음 'A'를 입력하면 flash에 write한 후 읽어옵니다.
두번째 'B'를 입력하면, 'A'와 다른 값이므로 write한 후 읽어옵니다.
세번째 'B'를 재입력하면, 그 전과 동일한 값이므로 write는 하지않고 read만 하게됩니다.
'Study > nRF51xxx(BLE)' 카테고리의 다른 글
nRF51 DK 예제 6 -Radio Transmitter (0) | 2015.03.03 |
---|---|
nRF51 DK 예제 5 -GPIOTE (0) | 2015.03.02 |
nRF51 DK 예제3 bsp (0) | 2015.02.27 |
nRF51 DK 예제 2 LED blinky_rtx (0) | 2015.02.26 |
nRF51 DK 예제 1 LED blinky (2) | 2015.02.26 |