1 #ifndef __SWM341_CORDIC_H__
2 #define __SWM341_CORDIC_H__
3 
4 #define CORDIC_PI   3.141592653589793
5 
6 void CORDIC_Init(CORDIC_TypeDef * CORDICx);
7 
8 
9 /******************************************************************************************************************************************
10 * 函数名称: CORDIC_Sin()
11 * 功能说明: 使用CORDIC模块计算sin
12 * 输    入: uint32_t radian       要计算sin值的角度,以弧度为单位,取值范围0.01~1.56;但需要将弧度值乘以16384作为参数调用此函数
13 * 输    出: 无
14 * 注意事项: 需要将弧度值乘以16384作为参数调用此函数
15 ******************************************************************************************************************************************/
CORDIC_Sin(uint32_t radian)16 static __INLINE void CORDIC_Sin(uint32_t radian)
17 {
18     CORDIC->INPUT = radian;
19 
20     CORDIC->CMD = (1 << CORDIC_CMD_START_Pos) | (1 << CORDIC_CMD_SINCOS_Pos);
21 }
22 
23 /******************************************************************************************************************************************
24 * 函数名称: CORDIC_Sin_IsDone()
25 * 功能说明: CORDIC模块sin运算是否完成
26 * 输    入: 无
27 * 输    出: uint32_t      0 sin运算未完成    1 sin运算已完成,可取出运算结果
28 * 注意事项:
29 ******************************************************************************************************************************************/
CORDIC_Sin_IsDone(void)30 static __INLINE uint32_t CORDIC_Sin_IsDone(void)
31 {
32     return (CORDIC->SIN & CORDIC_SIN_DONE_Msk) ? 1 : 0;
33 }
34 
35 /******************************************************************************************************************************************
36 * 函数名称: CORDIC_Sin_Result()
37 * 功能说明: 取出CORDIC模块sin运算结果
38 * 输    入: 无
39 * 输    出: uint32_t      sin运算结果,Result[15:14]表示整数部分,Result[13:0]表示小数部分
40 * 注意事项: 无
41 ******************************************************************************************************************************************/
CORDIC_Sin_Result(void)42 static __INLINE uint32_t CORDIC_Sin_Result(void)
43 {
44     return CORDIC->SIN & (CORDIC_SIN_F_Msk | CORDIC_SIN_I_Msk);
45 }
46 
47 /******************************************************************************************************************************************
48 * 函数名称: CORDIC_Cos()
49 * 功能说明: 使用CORDIC模块计算cos
50 * 输    入: uint32_t radian       要计算cos值的角度,以弧度为单位,取值范围0.01~1.56;但需要将弧度值乘以16384作为参数调用此函数
51 * 输    出: 无
52 * 注意事项: 需要将弧度值乘以16384作为参数调用此函数
53 ******************************************************************************************************************************************/
CORDIC_Cos(uint32_t radian)54 static __INLINE void CORDIC_Cos(uint32_t radian)
55 {
56     CORDIC->INPUT = radian;
57 
58     CORDIC->CMD = (1 << CORDIC_CMD_START_Pos) | (1 << CORDIC_CMD_SINCOS_Pos);
59 }
60 
61 /******************************************************************************************************************************************
62 * 函数名称: CORDIC_Cos_IsDone()
63 * 功能说明: CORDIC模块cos运算是否完成
64 * 输    入: 无
65 * 输    出: uint32_t      0 cos运算未完成    1 cos运算已完成,可取出运算结果
66 * 注意事项:
67 ******************************************************************************************************************************************/
CORDIC_Cos_IsDone(void)68 static __INLINE uint32_t CORDIC_Cos_IsDone(void)
69 {
70     return (CORDIC->COS & CORDIC_COS_DONE_Msk) ? 1 : 0;
71 }
72 
73 /******************************************************************************************************************************************
74 * 函数名称: CORDIC_Cos_Result()
75 * 功能说明: 取出CORDIC模块cos运算结果
76 * 输    入: 无
77 * 输    出: uint32_t      cos运算结果,Result[15:14]表示整数部分,Result[13:0]表示小数部分
78 * 注意事项: 无
79 ******************************************************************************************************************************************/
CORDIC_Cos_Result(void)80 static __INLINE uint32_t CORDIC_Cos_Result(void)
81 {
82     return CORDIC->COS & (CORDIC_COS_F_Msk | CORDIC_COS_I_Msk);
83 }
84 
85 /******************************************************************************************************************************************
86 * 函数名称: CORDIC_Arctan()
87 * 功能说明: 使用CORDIC模块计算arctan
88 * 输    入: uint32_t input        取值范围0.05~10000,但需要将其乘以16384作为参数调用此函数
89 * 输    出: 无
90 * 注意事项: 需要将待计算值乘以16384作为参数调用此函数
91 ******************************************************************************************************************************************/
CORDIC_Arctan(uint32_t input)92 static __INLINE void CORDIC_Arctan(uint32_t input)
93 {
94     if((input > 819) && (input <= 8192))
95     {
96         CORDIC->INPUT = input * 2;
97 
98         CORDIC->CMD = (1 << CORDIC_CMD_START_Pos) | (0 << CORDIC_CMD_SINCOS_Pos) | (0 << CORDIC_CMD_RANGE_Pos);
99     }
100     else if((input > 8192) && (input <= 32768))
101     {
102         CORDIC->INPUT = input;
103 
104         CORDIC->CMD = (1 << CORDIC_CMD_START_Pos) | (0 << CORDIC_CMD_SINCOS_Pos) | (1 << CORDIC_CMD_RANGE_Pos);
105     }
106     else if((input > 32768) && (input < 10000*16384))
107     {
108         CORDIC->INPUT = 32768*16384/input;
109 
110         CORDIC->CMD = (1 << CORDIC_CMD_START_Pos) | (0 << CORDIC_CMD_SINCOS_Pos) | (2 << CORDIC_CMD_RANGE_Pos);
111     }
112 }
113 
114 /******************************************************************************************************************************************
115 * 函数名称: CORDIC_Arctan_IsDone()
116 * 功能说明: CORDIC模块arctan运算是否完成
117 * 输    入: 无
118 * 输    出: uint32_t      0 arctan运算未完成    1 arctan运算已完成,可取出运算结果
119 * 注意事项:
120 ******************************************************************************************************************************************/
CORDIC_Arctan_IsDone(void)121 static __INLINE uint32_t CORDIC_Arctan_IsDone(void)
122 {
123     return (CORDIC->ARCTAN & CORDIC_ARCTAN_DONE_Msk) ? 1 : 0;
124 }
125 
126 /******************************************************************************************************************************************
127 * 函数名称: CORDIC_Arctan_Result()
128 * 功能说明: 取出CORDIC模块arctan运算结果
129 * 输    入: 无
130 * 输    出: uint32_t      arctan运算结果,为弧度值,Result[15:14]表示整数部分,Result[13:0]表示小数部分
131 * 注意事项: 无
132 ******************************************************************************************************************************************/
CORDIC_Arctan_Result(void)133 static __INLINE uint32_t CORDIC_Arctan_Result(void)
134 {
135     return CORDIC->ARCTAN & (CORDIC_ARCTAN_F_Msk | CORDIC_ARCTAN_I_Msk);
136 }
137 
138 /******************************************************************************************************************************************
139 * 函数名称: CORDIC_Mul()
140 * 功能说明: 使用CORDIC模块计算乘法
141 * 输    入: uint16_t mul1 乘数1
142 *           uint16_t mul2   乘数2
143 * 输    出: 无
144 * 注意事项: 需要将乘数乘以16384作为参数调用此函数
145 ******************************************************************************************************************************************/
CORDIC_Mul(uint16_t mul1,uint16_t mul2)146 static __INLINE void CORDIC_Mul(uint16_t mul1, uint16_t mul2)
147 {
148     CORDIC->INPUT = mul1 | (mul2 << 16);
149 
150     CORDIC->CMD = (1 << CORDIC_CMD_START_Pos) | (3 << CORDIC_CMD_MULDIV_Pos);
151 }
152 
153 /******************************************************************************************************************************************
154 * 函数名称: CORDIC_Mul_IsDone()
155 * 功能说明: CORDIC模块乘法运算是否完成
156 * 输    入: 无
157 * 输    出: uint32_t      0 乘法运算未完成    1 乘法运算已完成,可取出运算结果
158 * 注意事项: 无
159 ******************************************************************************************************************************************/
CORDIC_Mul_IsDone(void)160 static __INLINE uint32_t CORDIC_Mul_IsDone(void)
161 {
162     return (CORDIC->SIN & CORDIC_SIN_DONE_Msk) ? 1 : 0;
163 }
164 
165 /******************************************************************************************************************************************
166 * 函数名称: CORDIC_Mul_Result()
167 * 功能说明: 取出CORDIC模块乘法运算结果
168 * 输    入: 无
169 * 输    出: uint32_t      乘法运算结果,Result[15:14]表示整数部分,Result[13:0]表示小数部分
170 * 注意事项: 无
171 ******************************************************************************************************************************************/
CORDIC_Mul_Result(void)172 static __INLINE uint32_t CORDIC_Mul_Result(void)
173 {
174     return CORDIC->SIN & (CORDIC_SIN_F_Msk | CORDIC_SIN_I_Msk);
175 }
176 
177 /******************************************************************************************************************************************
178 * 函数名称: CORDIC_Div()
179 * 功能说明: 使用CORDIC模块计算除法
180 * 输    入: uint16_t dividend 被除数
181 *           uint16_t divisor    除数
182 * 输    出: 无
183 * 注意事项: 需要将除数和被除数值乘以16384作为参数调用此函数
184 ******************************************************************************************************************************************/
CORDIC_Div(uint16_t dividend,uint16_t divisor)185 static __INLINE void CORDIC_Div(uint16_t dividend, uint16_t divisor)
186 {
187     CORDIC->INPUT = divisor | (dividend << 16);
188 
189     CORDIC->CMD = (1 << CORDIC_CMD_START_Pos) | (2 << CORDIC_CMD_MULDIV_Pos);
190 }
191 
192 /******************************************************************************************************************************************
193 * 函数名称: CORDIC_Div_IsDone()
194 * 功能说明: CORDIC模块除法运算是否完成
195 * 输    入: 无
196 * 输    出: uint32_t      0 除法运算未完成    1 除法运算已完成,可取出运算结果
197 * 注意事项:
198 ******************************************************************************************************************************************/
CORDIC_Div_IsDone(void)199 static __INLINE uint32_t CORDIC_Div_IsDone(void)
200 {
201     return (CORDIC->ARCTAN & CORDIC_ARCTAN_DONE_Msk) ? 1 : 0;
202 }
203 
204 /******************************************************************************************************************************************
205 * 函数名称: CORDIC_Div_Result()
206 * 功能说明: 取出CORDIC模块除法运算结果
207 * 输    入: 无
208 * 输    出: uint32_t      除法运算结果,为弧度值,Result[15:14]表示整数部分,Result[13:0]表示小数部分
209 * 注意事项: 无
210 ******************************************************************************************************************************************/
CORDIC_Div_Result(void)211 static __INLINE uint32_t CORDIC_Div_Result(void)
212 {
213     return CORDIC->ARCTAN & (CORDIC_ARCTAN_F_Msk | CORDIC_ARCTAN_I_Msk);
214 }
215 
216 #endif //__SWM341_CORDIC_H__
217