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 pcnt.h
44  **
45  ** Headerfile for PCNT functions
46  ** @link PCNT Group Some description @endlink
47  **
48  ** History:
49  **   - 2019-04-08        First Version
50  **
51  ******************************************************************************/
52 
53 #ifndef __PCNT_H__
54 #define __PCNT_H__
55 
56 /*******************************************************************************
57  * Include files
58  ******************************************************************************/
59 #include "ddl.h"
60 
61 #ifdef __cplusplus
62 extern "C"
63 {
64 #endif
65 
66 /**
67  ******************************************************************************
68  ** \defgroup PCNTGroup  (PCNT)
69   **
70  ******************************************************************************/
71 //@{
72 
73 /**
74  *******************************************************************************
75  ** function prototypes.
76  ******************************************************************************/
77 
78 
79 /**
80  *******************************************************************************
81  ** \brief PCNT S0通道极性选择
82  ** \note           PCNT_CTRL  S0P
83  ******************************************************************************/
84 typedef enum
85 {
86     PcntS0PNoinvert = 0u, //  S0通道极性不取反
87     PcntS0PInvert   = 1u  //  S0通道极性取反
88 }en_pcnt_s0polar_t;
89 
90 /**
91  *******************************************************************************
92  ** \brief PCNT S1通道极性选择
93  ** \note           PCNT_CTRL  S1P
94  ******************************************************************************/
95 typedef enum
96 {
97     PcntS1PNoinvert = 0u, //  S1通道极性不取反
98     PcntS1PInvert   = 1u  //  S1通道极性取反
99 }en_pcnt_s1polar_t;
100 
101 /**
102  *******************************************************************************
103  ** \brief PCNT 计数方向选择
104  ** \note           PCNT_CTRL  DIR
105  ******************************************************************************/
106 typedef enum
107 {
108     PcntNDoubleDirAdd  = 0u, //  加计数
109     PcntNDoubleDirSub  = 1u  //  减计数
110 }en_pcnt_dir_t;
111 
112 /**
113  *******************************************************************************
114  ** \brief PCNT 计数时钟选择
115  ** \note           PCNT_CTRL  ClkSel
116  ******************************************************************************/
117 typedef enum
118 {
119     PcntCLKPclk   = 1u, //  PCLK
120     PcntCLKXtl    = 2u, //  XTL
121     PcntCLKRcl    = 3u  //  RCL
122 }en_pcnt_clksel_t;
123 
124 /**
125  *******************************************************************************
126  ** \brief PCNT 脉冲计数模式选择
127  ** \note           PCNT_CTRL  Mode
128  ******************************************************************************/
129 typedef enum
130 {
131     PcntSingleMode   = 1u, // 单通道脉冲计数模式
132     PcntSpecialMode  = 2u, // 双通道非正交脉冲计数模式
133     PcntDoubleMode   = 3u  // 双通道正交脉冲计数模式
134 }en_pcnt_mode_t;
135 
136 /**
137  ******************************************************************************
138  ** \brief PCNT 状态
139  ** \note           PCNT_IFR  & PCNT_ICR  &  PCNT_IEN
140  *****************************************************************************/
141 typedef enum
142 {
143     PcntS1E            = 7,   // S1通道脉冲解码错误
144     PcntS0E            = 6,   // S0通道脉冲解码错误
145     PcntBB             = 5,   // 脉冲解码错误
146     PcntFE             = 4,   // 采样周期脉冲解码错误
147     PcntDIR            = 3,   // 反向改变中断
148     PcntTO             = 2,   // 超时中断标识
149     PcntOV             = 1,   // 上溢中断标识
150     PcntUF             = 0,   // 下溢中断标识
151 }en_pcnt_itfce_t;
152 
153 /**
154  ******************************************************************************
155  ** \brief PCNT 状态寄存器1   PCNT_SR1
156  ** \note           PCNT_SR1 : DIR
157  *****************************************************************************/
158 typedef enum
159 {
160     PcntDoubleDirAdd = 0,     //  双通道正交脉冲加计数
161     PcntDoubleDirSub = 1      //  双通道正交脉冲加计数
162 }en_pcnt_sr1dir_t;
163 
164 /**
165  ******************************************************************************
166  ** \brief PCNT 观测输出选择寄存器   PCNT_DBG
167  ** \note           PCNT_DBG: DBG
168  *****************************************************************************/
169 typedef enum
170 {
171     PcntDBGZero = 0,     //  固定为0
172     PcntDBGSxA  = 1,     //  脉冲同步之后通过S0A/S1A输出
173     PcntDBGSxP  = 2,     //  脉冲极性选择之后通过S0P/S1P输出
174     PcntDBGSxPF = 3      //  脉冲滤波之后通过S0PF/S1PF输出
175 }en_pcnt_dbg_t;
176 
177 typedef enum
178 {
179     PcntDirUp   = 0,   //加计数
180     PcntDirDown = 1    //减计数
181 }en_pent_dir_t;
182 /**
183  ******************************************************************************
184  ** \brief PCNT 整体配置结构体
185  *****************************************************************************/
186 typedef struct stc_pcnt_cfg
187 {
188     en_pcnt_s0polar_t   Pcnt_S0Sel;         //  S0通道极性选择
189     en_pcnt_s1polar_t   Pcnt_S1Sel;         //  S1通道极性选择
190     en_pcnt_clksel_t    Pcnt_Clk;           //  计数时钟选择
191     en_pcnt_mode_t      Pcnt_Mode;          //  脉冲计数模式选择
192     boolean_t           Pcnt_FltEn;         //  脉冲宽度滤波器使能控制  PCNT_FLT: EN
193     uint8_t             Pcnt_DebTop;        //  计数器阀值   PCNT_FLT: DebTop
194     uint16_t            Pcnt_ClkDiv;        //  滤波时钟分频系数  PCNT_FLT: ClkDiv
195     boolean_t           Pcnt_TocrEn;        //  超时功能使能控制位    PCNT_TOCR  : EN
196     uint16_t            Pcnt_TocrTh;        //  超时阈值      PCNT_TOCR  :  TH
197     en_pcnt_dbg_t       Pcnt_Dbg;           //  观测输出选择寄存器   PCNT_DBG
198     en_pent_dir_t       Pcnt_Dir;
199 }stc_pcnt_initstruct_t;
200 
201 
202 /******************************************************************************
203  * Global variable declarations ('extern', definition in C source)
204  ******************************************************************************/
205 
206 /******************************************************************************
207  * Global function prototypes (definition in C source)
208  ******************************************************************************/
209 extern boolean_t Pcnt_Cmd(boolean_t NewState);
210 extern en_result_t Pcnt_SetB2T(uint16_t value);
211 extern en_result_t Pcnt_SetB2C(uint16_t value);
212 extern en_result_t Pcnt_SetT2C(void);
213 extern void Pcnt_Init(stc_pcnt_initstruct_t*  InitStruct);
214 extern void Pcnt_ItCfg(en_pcnt_itfce_t IT_Src, boolean_t NewState);
215 extern boolean_t Pcnt_GetItStatus(en_pcnt_itfce_t IT_Src);
216 extern void Pcnt_ClrItStatus(en_pcnt_itfce_t IT_Src);
217 extern uint16_t Pcnt_GetCnt(void);
218 extern uint16_t Pcnt_GetTop(void);
219 extern uint16_t Pcnt_GetBuf(void);
220 extern void Pcnt_SetCnt(uint16_t value);
221 extern void Pcnt_SetBuf(uint16_t value);
222 extern void Pcnt_SetTop(uint16_t value);
223 //@} // PCNT Group
224 
225 #ifdef __cplusplus
226 #endif
227 
228 #endif /* __PCNT_H__ */
229 /*******************************************************************************
230  * EOF (not truncated)
231  ******************************************************************************/
232 
233 
234