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)16static __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)30static __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)42static __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)54static __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)68static __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)80static __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)92static __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)121static __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)133static __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)146static __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)160static __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)172static __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)185static __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)199static __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)211static __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