summaryrefslogtreecommitdiffstats
path: root/humidity_sensors/app/awu.c
blob: 18cf1f8d031f4a2bf7e889d85527be55b3e1c603 (plain)
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
#include "project.h"

/** Contains the different values to write in the APR register (used by AWU_Init function) */
CONST uint8_t APR_Array[17] =
    {
        0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 61, 23, 23, 62
    };

/** Contains the different values to write in the TBR register (used by AWU_Init function) */
CONST uint8_t TBR_Array[17] =
    {
        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 12, 14, 15, 15
    };


FlagStatus AWU_GetFlagStatus(void)
{
  return((FlagStatus)(((uint8_t)(AWU->CSR & AWU_CSR_AWUF) == (uint8_t)0x00) ? RESET : SET));
}


INTERRUPT_HANDLER (AWU_IRQHandler, 1)
{
  AWU_GetFlagStatus();
}


void AWU_Init(AWU_Timebase_TypeDef AWU_TimeBase)
{
  /* Enable the AWU peripheral */
  AWU->CSR |= AWU_CSR_AWUEN;
  
  /* Set the TimeBase */
  AWU->TBR &= (uint8_t)(~AWU_TBR_AWUTB);
  AWU->TBR |= TBR_Array[(uint8_t)AWU_TimeBase];
  
  /* Set the APR divider */
  AWU->APR &= (uint8_t)(~AWU_APR_APR);
  AWU->APR |= APR_Array[(uint8_t)AWU_TimeBase];
}


void AWU_LSICalibrationConfig(uint16_t lsifreqkhz)
{
  uint16_t A = 0x0;
  
  
  /* Calculation of AWU calibration value */
  
  A = (uint16_t)(lsifreqkhz >> 2U); /* Division by 4, keep integer part only */
  
  if ((4U * A) >= ((lsifreqkhz - (4U * A)) * (1U + (2U * A))))
  {
    AWU->APR = (uint8_t)(A - 2U);
  }
  else
  {
    AWU->APR = (uint8_t)(A - 1U);
  }
}


void awu_init(void)
{

    AWU_LSICalibrationConfig(128);
    AWU_Init(AWU_TIMEBASE_1S);
}