summaryrefslogtreecommitdiffstats
path: root/humidity_sensors/app/awu.c
blob: dc7ea9fff19392292baa25617a07b3433b3c6f52 (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
#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);
}