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

nRF51 DK 예제4 flashwrite

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

 

번 예제는 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

인기글