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

nRF51 DK 예제 15 -TEMPERATURE

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





이번 예제는 온도센서에 대한 예제입니다.








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
int main(void)
{
   int32_t volatile temp;
 
    nrf_temp_init();
    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);
 
    while (true)
    {
        NRF_TEMP->TASKS_START = 1/** Start the temperature measurement. */
 
        while (NRF_TEMP->EVENTS_DATARDY == 0)
        {
            // Do nothing.
        }
        NRF_TEMP->EVENTS_DATARDY = 0;
 
        temp = (nrf_temp_read() / 4);
 
        NRF_TEMP->TASKS_STOP = 1/** Stop the temperature measurement. */
 
        printf("Actual temperature: %d\n\r", (int)temp);
        nrf_delay_ms(500);
    }
}
cs


Line 5 : 온도센서 초기화하는 부분입니다.


1
2
3
4
static __INLINE void nrf_temp_init(void)
{
    *(uint32_t *0x4000C504 = 0;
}
cs


0x4000C000 번지는 온도센서의 기본 레지스터주소입니다.



그리고 뒤의 0x504번지는 Configuration register네요.



온도센서의 Configuration register를 0으로 설정하면 Read only access 가 됩니다.


Line 6~26 : uart를 설정합니다.


Line 30 : 온도센서를 동작시킵니다.


Line 32~36 : 온도값이 검출되기를 기다려 검출되면 다시 DataReady를 초기화합니다.


온도가 검출되면 DATARDY(data ready)가 1로 변합니다.


Line 38 : 온도값이 검출되었으니 TEMP에서 값을 읽어들입니다.


1
2
3
4
5
6
7
#define MASK_SIGN           (0x00000200UL)
#define MASK_SIGN_EXTENSION (0xFFFFFC00UL)
 
static __INLINE int32_t nrf_temp_read(void)
{    
   return ((NRF_TEMP->TEMP & MASK_SIGN) != 0) ? (NRF_TEMP->TEMP | MASK_SIGN_EXTENSION) : (NRF_TEMP->TEMP);    
}
cs


읽어들인 값을 MASK_SIGN(0x200)과 '&'연산을 해서 


0이 아니면 TEMP값에 0xFFFFFC00을 더해줍니다.


그리고 0이라면 값을 그대로 읽어들입니다.


이렇게 하는 이유는 2의 보수로 읽어들여서 그런것 같습니다.


읽어들인 값은 리턴되어  4로 나뉘어 집니다.


Line 40 : 온도센서를 작동 중지시킵니다.


Line 42 : 연산한 온도값을 UART로 뿌려줍니다.




중간에 칩을 손으로 만졌더니 온도가 올라갔네요^^

반응형

인기글