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