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

nRF51 DK 예제 12 - ram retention

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


RAM Retention 예제입니다.


이 예제는 ram retention module을 사용하거나 


인증하는 방법에 대해 알아보는 예제라고 합니다.


먼저 main을 보시겠습니다.





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
int main(void)
{
    uint32_t * volatile p_ram_test = (uint32_t *)RAM_MEMORY_TEST_ADDRESS;
    uint32_t            loop_count = 0;
 
    LEDS_CONFIGURE(LEDS_MASK);
    LEDS_OFF(LEDS_MASK);
 
    nrf_gpio_cfg_sense_input(PIN_GPIO_WAKEUP, BUTTON_PULL, NRF_GPIO_PIN_SENSE_LOW);
   
    nrf_delay_ms(1);
 
    if ((NRF_POWER->GPREGRET >> 4== RESET_MEMORY_TEST_BYTE)
    {
        loop_count          = (uint8_t)(NRF_POWER->GPREGRET & 0xFUL);
        NRF_POWER->GPREGRET = 0;
 
        if (loop_count >= (uint8_t)MAX_TEST_ITERATIONS)
        {
            NRF_POWER->GPREGRET = 0;
            LEDS_ON(1 << SUCCESS_PIN_NUMBER);
 
            while (true)
            {
                // Do nothing.
            }
        }
 
        if (*p_ram_test != RAM_MEMORY_TEST_WORD)
        {
            display_failure();
        }
 
        *p_ram_test = 0;
    }
 
    loop_count++;
    NRF_POWER->GPREGRET = ( (RESET_MEMORY_TEST_BYTE << 4| loop_count);
 
    LEDS_ON(1 << READY_PIN_NUMBER);
    nrf_delay_ms(1000);
 
    NRF_POWER->RAMON |= (POWER_RAMON_OFFRAM0_RAM0On << POWER_RAMON_OFFRAM0_Pos) |
                        (POWER_RAMON_OFFRAM1_RAM1On << POWER_RAMON_OFFRAM1_Pos);
 
    *p_ram_test = RAM_MEMORY_TEST_WORD;
    LEDS_OFF(LEDS_MASK);
    NRF_POWER->SYSTEMOFF = 0x1;
 
    display_failure();
}
cs


Line 3 : RAM test를 할 주소를 넣어줍니다.


Line 4 : loop_count 값을 초기합니다.


Line 6~7 : LED를 초기화한 후 모두 꺼줍니다.


Line 9~11 : SYSTEM OFF MODE에서 깨울 하드웨어 키를 설정합니다.


Line 13~35 : SYSTEM OFF MODE에서 깨어나면 들어가게 될 부분입니다.(밑에서 다시 설명~)


Line 37 : loop_count를 +1해줍니다.


Line 38 : RETENTION REGISTER에 임의의 reset test값을 4비트 왼쪽시프트 시킨후 loop_count값을 더해줍니다. 0xD<<4|1=0xD1이 됩니다.


Line 40 ~41: LED 1을 1초동안 켭니다.


Line 43~44 : Ramblock 0과 1을 power off 시에도 켜지게 합니다.


(위에서 설정한 GPREGRET와 p_ram_test값이 초기화 되지 않도록 하는 것 같습니다.



Line 46 : p_ram_test 주소에 임의의 값 0xD를 넣어줍니다.


Line 47 : 설정이 다되었고 LED를 꺼줍니다.


Line 48 : SYSTEM OFF MODE로 진입합니다.


Line 50 : 설정한 display_failure(LED 모두 켜짐)를 해줍니다.


1
2
3
4
5
6
7
8
9
10
static void display_failure(void)
{
    LEDS_ON(LEDS_MASK);
 
    // Loop forever.
    while (true)
    {
        // Do nothing.
    }
}
cs


이제 LED가 모두 켜지고, SYSTEM도 OFF모드가 되었습니다.


SYSTEM OFF모드가 되면 모든동작이 멈추고, system off를 깨울 GPIO peripheral이나 reset키만 먹히게 됩니다.


아까 설정한 Key 1을 눌러보면 Line 1부터 다시 실행이 됩니다.


그리고 Line 13에서 설정한 GPREGRET>>4=0xD1>>4=0xD 즉 설정한 임의의 값 0xD가 됩니다.


Line 15 :loop_count도 0xD1&0xF=1이되어 SYSTEM OFF전의 loop_count값을 다시 갖게 됩니다.


Line 16 : SYSTEM이 복구되었으므로 GPREGRET를 초기화 합니다.


Line 18 : loop_count>=MAX_TEST_ITERATIONS=1>=1이되어 if문이 실행되고,


Line 20 : GPREGRET를 다시 초기화


Line 21 : SYSTEM이 성공적으로 살아놨다고, LED 2를 켜줍니다.


Line 23~26 : 실행할 코드를 넣으면 됩니다.


만약 Line 18에서 만족을 못하면 Line 29~34가 실행됩니다. 





반응형

인기글