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);
}
|