1 /******************************************************************************
2 * Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
3 *
4 * This software is owned and published by:
5 * Huada Semiconductor Co.,Ltd ("HDSC").
6 *
7 * BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
8 * BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
9 *
10 * This software contains source code for use with HDSC
11 * components. This software is licensed by HDSC to be adapted only
12 * for use in systems utilizing HDSC components. HDSC shall not be
13 * responsible for misuse or illegal use of this software for devices not
14 * supported herein. HDSC is providing this software "AS IS" and will
15 * not be responsible for issues arising from incorrect user implementation
16 * of the software.
17 *
18 * Disclaimer:
19 * HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
20 * REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
21 * ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
22 * WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
23 * WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
24 * WARRANTY OF NONINFRINGEMENT.
25 * HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
26 * NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
27 * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
28 * LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
29 * INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
30 * INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
31 * SAVINGS OR PROFITS,
32 * EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
33 * YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
34 * INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
35 * FROM, THE SOFTWARE.
36 *
37 * This software may be replicated in part or whole for the licensed use,
38 * with the restriction that this Disclaimer and Copyright notice must be
39 * included with each copy of this software, whether used in part or whole,
40 * at all times.
41 */
42 /******************************************************************************/
43 /** \file pca.c
44 **
45 ** pca driver API.
46 ** @link pcnt Group Some description @endlink
47 **
48 ** - 2019-04-09 First Version
49 **
50 ******************************************************************************/
51
52 /******************************************************************************
53 * Include files
54 ******************************************************************************/
55 #include "hc32l196_pca.h"
56
57 /**
58 ******************************************************************************
59 ** \addtogroup PCNTGroup
60 ******************************************************************************/
61 //@{
62
63 /******************************************************************************
64 * Local pre-processor symbols/macros ('#define')
65 ******************************************************************************/
66
67 /******************************************************************************
68 * Global variable definitions (declared in header file with 'extern')
69 ******************************************************************************/
70
71
72 /******************************************************************************
73 * Local type definitions ('typedef')
74 ******************************************************************************/
75
76 /******************************************************************************
77 * Local function prototypes ('static')
78 ******************************************************************************/
79
80 /******************************************************************************
81 * Local variable definitions ('static')
82 ******************************************************************************/
83
84 /**
85 ******************************************************************************
86 ** \brief 获取中断源的标志位
87 ** @param IT_Src : 中断源标志位
88 ** \retval FALSE 或TRUE
89 **
90 ******************************************************************************/
Pca_GetItStatus(en_pca_ccficlr_t It_Src)91 boolean_t Pca_GetItStatus(en_pca_ccficlr_t It_Src)
92 {
93 return (((M0P_PCA->CCON)>>It_Src) & 1) > 0? TRUE : FALSE;
94 }
95
96 /**
97 ******************************************************************************
98 ** \brief 清除中断源的标志位
99 ** @param IT_Src : 中断源标志位
100 ** \retval 无
101 **
102 ******************************************************************************/
Pca_ClrItStatus(en_pca_ccficlr_t It_Src)103 void Pca_ClrItStatus(en_pca_ccficlr_t It_Src)
104 {
105 M0P_PCA->ICLR &= ~(uint32_t)(1<<It_Src);
106 }
107
108 /**
109 ******************************************************************************
110 ** \brief PCA 计数器运行控制 PCA_CCON CR控制位
111 ** @param NewStatus : TRUE 或 FALSE
112 ** \retval 无
113 **
114 ******************************************************************************/
Pca_StartPca(boolean_t NewStatus)115 void Pca_StartPca(boolean_t NewStatus)
116 {
117 SetBit((uint32_t)(&(M0P_PCA->CCON)), 6, NewStatus);
118 }
119
120 /**
121 ******************************************************************************
122 ** \brief PCA 空闲模式IDLE下,PCA是否停止工作设置
123 ** @param NewStatus : TRUE 或 FALSE
124 ** \retval 无
125 **
126 ******************************************************************************/
Pca_SetCidl(boolean_t NewStatus)127 void Pca_SetCidl(boolean_t NewStatus)
128 {
129 SetBit((uint32_t)(&(M0P_PCA->CMOD)), 7, NewStatus);
130 }
131
132 /**
133 ******************************************************************************
134 ** \brief PCA 模块4的看门狗使能控制
135 ** @param NewStatus : TRUE 或 FALSE
136 ** \retval 无
137 **
138 ******************************************************************************/
Pca_Set4Wdte(boolean_t NewStatus)139 void Pca_Set4Wdte(boolean_t NewStatus)
140 {
141 SetBit((uint32_t)(&(M0P_PCA->CMOD)), 6, NewStatus);
142 }
143
144 /**
145 ******************************************************************************
146 ** \brief PCA 计数器中断控制PCA_CMOD中CFIE,对应的控制中断位PCA_CCON中的CF与PCA_ICLR中的CF
147 ** @param NewStatus : TRUE 或 FALSE
148 ** \retval 无
149 **
150 ******************************************************************************/
Pca_ConfPcaIt(boolean_t NewStatus)151 void Pca_ConfPcaIt(boolean_t NewStatus)
152 {
153 SetBit((uint32_t)(&(M0P_PCA->CMOD)), 0, NewStatus);
154 }
155
156 /**
157 ******************************************************************************
158 ** \brief PCA 比较捕获中断使能控制 PCA_CCAPMx的CCIE
159 ** @param Modulex : pca_module0~4
160 ** @param NewStatus : TRUE 或 FALSE
161 ** \retval 无
162 **
163 ******************************************************************************/
Pca_ConfModulexIt(en_pca_module_t Modulex,boolean_t NewStatus)164 void Pca_ConfModulexIt(en_pca_module_t Modulex, boolean_t NewStatus)
165 {
166 switch(Modulex)
167 {
168 case PcaModule0:
169 SetBit((uint32_t)(&(M0P_PCA->CCAPM0)), 0, NewStatus);
170 break;
171 case PcaModule1:
172 SetBit((uint32_t)(&(M0P_PCA->CCAPM1)), 0, NewStatus);
173 break;
174 case PcaModule2:
175 SetBit((uint32_t)(&(M0P_PCA->CCAPM2)), 0, NewStatus);
176 break;
177 case PcaModule3:
178 SetBit((uint32_t)(&(M0P_PCA->CCAPM3)), 0, NewStatus);
179 break;
180 case PcaModule4:
181 SetBit((uint32_t)(&(M0P_PCA->CCAPM4)), 0, NewStatus);
182 break;
183 default:
184 break;
185 }
186 }
187
188 /**
189 ******************************************************************************
190 ** \brief PCA 模块0的初始化
191 ** @param InitStruct : PCA初始化配置的结构体
192 ** \retval 无
193 **
194 ******************************************************************************/
Pca_M0Init(stc_pcacfg_t * InitStruct)195 void Pca_M0Init(stc_pcacfg_t* InitStruct)
196 {
197 M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
198 M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
199 M0P_PCA->CCAPM0_f.ECOM = InitStruct->pca_ecom;
200 M0P_PCA->CCAPM0_f.CAPP = InitStruct->pca_capp;
201 M0P_PCA->CCAPM0_f.CAPN = InitStruct->pca_capn;
202 M0P_PCA->CCAPM0_f.MAT = InitStruct->pca_mat;
203 M0P_PCA->CCAPM0_f.TOG = InitStruct->pca_tog;
204 M0P_PCA->CCAPM0_f.PWM = InitStruct->pca_pwm;
205 M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
206 if(InitStruct->pca_pwm == PcaPwm8bitEnable)
207 {
208 M0P_PCA->CCAP0L_f.CCAP0 = InitStruct->pca_ccapl;
209 M0P_PCA->CCAP0H_f.CCAP0 = InitStruct->pca_ccaph;
210 }
211 else
212 {
213 M0P_PCA->CCAP0_f.CCAP0 = InitStruct->pca_ccap;
214 }
215 M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
216 }
217
218 /**
219 ******************************************************************************
220 ** \brief PCA 模块1的初始化
221 ** @param InitStruct : PCA初始化配置的结构体
222 ** \retval 无
223 **
224 ******************************************************************************/
Pca_M1Init(stc_pcacfg_t * InitStruct)225 void Pca_M1Init(stc_pcacfg_t* InitStruct)
226 {
227 M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
228 M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
229 M0P_PCA->CCAPM1_f.ECOM = InitStruct->pca_ecom;
230 M0P_PCA->CCAPM1_f.CAPP = InitStruct->pca_capp;
231 M0P_PCA->CCAPM1_f.CAPN = InitStruct->pca_capn;
232 M0P_PCA->CCAPM1_f.MAT = InitStruct->pca_mat;
233 M0P_PCA->CCAPM1_f.TOG = InitStruct->pca_tog;
234 M0P_PCA->CCAPM1_f.PWM = InitStruct->pca_pwm;
235 M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
236 if(InitStruct->pca_pwm == PcaPwm8bitEnable)
237 {
238 M0P_PCA->CCAP1L_f.CCAP1 = InitStruct->pca_ccapl;
239 M0P_PCA->CCAP1H_f.CCAP1 = InitStruct->pca_ccaph;
240 }
241 else
242 {
243 M0P_PCA->CCAP1_f.CCAP1 = InitStruct->pca_ccap;
244 }
245 M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
246 }
247
248 /**
249 ******************************************************************************
250 ** \brief PCA 模块2的初始化
251 ** @param InitStruct : PCA初始化配置的结构体
252 ** \retval 无
253 **
254 ******************************************************************************/
Pca_M2Init(stc_pcacfg_t * InitStruct)255 void Pca_M2Init(stc_pcacfg_t* InitStruct)
256 {
257 M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
258 M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
259 M0P_PCA->CCAPM2_f.ECOM = InitStruct->pca_ecom;
260 M0P_PCA->CCAPM2_f.CAPP = InitStruct->pca_capp;
261 M0P_PCA->CCAPM2_f.CAPN = InitStruct->pca_capn;
262 M0P_PCA->CCAPM2_f.MAT = InitStruct->pca_mat;
263 M0P_PCA->CCAPM2_f.TOG = InitStruct->pca_tog;
264 M0P_PCA->CCAPM2_f.PWM = InitStruct->pca_pwm;
265 M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
266 if(InitStruct->pca_pwm == PcaPwm8bitEnable)
267 {
268 M0P_PCA->CCAP2L_f.CCAP2 = InitStruct->pca_ccapl;
269 M0P_PCA->CCAP2H_f.CCAP2 = InitStruct->pca_ccaph;
270 }
271 else
272 {
273 M0P_PCA->CCAP2_f.CCAP2 = InitStruct->pca_ccap;
274 }
275 M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
276 }
277
278 /**
279 ******************************************************************************
280 ** \brief PCA 模块3的初始化
281 ** @param InitStruct : PCA初始化配置的结构体
282 ** \retval 无
283 **
284 ******************************************************************************/
Pca_M3Init(stc_pcacfg_t * InitStruct)285 void Pca_M3Init(stc_pcacfg_t* InitStruct)
286 {
287 M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
288 M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
289 M0P_PCA->CCAPM3_f.ECOM = InitStruct->pca_ecom;
290 M0P_PCA->CCAPM3_f.CAPP = InitStruct->pca_capp;
291 M0P_PCA->CCAPM3_f.CAPN = InitStruct->pca_capn;
292 M0P_PCA->CCAPM3_f.MAT = InitStruct->pca_mat;
293 M0P_PCA->CCAPM3_f.TOG = InitStruct->pca_tog;
294 M0P_PCA->CCAPM3_f.PWM = InitStruct->pca_pwm;
295 M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
296 if(InitStruct->pca_pwm == PcaPwm8bitEnable)
297 {
298 M0P_PCA->CCAP3L_f.CCAP3 = InitStruct->pca_ccapl;
299 M0P_PCA->CCAP3H_f.CCAP3 = InitStruct->pca_ccaph;
300 }
301 else
302 {
303 M0P_PCA->CCAP3_f.CCAP3 = InitStruct->pca_ccap;
304 }
305 M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
306 }
307
308 /**
309 ******************************************************************************
310 ** \brief PCA 模块4的初始化
311 ** @param InitStruct : PCA初始化配置的结构体
312 ** \retval 无
313 **
314 ******************************************************************************/
Pca_M4Init(stc_pcacfg_t * InitStruct)315 void Pca_M4Init(stc_pcacfg_t* InitStruct)
316 {
317 M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
318 M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
319 M0P_PCA->CCAPM4_f.ECOM = InitStruct->pca_ecom;
320 M0P_PCA->CCAPM4_f.CAPP = InitStruct->pca_capp;
321 M0P_PCA->CCAPM4_f.CAPN = InitStruct->pca_capn;
322 M0P_PCA->CCAPM4_f.MAT = InitStruct->pca_mat;
323 M0P_PCA->CCAPM4_f.TOG = InitStruct->pca_tog;
324 M0P_PCA->CCAPM4_f.PWM = InitStruct->pca_pwm;
325 M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
326 if(InitStruct->pca_pwm == PcaPwm8bitEnable)
327 {
328 M0P_PCA->CCAP4L_f.CCAP4 = InitStruct->pca_ccapl;
329 M0P_PCA->CCAP4H_f.CCAP4 = InitStruct->pca_ccaph;
330 }
331 else
332 {
333 M0P_PCA->CCAP4_f.CCAP4 = InitStruct->pca_ccap;
334 }
335 M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
336 }
337
338 /**
339 ******************************************************************************
340 ** \brief PCA 读取CNT寄存器的数值
341 ** @param 无
342 ** \retval CNT的低半字值
343 **
344 ******************************************************************************/
Pca_GetCnt(void)345 uint16_t Pca_GetCnt(void)
346 {
347 return (uint16_t)(M0P_PCA->CNT);
348 }
349
350 /**
351 ******************************************************************************
352 ** \brief PCA 向CNT寄存器写入数值
353 ** @param cnt : 所要写入的数值
354 ** \retval 无
355 **
356 ******************************************************************************/
Pca_SetCnt(uint16_t cnt)357 void Pca_SetCnt(uint16_t cnt)
358 {
359 if(GetBit((uint32_t)(&(M0P_PCA->CCON)), 6)==TRUE)
360 {
361 Pca_StartPca(FALSE);
362 M0P_PCA->CNT_f.CNT = cnt;
363 Pca_StartPca(TRUE);
364 }
365 else
366 {
367 M0P_PCA->CNT_f.CNT = cnt;
368 }
369
370 }
371
372 /**
373 ******************************************************************************
374 ** \brief PCA 返回指定通道比较高速输出标志寄存器的值
375 ** @param Modulex : 通道号x=0、1、2、3、4
376 ** \retval TRUE 或 FALSE
377 **
378 ******************************************************************************/
Pca_GetOut(en_pca_module_t Modulex)379 boolean_t Pca_GetOut(en_pca_module_t Modulex)
380 {
381 return GetBit((uint32_t)(&(M0P_PCA->CCAPO)), Modulex);
382 }
383
384 /**
385 ******************************************************************************
386 ** \brief PCA 设置比较捕获16位寄存器CCAPx数值
387 ** @param Modulex : 通道号x=0、1、2、3、4
388 ** @param Value: 所要设置的值
389 ** \retval 无
390 **
391 ******************************************************************************/
Pca_SetCcap(en_pca_module_t Modulex,uint16_t Value)392 void Pca_SetCcap(en_pca_module_t Modulex, uint16_t Value)
393 {
394 switch(Modulex)
395 {
396 case 0:
397 M0P_PCA->CCAP0_f.CCAP0 = Value;
398 break;
399 case 1:
400 M0P_PCA->CCAP1_f.CCAP1 = Value;
401 break;
402 case 2:
403 M0P_PCA->CCAP2_f.CCAP2 = Value;
404 break;
405 case 3:
406 M0P_PCA->CCAP3_f.CCAP3 = Value;
407 break;
408 case 4:
409 M0P_PCA->CCAP4_f.CCAP4 = Value;
410 break;
411 default:
412 break;
413 }
414 }
415
416 /**
417 ******************************************************************************
418 ** \brief PCA 读取比较捕获16位寄存器CCAPx数值
419 ** @param Modulex : 通道号x=0、1、2、3、4
420 ** \retval CCAPx的值,x=0、1、2、3、4
421 **
422 ******************************************************************************/
Pca_GetCcap(en_pca_module_t Modulex)423 uint16_t Pca_GetCcap(en_pca_module_t Modulex)
424 {
425 uint16_t tmp;
426 switch(Modulex)
427 {
428 case 0:
429 tmp = M0P_PCA->CCAP0_f.CCAP0;
430 break;
431 case 1:
432 tmp = M0P_PCA->CCAP1_f.CCAP1;
433 break;
434 case 2:
435 tmp = M0P_PCA->CCAP2_f.CCAP2;
436 break;
437 case 3:
438 tmp = M0P_PCA->CCAP3_f.CCAP3;
439 break;
440 case 4:
441 tmp = M0P_PCA->CCAP4_f.CCAP4;
442 break;
443 default:
444 break;
445 }
446 return tmp;
447 }
448
449 /**
450 ******************************************************************************
451 ** \brief PCA 设置自动重装载寄存器数值
452 ** @param 无
453 ** \retval 无
454 **
455 ******************************************************************************/
Pca_SetCarr(uint16_t Value)456 void Pca_SetCarr(uint16_t Value)
457 {
458 M0P_PCA->CARR_f.CARR = Value;
459 }
460
461 /**
462 ******************************************************************************
463 ** \brief PCA 获取自动重装载寄存器数值
464 ** @param 无
465 ** \retval 无
466 **
467 ******************************************************************************/
Pca_GetCarr(void)468 uint16_t Pca_GetCarr(void)
469 {
470 return M0P_PCA->CARR_f.CARR;
471 }
472
473 /**
474 ******************************************************************************
475 ** \brief PCA 设置比较捕获寄存器的高8位和低8位
476 ** @param Modulex : 通道号x=0、1、2、3、4
477 ** @param ValueH : 要写入高8位的数值
478 ** @param ValueL : 要写入低8位的数值
479 ** \retval 无
480 **
481 ******************************************************************************/
Pca_SetCcapHL(en_pca_module_t Modulex,uint8_t ValueH,uint8_t ValueL)482 void Pca_SetCcapHL(en_pca_module_t Modulex, uint8_t ValueH, uint8_t ValueL)
483 {
484 switch(Modulex)
485 {
486 case 0:
487 M0P_PCA->CCAP0H_f.CCAP0 = ValueH;
488 M0P_PCA->CCAP0L_f.CCAP0 = ValueL;
489 break;
490 case 1:
491 M0P_PCA->CCAP1H_f.CCAP1 = ValueH;
492 M0P_PCA->CCAP1L_f.CCAP1 = ValueL;
493 break;
494 case 2:
495 M0P_PCA->CCAP2H_f.CCAP2 = ValueH;
496 M0P_PCA->CCAP2L_f.CCAP2 = ValueL;
497 break;
498 case 3:
499 M0P_PCA->CCAP3H_f.CCAP3 = ValueH;
500 M0P_PCA->CCAP3L_f.CCAP3 = ValueL;
501 break;
502 case 4:
503 M0P_PCA->CCAP4H_f.CCAP4 = ValueH;
504 M0P_PCA->CCAP4L_f.CCAP4 = ValueL;
505 break;
506 default:
507 break;
508 }
509 }
510
511 /**
512 ******************************************************************************
513 ** \brief PCA 读取比较捕获寄存器的高8位和低8位
514 ** @param Modulex : 通道号x=0、1、2、3、4
515 ** @param ValueH : CCAPx高8位的数值
516 ** @param ValueL : CCAPx低8位的数值
517 ** \retval 无
518 **
519 ******************************************************************************/
Pca_GetCcapHL(en_pca_module_t Modulex,uint8_t * ValueH,uint8_t * ValueL)520 void Pca_GetCcapHL(en_pca_module_t Modulex, uint8_t *ValueH, uint8_t *ValueL)
521 {
522 switch(Modulex)
523 {
524 case 0:
525 *ValueH = M0P_PCA->CCAP0H_f.CCAP0;
526 *ValueL = M0P_PCA->CCAP0L_f.CCAP0;
527 break;
528 case 1:
529 *ValueH = M0P_PCA->CCAP1H_f.CCAP1;
530 *ValueL = M0P_PCA->CCAP1L_f.CCAP1;
531 break;
532 case 2:
533 *ValueH = M0P_PCA->CCAP2H_f.CCAP2;
534 *ValueL = M0P_PCA->CCAP2L_f.CCAP2;
535 break;
536 case 3:
537 *ValueH = M0P_PCA->CCAP3H_f.CCAP3;
538 *ValueL = M0P_PCA->CCAP3L_f.CCAP3;
539 break;
540 case 4:
541 *ValueH = M0P_PCA->CCAP4H_f.CCAP4;
542 *ValueL = M0P_PCA->CCAP4L_f.CCAP4;
543 break;
544 default:
545 break;
546 }
547 }
548 /******************************************************************************
549 * EOF (not truncated)
550 ******************************************************************************/
551
552
553
554
555
556