summaryrefslogtreecommitdiff
path: root/bsp/es32f0334/libraries/ES32F033x_ALD_StdPeriph_Driver/Source/ald_calc.c
blob: 5cbb23c38364c0b43d900dd7c2319851bb51fcee (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/**
  *********************************************************************************
  *
  * @file    ald_calc.c
  * @brief   CALC module driver.
  *
  * @version V1.0
  * @date    04 Dec 2017
  * @author  AE Team
  * @note
  *
  * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved.
  *
  *********************************************************************************
  */

#include "ald_calc.h"


/** @addtogroup ES32FXXX_ALD
  * @{
  */

/** @defgroup CALC CALC
  * @brief CALC module driver
  * @{
  */
#ifdef ALD_CALC

/** @defgroup CALC_Public_Functions CALC Public Functions
  * @brief    Accelerating calculate functions
  *
  * @verbatim
  ==============================================================================
              ##### Accelerating calculate functions #####
  ==============================================================================
    [..]  This section provides functions allowing to:
      (+) Square root operation.
      (+) Division.
      (+) Get DZ flag.

    @endverbatim
  * @{
  */

/**
  * @brief  Square root operation.
  * @param  data: The data;
  * @retval The value of square root.
  */
uint32_t calc_sqrt(uint32_t data)
{
	WRITE_REG(CALC->RDCND, data);
	while (READ_BIT(CALC->SQRTSR, CALC_SQRTSR_BUSY_MSK));

	return READ_REG(CALC->SQRTRES);
}

/**
  * @brief  Calculating division.
  * @param  dividend: The value of the dividend.
  * @param  divisor: The value of the divisor.
  * @param  remainder: The value of the remainder.
  * @retval The result of division.
  */
uint32_t calc_div(uint32_t dividend, uint32_t divisor, uint32_t *remainder)
{
	CLEAR_BIT(CALC->DIVCSR, CALC_DIVCSR_SIGN_MSK);
	SET_BIT(CALC->DIVCSR, CALC_DIVCSR_TRM_MSK);
	WRITE_REG(CALC->DIVDR, dividend);
	WRITE_REG(CALC->DIVSR, divisor);

	while (READ_BIT(CALC->DIVCSR, CALC_DIVCSR_BUSY_MSK));

	*remainder = READ_REG(CALC->DIVRR);
	return READ_REG(CALC->DIVQR);
}

/**
  * @brief  Calculating division.
  * @param  dividend: The value of the dividend.
  * @param  divisor: The value of the divisor.
  * @param  remainder: The value of the remainder.
  * @retval The result of division.
  */
int32_t calc_div_sign(int32_t dividend, int32_t divisor, int32_t *remainder)
{
	SET_BIT(CALC->DIVCSR, CALC_DIVCSR_SIGN_MSK);
	SET_BIT(CALC->DIVCSR, CALC_DIVCSR_TRM_MSK);
	WRITE_REG(CALC->DIVDR, dividend);
	WRITE_REG(CALC->DIVSR, divisor);

	while (READ_BIT(CALC->DIVCSR, CALC_DIVCSR_BUSY_MSK));

	*remainder = READ_REG(CALC->DIVRR);
	return READ_REG(CALC->DIVQR);
}

/**
  * @brief  Get the flag of divisor is zero.
  * @retval The status, SET/RESET.
  */
flag_status_t calc_get_dz_status(void)
{
	if (READ_BIT(CALC->DIVCSR, CALC_DIVCSR_DZ_MSK))
		return SET;

	return RESET;
}

/**
  * @}
  */
#endif /* ALD_CALC */
/**
  * @}
  */

/**
  * @}
  */